随着网络安全意识的提升,HTTPS 已成为现代网站的标配。Nginx 作为高性能的 Web 服务器和反向代理服务器,在 HTTPS 配置和 SSL 证书管理方面提供了强大而灵活的支持。本文将详细介绍如何使用 Nginx 配置 HTTPS,并探讨 SSL 证书的获取、管理和自动化续期方案。
一、HTTPS 与 SSL/TLS 基础
HTTPS 是在 HTTP 基础上加入 SSL/TLS 加密层,通过非对称加密和对称加密的结合,实现数据传输的机密性、完整性和身份验证。其核心流程包括:
- 握手阶段:客户端与服务器协商加密套件,验证证书合法性,生成会话密钥。
- 数据传输阶段:使用会话密钥对 HTTP 数据进行对称加密传输。
SSL 证书是 HTTPS 的核心,它由受信任的证书颁发机构(CA)签发,包含公钥、域名、有效期等信息。常见的证书类型包括:
- DV 证书:域名验证型,仅验证域名所有权,适合个人网站。
- OV 证书:组织验证型,验证企业身份,适合企业官网。
- EV 证书:扩展验证型,显示绿色地址栏,适合金融支付类网站。
- 通配符证书:支持
*.example.com所有子域名。 - 多域名证书:支持多个不同域名。
二、获取 SSL 证书
2.1 使用 Let's Encrypt 免费证书
Let's Encrypt 提供免费、自动化、开放的 SSL 证书,是目前最流行的选择。推荐使用 Certbot 工具获取:
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书并自动配置 Nginx
sudo certbot --nginx -d example.com -d www.example.com
Certbot 会自动修改 Nginx 配置文件,添加 HTTPS 监听和证书路径,并设置 HTTP 到 HTTPS 的重定向。
2.2 商业证书申请
对于企业级应用,可向 DigiCert、GlobalSign、阿里云等 CA 申请商业证书。申请流程通常包括:
- 生成证书签名请求(CSR)和私钥。
- 提交 CSR 和域名验证信息。
- 下载签发的证书文件(通常包括
.crt和.key)。
生成 CSR 的命令示例:
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.com.key \
-out example.com.csr
三、Nginx HTTPS 配置详解
3.1 基础配置
在 Nginx 配置文件中,HTTPS 服务器块通常监听 443 端口,并指定证书和私钥路径:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
3.2 HTTP 跳转 HTTPS
为了强制使用 HTTPS,需要配置 80 端口的服务器块进行 301 重定向:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
3.3 SSL 安全优化
默认的 SSL 配置可能存在安全隐患,建议进行以下优化:
ssl_protocols TLSv1.2 TLSv1.3;
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;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS(HTTP 严格传输安全)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
关键参数说明:
ssl_protocols:仅启用 TLS 1.2 和 1.3,禁用不安全的 SSLv3、TLS 1.0/1.1。ssl_ciphers:选择前向保密性强的加密套件。ssl_session_cache:启用会话缓存,提升性能。HSTS:强制浏览器使用 HTTPS 访问,防止降级攻击。OCSP Stapling:由服务器代查证书吊销状态,提升握手速度。
3.4 配置验证与重载
修改配置后,务必先测试再重载:
sudo nginx -t
sudo systemctl reload nginx
四、SSL 证书管理最佳实践
4.1 证书自动化续期
Let's Encrypt 证书有效期为 90 天,需设置自动续期。Certbot 安装时会自动创建定时任务,也可手动添加:
# 测试续期
sudo certbot renew --dry-run
# 添加 cron 任务(每天凌晨 2 点检查续期)
0 2 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
4.2 证书监控
建议使用监控工具(如 Prometheus + Blackbox Exporter、Uptime Kuma)监控证书到期时间,提前 30 天告警。也可编写脚本定期检查:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates
4.3 私钥安全
私钥是证书安全的核心,应严格保护:
- 设置文件权限为
600,属主为 root。 - 避免将私钥提交到版本控制系统。
- 使用独立的证书目录,如
/etc/nginx/ssl/。 - 定期轮换私钥(建议每年一次)。
4.4 多域名与通配符证书管理
对于多个子域名,可使用通配符证书简化管理:
server {
listen 443 ssl;
server_name *.example.com;
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
# ...
}
通配符证书仅覆盖一级子域名,如 *.example.com 不匹配 a.b.example.com,需注意规划。
五、常见问题排查
- 证书链不完整:浏览器提示“证书不受信任”,需将中间证书与服务器证书合并,或使用
ssl_certificate指向包含完整链的文件。 - 混合内容警告:页面中引用了 HTTP 资源,需将所有资源改为 HTTPS 或使用相对协议。
- SSL 握手失败:检查
ssl_protocols和ssl_ciphers是否与客户端兼容,可使用 SSL Labs 测试工具诊断。 - 重定向循环:检查反向代理场景下
X-Forwarded-Proto头是否正确传递。
六、总结
使用 Nginx 配置 HTTPS 并管理 SSL 证书,是保障网站安全的关键步骤。通过 Let's Encrypt 实现免费证书的自动化获取与续期,结合 Nginx 的 SSL 优化配置和安全加固,可以构建一个既安全又高性能的 HTTPS 服务。建议定期使用 SSL Labs、Mozilla Observatory 等工具进行安全评估,持续优化配置,确保网站始终处于最佳安全状态。
未经允许不得转载:任鹏个人博客 » 使用 Nginx 实现 HTTPS 配置与 SSL 证书管理


朋友圈点赞图在线生成源码