使用 Nginx 实现 HTTPS 配置与 SSL 证书管理

随着网络安全意识的提升,HTTPS 已成为现代网站的标配。Nginx 作为高性能的 Web 服务器和反向代理服务器,在 HTTPS 配置和 SSL 证书管理方面提供了强大而灵活的支持。本文将详细介绍如何使用 Nginx 配置 HTTPS,并探讨 SSL 证书的获取、管理和自动化续期方案。

一、HTTPS 与 SSL/TLS 基础

HTTPS 是在 HTTP 基础上加入 SSL/TLS 加密层,通过非对称加密和对称加密的结合,实现数据传输的机密性、完整性和身份验证。其核心流程包括:

  1. 握手阶段:客户端与服务器协商加密套件,验证证书合法性,生成会话密钥。
  2. 数据传输阶段:使用会话密钥对 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 申请商业证书。申请流程通常包括:

  1. 生成证书签名请求(CSR)和私钥。
  2. 提交 CSR 和域名验证信息。
  3. 下载签发的证书文件(通常包括 .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,需注意规划。

五、常见问题排查

  1. 证书链不完整:浏览器提示“证书不受信任”,需将中间证书与服务器证书合并,或使用 ssl_certificate 指向包含完整链的文件。
  2. 混合内容警告:页面中引用了 HTTP 资源,需将所有资源改为 HTTPS 或使用相对协议。
  3. SSL 握手失败:检查 ssl_protocolsssl_ciphers 是否与客户端兼容,可使用 SSL Labs 测试工具诊断。
  4. 重定向循环:检查反向代理场景下 X-Forwarded-Proto 头是否正确传递。

六、总结

使用 Nginx 配置 HTTPS 并管理 SSL 证书,是保障网站安全的关键步骤。通过 Let's Encrypt 实现免费证书的自动化获取与续期,结合 Nginx 的 SSL 优化配置和安全加固,可以构建一个既安全又高性能的 HTTPS 服务。建议定期使用 SSL Labs、Mozilla Observatory 等工具进行安全评估,持续优化配置,确保网站始终处于最佳安全状态。

未经允许不得转载:任鹏个人博客 » 使用 Nginx 实现 HTTPS 配置与 SSL 证书管理

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏