证书申请的核心是CSR生成和域名验证,安装环节要区分服务器类型,Nginx的证书合并操作容易被忽略,而Apache需要提醒启用mod_ssl模块。因此SSL证书的申请和安装是一个涉及多个步骤的过程,我为你详细写一下全过程,并区分了不同服务器环境(Nginx/Apache/云服务),能帮客户顺利完成配置:
一、 准备阶段 (Pre-Application)
确定需求:
证书类型:
DV (域名验证): 仅验证域名所有权。适合个人网站、博客、小型项目。签发最快(几分钟-几小时)。
OV (组织验证): 验证域名所有权及申请组织的真实性和合法性。适合企业官网、中小型电商。签发需数天。
EV (扩展验证): 最高级别验证,浏览器地址栏会显示绿色公司名称。适合大型企业、金融机构、电商平台。签发最严格,时间最长(数天-数周)。
域名数量:
单域名: 保护一个具体域名(例如 www.example.com 或 example.com)。
多域名/SAN: 一张证书保护多个不同的域名(例如 example.com, www.example.com, shop.example.com, another-domain.net)。
通配符: 保护一个域名及其所有同级子域名(例如 *.example.com 保护 www.example.com, mail.example.com, app.example.com 等,但不保护 example.com 本身,通常需要单独申请或包含)。
证书有效期: 目前标准有效期均为 90天(ACME协议如Let's Encrypt强制要求)。商业证书通常提供多年购买,但实际签发的是每90天续期的证书(由证书管理平台自动处理)。
证书颁发机构: 选择受主流浏览器和操作系统信任的CA(如:Let's Encrypt (免费), DigiCert, Sectigo, GlobalSign, Entrust等)。
生成CSR和私钥:
CSR: 证书签名请求文件。包含你的公钥、申请信息(域名、组织信息 - OV/EV需要、所在地等)。非常重要:确保信息准确!
私钥: 与CSR中的公钥配对的私钥。极其重要:必须安全保管,切勿泄露! 它是证明你服务器身份的唯一凭证。
生成方式:
服务器命令行生成(推荐): (以Linux为例)
bash
生成私钥(通常使用RSA 2048位或ECC,ECC更高效安全但兼容性略低)
openssl genrsa -out server.key 2048 # RSA
或
openssl ecparam -genkey -name prime256v1 -out server.key # ECC (prime256v1常用)
使用私钥生成CSR
openssl req -new -key server.key -out server.csr
执行命令后会交互式询问信息(国家、省/州、城市、组织名称、组织单位、通用名称Common Name(即主域名)、邮箱等)。
关键点: Common Name (CN) 必须是要保护的主域名(例如 www.example.com 或 example.com)。对于SAN或通配符证书,后续在CA平台申请时需要额外指定。
服务器控制面板生成: (如 cPanel, Plesk, Webmin) 通常在SSL/TLS管理界面有生成CSR的选项。
在线工具生成: 一些CA或第三方网站提供在线CSR生成器(不推荐: 私钥在网络传输和浏览器缓存中存在泄露风险)。
准备域名验证:
CA需要验证你拥有该域名。常用验证方式:
DNS验证: 在域名的DNS管理后台添加CA指定的特定TXT记录。最推荐的方式,通常最灵活。
HTTP文件验证: 在网站根目录(例如 /.well-known/pki-validation/)放置CA指定的特定名称和内容的文本文件。
邮箱验证: 向域名WHOIS信息中的管理员邮箱(如 admin@example.com, administrator@example.com 等)发送验证邮件。较少用。
选择你方便操作的方式。
二、 申请阶段 (Application)
选择CA并购买/选择证书:
访问所选CA的官方网站。
根据准备阶段确定的需求(类型、域名数量、有效期)选择合适的产品。如果是免费证书(如Let's Encrypt),则进入其ACME客户端流程(如Certbot)。
完成购买流程(免费证书跳过此步)。
提交CSR:
在CA的用户管理平台中,找到证书申请入口。
将之前生成的 server.csr 文件内容(文本编辑器打开,复制-----BEGIN CERTIFICATE REQUEST----- 和 -----END CERTIFICATE REQUEST----- 之间的所有文本)粘贴到指定位置。
填写其他必要信息:
技术联系人信息。
对于OV/EV证书: 需要提交详细、真实且可验证的组织信息(营业执照等),CA会进行人工审核。
对于SAN证书: 在此处添加所有需要包含的额外域名(Subject Alternative Names)。
对于通配符证书: 指定通配符域名(*.example.com)。
选择你在准备阶段确定的域名验证方式(DNS / HTTP / Email)。
完成域名验证:
根据你选择的验证方式进行操作:
DNS验证:
CA会提供一个唯一的主机名(Name/Host)和一个值(Value/Record)(通常是TXT记录)。
登录你的域名注册商或DNS托管商的管理控制台。
为你的域名添加一条TXT记录。
主机名: 填写CA提供的主机名(可能形如 _acme-challenge 或 @ 或 _dnsauth 等)。
值/记录/目标: 粘贴CA提供的长字符串值。
保存更改。 DNS记录传播需要时间(几分钟到几小时不等)。
HTTP文件验证:
CA会提供一个唯一的文件名和文件内容。
在你的Web服务器上创建指定的目录路径(通常是 /.well-known/pki-validation/)。
在该目录下创建CA指定的文件名,并将文件内容完整粘贴进去。
确保该文件可以通过 http://yourdomain.com/.well-known/pki-validation/指定文件名 公开访问(暂时无需HTTPS)。
邮箱验证: 检查指定邮箱,点击CA发送的验证邮件中的链接。
在CA平台上启动验证或等待CA自动检测。
组织验证(仅限OV/EV证书):
CA的验证团队会联系你提交的组织联系人(通常是电话或邮件),核实组织信息的真实性。按要求提供所需文件(营业执照扫描件、组织授权信等)。
签发证书:
DV证书: 域名验证通过后,通常几分钟到几小时内自动签发。
OV证书: 域名和组织验证都通过后签发,通常需要1-5个工作日。
EV证书: 审核最严格,验证通过后签发,通常需要5-7个工作日或更长。
证书签发后,CA会通过邮件通知你,并在其用户管理平台提供证书下载。
三、 下载与获取证书文件
登录CA的用户管理平台,找到已签发的证书。
下载证书文件包:
CA通常会提供多种格式(PEM, CRT, CER, P7B, PFX等)。
对于Nginx, Apache等服务器,最常用的是PEM格式或包含PEM链的包。
获取必要的文件:
服务器证书: 包含你的域名和公钥的文件(通常命名为 yourdomain.crt, certificate.crt, 或包含在 .pem 文件中)。
中间证书链: 这是连接你的服务器证书和根证书的中间CA证书。至关重要! 缺少或错误的链会导致浏览器显示"不受信任"警告。CA通常会提供一个单独的链文件(ca_bundle.crt, intermediate.crt)或在你下载的服务器证书文件中已包含链(称为Fullchain或Bundle)。
私钥: 这是你在第一步生成并安全保管的 server.key 文件。CA不提供此文件。
根证书: 通常内置于操作系统和浏览器中,无需单独安装(除非非常老的系统)。
四、 安装阶段 (Installation) - 根据服务器类型
重要:安装前备份相关配置文件!
1. Nginx 安装
将以下文件上传到服务器(通常在 /etc/nginx/ssl/ 或 /usr/local/nginx/conf/ssl/ 目录):
你的服务器证书文件(例如 yourdomain.crt)
中间证书链文件(例如 ca_bundle.crt)
你的私钥文件(server.key)
合并服务器证书和中间证书链(可选但推荐):
bash
cat yourdomain.crt ca_bundle.crt > fullchain.pem
这将创建一个包含完整证书链的 fullchain.pem 文件。
编辑Nginx的虚拟主机配置文件(通常在 /etc/nginx/sites-available/yourdomain.conf 或 /etc/nginx/conf.d/yourdomain.conf)。
找到监听443端口的 server 块,配置SSL:
nginx
server {
listen 443 ssl http2; # 启用HTTP/2
listen [::]:443 ssl http2; # IPv6
server_name yourdomain.com www.yourdomain.com;
SSL 证书和密钥路径
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 使用合并后的完整链文件
或者分开指定(不推荐,易出错):
ssl_certificate /etc/nginx/ssl/yourdomain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_certificate_key /etc/nginx/ssl/server.key;
强化的SSL配置 (推荐)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧的不安全协议
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # 强密码套件
ssl_ecdh_curve secp384r1; # 强ECDH曲线
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # 更安全
ssl_stapling on; # OCSP装订
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # 用于OCSP验证的DNS解析器
resolver_timeout 5s;
HSTS (强制浏览器使用HTTPS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
... 你的其他配置(根目录root, index等)...
}
(强烈推荐)配置HTTP到HTTPS的重定向:
添加一个新的 server 块监听80端口,将HTTP请求重定向到HTTPS:
nginx
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri; # 永久重定向到HTTPS
}
测试Nginx配置语法:
bash
sudo nginx -t
如果测试通过,重新加载Nginx配置:
bash
sudo systemctl reload nginx # 或 sudo service nginx reload 或 sudo nginx -s reload
2. Apache 安装
将以下文件上传到服务器(通常在 /etc/apache2/ssl/ 或 /etc/httpd/ssl/ 目录):
你的服务器证书文件(例如 yourdomain.crt)
中间证书链文件(例如 ca_bundle.crt)
你的私钥文件(server.key)
确保Apache的 mod_ssl 模块已启用:
bash
sudo a2enmod ssl # Debian/Ubuntu
或
在httpd.conf/ssl.conf中确保有 `LoadModule ssl_module modules/mod_ssl.so` (RHEL/CentOS)
编辑Apache的虚拟主机配置文件(通常在 /etc/apache2/sites-available/yourdomain-ssl.conf 或 /etc/httpd/conf.d/ssl.conf)。
配置SSL虚拟主机:
apache
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/www/yourdomain
SSL 配置
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/yourdomain.crt # 服务器证书
SSLCertificateKeyFile /etc/apache2/ssl/server.key # 私钥
SSLCertificateChainFile /etc/apache2/ssl/ca_bundle.crt # 中间证书链(重要!)
强化的SSL配置 (推荐)
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # 仅允许 TLSv1.2+
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
... 你的其他配置(如日志、目录设置等)...
</VirtualHost>
(强烈推荐)配置HTTP到HTTPS的重定向:
编辑主HTTP虚拟主机配置文件(通常是 /etc/apache2/sites-available/000-default.conf 或 /etc/httpd/conf/httpd.conf 中的默认虚拟主机):
apache
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
# 重定向所有HTTP请求到HTTPS
Redirect permanent / https://yourdomain.com/
# 或者使用更灵活的RewriteRule:
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
测试Apache配置语法:
bash
sudo apachectl configtest # 或 sudo httpd -t
如果测试通过,重新启动Apache:
bash
sudo systemctl restart apache2 # Debian/Ubuntu
sudo systemctl restart httpd # RHEL/CentOS
3. 云服务器/负载均衡器/托管平台安装
AWS Certificate Manager (ACM):
在ACM中申请或导入证书(导入需提供证书和私钥)。
将证书关联到支持的AWS服务(如:ELB/ALB/NLB, CloudFront, API Gateway)。
在服务配置中选择该ACM证书。无需在EC2实例上手动安装证书。AWS会自动处理证书部署、续订和终止。
Azure App Service / Azure Front Door / Azure Load Balancer:
在App Service的"TLS/SSL设置"中上传PFX证书(需包含私钥)或使用App Service托管证书(自动管理Let's Encrypt)。
或使用Azure Key Vault存储证书。
在资源配置中绑定证书。
Google Cloud Load Balancing / Google Cloud Run:
在"网络服务">"负载均衡"中创建或编辑负载均衡器。
在"前端配置"中,选择HTTPS协议,然后点击"创建或选择证书"。
可以上传PEM格式的证书和私钥,或选择Google管理的证书(自动续订)。
cPanel / Plesk / Webmin 等控制面板:
登录控制面板。
找到"SSL/TLS"或"安全"管理区域。
选择"安装SSL证书"或类似选项。
通常提供三个输入框:
证书 (CRT): 粘贴你的服务器证书内容(包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)。
私钥 (KEY): 粘贴你的私钥内容(包括 -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY-----)
CA包/中间证书 (CABUNDLE): 粘贴中间证书链的内容(通常包含多个-----BEGIN CERTIFICATE-----块)
点击安装/保存。面板会自动配置Apache。
通常也有选项强制HTTPS重定向。
五、 验证与测试
访问网站: 使用 https://yourdomain.com 访问你的网站。浏览器地址栏应显示锁形图标。
点击锁图标: 检查证书信息(颁发给、颁发者、有效期)是否正确。
在线SSL检查工具: 使用以下工具进行深度扫描,检查配置是否正确、安全评分、是否包含完整证书链、支持的协议和密码套件等:
Qualys SSL Labs: https://www.ssllabs.com/ssltest/analyze.html?d=yourdomain.com
ImmuniWeb SSL Test: https://www.immuniweb.com/ssl/
GFI Sertifi'ed: https://certification.gfi.com/
关键检查项:
Certificate is Trusted: 证书受信任。
Certificate Matches Domain: 证书域名匹配。
Complete Certificate Chain: 证书链完整无缺失。
Strong Protocol Support (TLS 1.2, 1.3): 支持强协议。
Strong Cipher Suites: 使用强密码套件。
OCSP Stapling: 已启用。
HSTS: 已配置(推荐)。
No Vulnerabilities (e.g., POODLE, Heartbleed): 无已知漏洞。
检查重定向: 确保访问 http://yourdomain.com 能正确、永久地(301)重定向到 https://yourdomain.com。
六、 维护与续期
监控有效期: SSL证书会过期(90天)。过期后浏览器会显示严重警告,网站无法访问。
设置续期提醒: 在日历或任务管理工具中设置多个提醒(到期前1个月、2周、1周)。
续期流程:
商业证书: 登录CA平台,找到即将过期的证书,通常有"续费"或"重新颁发"选项。流程与首次申请类似(可能需要重新生成CSR,但CA通常允许重用旧CSR或生成新CSR;需要重新进行域名验证)。
Let's Encrypt (ACME): 使用ACME客户端(如Certbot)自动化续期是核心优势。配置好定时任务(cron job):
bash
示例:每月1号和15号凌晨3点尝试续期所有证书
0 3 */15 * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
--quiet 静默模式。
--post-hook 续期成功后重新加载Web服务器配置(重要!)。
私钥轮换(可选但推荐): 定期(如每年)重新生成新的私钥和CSR,申请新证书替换旧证书,增强安全性。
吊销证书: 如果私钥丢失或泄露,立即登录CA平台吊销该证书!防止被滥用。
常见问题与故障排除
浏览器警告"此网站的安全证书存在问题" / "NET::ERR_CERT_AUTHORITY_INVALID":
最常见原因:缺少中间证书链或链配置错误。 确保服务器配置正确加载了完整的中间链文件(使用fullchain.pem或正确指定SSLCertificateChainFile/ssl_certificate包含链)。
用SSL Labs测试工具检查"Chain Issues"部分。
浏览器警告"此证书仅对以下名称有效:...":
访问的域名与证书中的Common Name (CN)或Subject Alternative Name (SAN)列表不匹配。检查证书包含的域名是否正确。
私钥不匹配:
服务器配置中指定的私钥文件不是当初生成CSR时对应的那个私钥。重新检查文件路径和内容。
混合内容警告:
网页通过HTTPS加载,但页面中包含的资源(图片、JS、CSS)是通过HTTP加载的。浏览器会认为不安全。解决:将所有资源链接改为https:// 或使用协议相对路径 //。
HSTS问题:
如果之前配置了HSTS且max-age很大,在证书过期或配置错误后,浏览器会强制拒绝连接(即使你暂时想用HTTP)。解决方法复杂(需清除浏览器HSTS缓存或在有效期内提供有效证书)。
续期失败 (Let's Encrypt):
检查ACME客户端日志(通常 /var/log/letsencrypt/)。
常见原因:域名解析失败、80/443端口被防火墙阻止、.well-known目录不可访问、验证失败次数超限(有频率限制)。
SSL证书类型对比表
特性 DV (域名验证) OV (组织验证) EV (扩展验证)
验证强度 仅验证域名所有权 验证域名+组织真实性 最高级别验证,包括组织法律存在
签发速度 几分钟至几小时 1-5个工作日 5-7个工作日或更长
显示效果 地址栏显示锁标志 地址栏显示锁标志 地址栏显示绿色公司名称
适用场景 个人博客、小型网站 企业官网、中小型电商 银行、金融、大型电商平台
价格 免费或低价 中等 较高
信任度 基础信任 较高信任度 最高信任度
总结一下全过程
遵循这些步骤并仔细操作,你就能成功为网站部署SSL证书。关键点在于:准确生成CSR、妥善保管私钥、正确完成域名验证、安装时配置完整证书链、启用HTTP到HTTPS的重定向、设置自动化续期。 定期使用SSL检查工具扫描能帮你维持最佳安全状态。
部署成功后,你的用户数据将得到加密保护,同时提升网站可信度和SEO表现!如果遇到问题,查看服务器日志和在线SSL检测报告通常能找到解决方案。