Nginx 1.24 配置 HTTPS 实战:3 种 SSL 证书申请与自动化续期方案
Nginx 1.24 配置 HTTPS 实战:3 种 SSL 证书申请与自动化续期方案
在当今互联网环境中,HTTPS 已成为网站安全的基础配置。作为运维工程师或全栈开发者,掌握 SSL/TLS 证书的申请、配置和管理技能至关重要。本文将深入探讨三种主流 SSL 证书方案(Let's Encrypt 免费证书、商业 CA 证书和自签名证书)的适用场景与配置细节,并提供可直接复用的 Nginx 配置模板和自动化续期方案。
1. HTTPS 基础与证书类型选择
HTTPS 通过 SSL/TLS 协议为 HTTP 通信提供加密和身份验证,其核心组件是数字证书。在选择证书方案前,我们需要了解三种主要证书类型的特点:
| 证书类型 | 验证级别 | 有效期 | 浏览器信任 | 适用场景 | 典型成本 |
|---|---|---|---|---|---|
| 自签名证书 | 无 | 自定义 | 需手动信任 | 内部测试、开发环境 | 免费 |
| Let's Encrypt | 域名验证 | 90天 | 全信任 | 个人博客、小型网站 | 免费 |
| 商业 CA 证书 | 组织验证 | 1-2年 | 全信任 | 企业官网、电商平台 | $50-$1000+/年 |
自签名证书适合内部开发和测试环境,但需要手动导入根证书到客户端信任库。其生成命令如下:
# 生成 RSA 私钥 openssl genrsa -out self-signed.key 2048 # 创建 CSR (证书签名请求) openssl req -new -key self-signed.key -out self-signed.csr # 生成自签名证书 openssl x509 -req -days 365 -in self-signed.csr -signkey self-signed.key -out self-signed.crtLet's Encrypt是目前最流行的免费证书方案,通过 ACME 协议自动化签发流程。其优势在于:
- 被所有主流浏览器信任
- 支持通配符证书(需 DNS 验证)
- 自动化签发和续期
商业 CA 证书(如 DigiCert、GeoTrust)提供更长的有效期和保险保障,适合对 SLA 要求高的商业场景。
2. Nginx 1.24 基础 HTTPS 配置
无论使用哪种证书,Nginx 的基础 HTTPS 配置结构相似。以下是通用配置模板:
server { listen 443 ssl http2; server_name example.com; # 证书路径配置 ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; # SSL 协议配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; # 加密套件配置 (TLS 1.2) ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...'; # 会话缓存优化 ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; # OCSP 装订提升性能 ssl_stapling on; ssl_stapling_verify on; # HSTS 增强安全 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; # 其他站点配置... location / { root /var/www/html; index index.html; } }关键配置说明:
ssl_protocols应禁用不安全的 TLS 1.0/1.1ssl_ciphers需精心配置以平衡安全与兼容性- OCSP 装订可减少客户端验证延迟
- HSTS 头强制浏览器使用 HTTPS 连接
3. Let's Encrypt 证书自动化方案
Let's Encrypt 证书的有效期仅 90 天,必须建立自动化续期流程。官方推荐的 certbot 工具可简化这一过程。
3.1 证书申请与安装
# 安装 certbot sudo apt install certbot python3-certbot-nginx # 获取证书 (Nginx 插件模式) sudo certbot --nginx -d example.com -d www.example.com # 仅获取证书 (手动配置模式) sudo certbot certonly --webroot -w /var/www/html -d example.comcertbot 会自动修改 Nginx 配置加载新证书。手动模式获取证书后,需在 Nginx 中配置证书路径:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;3.2 自动化续期配置
创建续期脚本/etc/letsencrypt/renewal-hooks/post/nginx-reload.sh:
#!/bin/bash nginx -t && systemctl reload nginx然后设置 cron 任务自动续期:
# 每天检查续期 (证书到期前30天内才会实际续期) 0 0 * * * /usr/bin/certbot renew --quiet --post-hook "/bin/bash /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh"3.3 通配符证书配置
通配符证书需使用 DNS 验证方式:
sudo certbot certonly \ --manual \ --preferred-challenges=dns \ -d *.example.com \ --server https://acme-v02.api.letsencrypt.org/directory执行命令后,certbot 会提示添加 DNS TXT 记录验证域名所有权。
4. 商业证书高级配置
商业证书通常提供更长的有效期和额外的验证功能。以 DigiCert 为例,配置时需注意:
- 证书链完整性:商业 CA 通常需要中间证书
ssl_certificate /path/to/your_domain.crt; ssl_certificate_key /path/to/your_private.key; ssl_trusted_certificate /path/to/digicert_ca.crt;- OCSP 验证优化:
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s;- 多域名 SAN 证书:商业证书常支持多个 Subject Alternative Names
ssl_certificate /path/to/multi_domain.crt; ssl_certificate_key /path/to/multi_domain.key;5. 混合方案与性能优化
在实际生产环境中,可以组合使用不同证书方案:
- 边缘节点使用商业证书
- 内部服务间通信使用 Let's Encrypt 证书
- 开发环境使用自签名证书
性能优化建议:
- 会话恢复:减少 TLS 握手开销
ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets on;- TLS 1.3 优先:提供更好的性能和安全性
ssl_protocols TLSv1.3 TLSv1.2; ssl_ciphers 'TLS13+AESGCM+AES128:TLS13+AESGCM+AES256...';- 证书热更新:避免服务中断
# 在证书续期后发送 USR1 信号给 Nginx kill -USR1 $(cat /var/run/nginx.pid)6. 常见问题排查
当 HTTPS 配置出现问题时,可通过以下方法诊断:
- 证书链验证:
openssl verify -CAfile /path/to/ca_bundle.crt your_domain.crt- 连接测试:
openssl s_client -connect example.com:443 -servername example.com -showcerts- 协议支持检查:
nmap --script ssl-enum-ciphers -p 443 example.com- Nginx 配置测试:
nginx -t对于混合内容警告,确保所有资源都通过 HTTPS 加载:
# 强制重定向 HTTP 到 HTTPS server { listen 80; server_name example.com; return 301 https://$host$request_uri; }7. 安全加固与最佳实践
为确保 HTTPS 配置的安全性,建议实施以下措施:
- 禁用弱加密算法:
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...'; ssl_ecdh_curve secp384r1;- 启用证书透明度:
add_header Expect-CT 'enforce, max-age=86400';- 内容安全策略:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'...";- 定期轮换密钥:即使证书未到期,也应每年更新私钥
# 生成新私钥 openssl ecparam -genkey -name secp384r1 -out new.key # 使用新密钥重新申请证书 certbot certonly --cert-name example.com --key-path /path/to/new.key- 监控证书过期:设置监控检查证书有效期
echo | openssl s_client -connect example.com:443 2>/dev/null | \ openssl x509 -noout -dates