HTTPS 证书配置完全指南:从申请到自动化续期
前言:为什么需要 HTTPS?
在当今互联网环境下,HTTPS 已经不是可选项,而是必选项。浏览器会将 HTTP 网站标记为“不安全”,影响用户信任;搜索引擎也会给予 HTTPS 网站更高的排名权重。更重要的是,HTTPS 能保护用户数据不被窃听、篡改,防止中间人攻击。
本文将全面介绍 HTTPS 证书的配置方案,涵盖从证书申请、部署到自动化续期的完整流程。
一、HTTPS 证书类型选择
在开始配置之前,首先需要了解不同类型的证书及其适用场景。
| 证书类型 | 验证级别 | 适用场景 | 典型获取成本 |
|---|---|---|---|
| DV(域名验证) | 仅验证域名所有权 | 个人博客、测试环境 | 免费(如 Let's Encrypt) |
| OV(组织验证) | 验证企业身份 | 企业官网、商业网站 | 几百元/年 |
| EV(扩展验证) | 严格法律验证 | 银行、支付、大型电商 | 上千元/年 |
| 通配符证书 | 覆盖 *.domain.com | 多子域名场景 | 数百至数千元 |
推荐方案:
个人/小型项目:Let's Encrypt 免费 DV 证书+ 自动化续期
企业官网:OV 证书,建立用户信任
多子域名场景:通配符证书,单证书覆盖所有子域
二、免费方案:Let's Encrypt + Certbot
Let's Encrypt 是目前最主流的免费证书颁发机构,由 Linux 基金会、Google、Mozilla 等共同支持,证书有效期 90 天,支持自动化续期。
2.1 环境准备
bash
# Ubuntu/Debian 系统 sudo apt update sudo apt install certbot python3-certbot-nginx # Nginx 版本 # 或 sudo apt install certbot python3-certbot-apache # Apache 版本 # CentOS/RHEL sudo dnf install certbot python3-certbot-nginx # macOS brew install certbot
2.2 获取证书
方式一:自动配置(推荐,适用于标准配置)
bash
# Nginx 自动配置 sudo certbot --nginx -d example.com -d www.example.com # Apache 自动配置 sudo certbot --apache -d example.com -d www.example.com
Certbot 会自动:
验证域名所有权
获取证书
自动修改 Web 服务器配置启用 HTTPS
配置自动续期 cronjob
方式二:手动获取证书(适用于非标准环境)
bash
# 仅获取证书,不自动配置 sudo certbot certonly --standalone -d example.com -d www.example.com
证书将保存在:
/etc/letsencrypt/live/example.com/fullchain.pem(证书链)/etc/letsencrypt/live/example.com/privkey.pem(私钥)
2.3 手动配置 Web 服务器
Nginx 配置示例
nginx
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; # 证书路径 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 安全增强配置(重要!) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; # HSTS - 强制浏览器使用 HTTPS add_header Strict-Transport-Security "max-age=63072000" always; # 其他安全头 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; root /var/www/html; index index.html; } # HTTP 重定向到 HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; }Apache 配置示例
apache
<VirtualHost *:443> ServerName example.com ServerAlias www.example.com SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # 安全配置 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 SSLCompression off DocumentRoot /var/www/html </VirtualHost> <VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost>
2.4 自动化续期
Let's Encrypt 证书有效期 90 天,必须自动续期。Certbot 安装时会自动添加 cronjob:
bash
# 测试续期是否正常 sudo certbot renew --dry-run # 手动执行续期 sudo certbot renew # 查看续期定时任务 systemctl list-timers | grep certbot # 或 crontab -l
默认续期脚本位置:
/etc/cron.d/certbot/etc/systemd/system/certbot.timer
三、商业证书部署方案
对于企业场景,通常会购买商业证书(如 DigiCert、Sectigo、GlobalSign)。商业证书有效期通常为 1-2 年,验证流程更严格。
3.1 获取商业证书后的文件
一般会提供以下几个文件:
server.crt- 服务器证书intermediate.crt- 中间证书ca_bundle.crt- 根证书链server.key- 私钥(自己生成并保管)
3.2 合并证书链
很多 Web 服务器需要完整的证书链文件:
bash
# 合并服务器证书和中间证书 cat server.crt intermediate.crt ca_bundle.crt > fullchain.pem # 确保私钥权限安全 chmod 600 server.key chmod 644 fullchain.pem
3.3 Nginx 配置商业证书
nginx
server { listen 443 ssl http2; server_name example.com; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/server.key; # 其余配置同免费方案 }四、高级配置方案
4.1 通配符证书配置
通配符证书允许一个证书覆盖主域名及其所有一级子域名,例如*.example.com可覆盖www.example.com、api.example.com、blog.example.com。
通过 DNS 验证获取通配符证书(Let's Encrypt):
bash
# 使用 DNS 验证模式 sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
脚本会提示添加一条 TXT 记录到 DNS。验证通过后即可获取通配符证书。
手动配置通配符证书时无需特殊配置,Nginx 中正常配置即可:
nginx
server { server_name ~^(?<sub>.+)\.example\.com$; # 或使用通配符 server_name *.example.com; }4.2 CDN 场景下的证书配置
当网站使用 CDN(CloudFlare、阿里云 CDN、CloudFront 等)时,需要考虑信任链问题:
方案一:源站自签名证书 + CDN 边缘证书
CDN 边缘使用正式证书
源站到 CDN 之间使用自签名证书
方案二:源站部署正式证书
更安全,推荐使用
Let's Encrypt 证书即可
CloudFlare 特别方案:
CloudFlare 提供 15 年有效期的源站证书,可在 CDN 后台生成并安装到源站:
nginx
# CloudFlare 源站证书配置 ssl_certificate /etc/nginx/ssl/origin-pull.pem; ssl_certificate_key /etc/nginx/ssl/origin-pull.key; # 限制仅允许 CloudFlare IP 访问源站(可选) allow 173.245.48.0/20; allow 103.21.244.0/22; # ... 添加所有 CloudFlare IP 段 deny all;
4.3 内部网络证书(自签名 CA)
内网环境可以使用自签名 CA 签发证书,避免浏览器警告(需将 CA 证书导入客户端)。
bash
# 生成 CA 私钥 openssl genrsa -out ca.key 4096 # 生成 CA 证书(有效期 10 年) openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt # 为内网域名生成证书签名请求 openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr # 使用 CA 签发证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ -CAcreateserial -out server.crt -days 365 -sha256
五、安全配置最佳实践
5.1 SSL/TLS 安全基准配置
nginx
# 推荐的安全配置(Nginx) ssl_protocols TLSv1.2 TLSv1.3; # 禁用 TLS 1.0/1.1 ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers off; # 允许客户端选择更优密码套件(TLSv1.3 要求) ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # OCSP Stapling(提升握手速度) ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
5.2 使用 SSL Labs 测试
配置完成后,务必使用 SSL Labs 进行 A+ 评级测试:
bash
# 也可使用命令行工具快速检查 openssl s_client -connect example.com:443 -tls1_2
5.3 定期检查证书过期
bash
# 检查证书过期时间 echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates # 设置监控告警(通过监控系统) # Prometheus + blackbox_exporter 可配置证书过期告警
六、常见问题与故障排查
Q1:证书申请失败:“Challenge failed for domain”
可能原因及解决:
DNS 解析延迟:使用 DNS 验证时,等待几分钟再试
HTTP 验证时端口 80 被占用:
--standalone模式需要 80/443 端口防火墙阻挡:确保 80/443 端口可访问
Q2:浏览器提示“不完整的证书链”
解决方法:
bash
# 检查证书链是否完整 openssl s_client -connect example.com:443 -showcerts # 确保 Nginx 配置包含 fullchain.pem(含中间证书) ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
Q3:移动端或旧系统无法访问
需要支持旧设备时,可降级 TLS 版本(不推荐):
nginx
# 兼容 Android 4.x / iOS 8 以下 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 但建议:如果是公开服务,不要这样做
Q4:重定向循环问题
检查是否有多个重定向配置,例如:
Nginx 配置了 HTTP→HTTPS 重定向
应用框架(WordPress、Django)也配置了强制 HTTPS
解决:只在一处配置重定向。
七、总结与方案选型建议
| 场景 | 推荐方案 | 成本 | 运维复杂度 |
|---|---|---|---|
| 个人博客/静态站 | Let's Encrypt + Nginx | 免费 | 低(完全自动) |
| 公司官网 | OV 商业证书 | 中等 | 低(年付) |
| 多服务/K8s 环境 | cert-manager + Let's Encrypt | 免费 | 中(需 K8s 知识) |
| 内网环境 | 自签名 CA | 免费 | 中(需分发 CA) |
| CDN 源站 | CloudFlare 源站证书 | 免费 | 低 |
| 金融/支付类 | EV 证书 | 高 | 低 |
最后的建议:
优先使用 Let's Encrypt + 自动化续期,免费且安全足够
任何时候都不要禁用安全配置以“兼容”老旧系统
启用 HSTS,但注意一旦启用,后续切换回 HTTP 的用户会有困难
建议配置证书过期监控,避免证书过期导致服务中断
*本指南配置示例基于 Nginx 1.20+ / Certbot 2.0+ / Let's Encrypt 最新规范,发布于 2025 年。如有更新,请以官方文档为准。*
