解决Nginx配置HTTPS时证书链不完整的问题

解决Nginx配置HTTPS时证书链不完整的问题
最新回答
惊蛰花压重门

2020-05-26 01:48:08

解决Nginx配置HTTPS时证书链不完整的问题需确保完整证书链文件(含服务器证书、中间证书、根证书)且顺序正确,同时检查格式、权限及加密配置。 以下是具体步骤和注意事项:

一、获取或创建完整的证书链文件(fullchain.pem)
  • CA提供打包文件:部分证书颁发机构(CA)会直接提供包含完整证书链的fullchain.pem文件,可直接使用。
  • 手动组合证书:若CA未提供,需手动合并证书文件,顺序为服务器证书→中间证书→根证书。例如:cat server.crt intermediate.crt root.crt > fullchain.pem

    关键点:服务器证书必须位于文件开头,根证书在末尾。若中间证书缺失或顺序错误,浏览器会报“证书链不完整”错误。

    案例:某CA提供的中间证书文件仅包含一个中间证书,但实际需要两个中间证书才能完成验证,需额外补充缺失的证书。

二、检查证书格式并转换(如需)
  • PEM格式要求:Nginx默认要求证书和私钥为PEM格式(文本格式,以-----BEGIN CERTIFICATE-----开头)。若证书为DER格式(二进制格式),需转换为PEM:openssl x509 -inform der -in server.der -out server.pem

    私钥转换:若私钥为DER格式,同样需转换:openssl rsa -inform der -in privkey.der -out privkey.pem

三、配置Nginx的HTTPS参数

在Nginx配置文件中(如/etc/nginx/sites-available/default),确保以下参数正确:

server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/fullchain.pem; # 指向完整证书链文件 ssl_certificate_key /path/to/privkey.pem; # 指向私钥文件 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全协议(如TLSv1、TLSv1.1) ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # 推荐强加密套件}
  • 关键参数说明

    ssl_certificate:必须指向包含完整证书链的fullchain.pem文件。

    ssl_protocols:建议禁用TLS 1.0和1.1(已存在漏洞),仅启用TLS 1.2和1.3。

    ssl_ciphers:优先选择支持前向保密(PFS)的加密套件,如EECDH+AESGCM。

四、验证证书链完整性
  • 使用OpenSSL验证:openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | openssl x509 -noout -text

    检查输出中是否包含所有中间证书,且顺序正确。

  • 在线工具验证:通过
    SSL Labs测试工具
    输入域名,查看“证书链”部分是否显示完整。
五、检查私钥权限
  • 权限设置:确保Nginx进程用户(如www-data或nginx)有权限读取私钥文件:chmod 400 /path/to/privkey.pem # 仅所有者可读chown www-data:www-data /path/to/privkey.pem # 修改所有者(根据实际用户调整)
六、优化与常见问题
  • Let's Encrypt简化管理:使用Let's Encrypt可自动生成完整的fullchain.pem文件,并通过Certbot工具自动续期:certbot certonly --nginx -d example.com # 自动获取证书certbot renew --dry-run # 测试续期
  • 避免常见错误

    证书顺序错误:服务器证书必须在fullchain.pem文件开头。

    中间证书缺失:即使根证书可信,缺失中间证书仍会导致验证失败。

    过期证书:定期检查证书有效期,尤其是手动管理的证书。

七、完整配置示例server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Let's Encrypt示例路径 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; # 其他配置(如根目录、日志等)}

通过以上步骤,可系统解决Nginx配置HTTPS时证书链不完整的问题,确保网站安全且兼容现代浏览器。