nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx  ssl_trusted_certificate补全中间证书

Nginx 通过ssl_trusted_certificate正确补全中间证书

作者:舞夢輝影

在 Nginx 配置 HTTPS 时,使用 ssl_trusted_certificate 指令可以指定受信任的 CA 证书链,用于验证客户端证书或 OCSP Stapling 等功能,正确补全中间证书链是确保 SSL/TLS 连接兼容性和安全性的关键,下面就来详细的介绍一下如何使用,感兴趣的可以了解一下

在 Nginx 配置 HTTPS 时,使用 ssl_trusted_certificate 指令可以指定受信任的 CA 证书链,用于验证客户端证书或 OCSP Stapling 等功能。正确补全中间证书链是确保 SSL/TLS 连接兼容性和安全性的关键。

核心概念

证书类型说明
服务器证书 (End-entity)你的域名证书,由 CA 签发
中间证书 (Intermediate)连接服务器证书和根证书的桥梁
根证书 (Root)自签名的顶级 CA 证书,预装在系统信任库

为什么 ssl_trusted_certificate 不解决“链不完整”警告

这个指令的作用对象是 Nginx 本身,不是浏览器:

正确做法:确保 ssl_certificate 指向 fullchain 文件

所有修复动作都围绕一个核心——让 ssl_certificate 的值指向一个拼接好的 PEM 文件,内容顺序严格为:

正确配置方式

1. 合并证书链文件

将服务器证书和中间证书按顺序合并到一个文件(服务器证书在前,中间证书在后):

# 正确的顺序:服务器证书 → 中间证书1 → 中间证书2(如有)
cat your_domain.crt intermediate.crt > fullchain.crt

或使用证书商提供的 fullchain.pem 文件。

2. Nginx 配置

server {
    listen 443 ssl http2;
    server_name example.com;
    # 服务器证书 + 中间证书(合并后的完整链)
    ssl_certificate     /etc/nginx/ssl/fullchain.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;
    # 受信任的 CA 证书(用于验证客户端证书或 OCSP)
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
    # OCSP Stapling(需要 ssl_trusted_certificate 支持)
    ssl_stapling on;
    ssl_stapling_verify on;
    # 其他 SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
}

关键指令详解

指令用途文件内容
ssl_certificate向客户端展示的服务器证书链服务器证书 + 中间证书(必须完整)
ssl_certificate_key服务器证书的私钥私钥文件(.key 或 .pem)
ssl_trusted_certificate验证客户端证书或 OCSP 响应的受信 CA中间证书 + 根证书(通常不含服务器证书)

验证证书链完整性

方法一:OpenSSL 命令行

# 检查证书链是否完整(应显示 0 errors, 0 warnings)
openssl verify -CAfile /etc/nginx/ssl/chain.pem /etc/nginx/ssl/fullchain.crt
# 检查 Nginx 实际提供的证书链
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -text -noout
# 查看完整证书链
echo | openssl s_client -connect example.com:443 -servername example.com -showcerts

方法二:在线检测工具

常见问题排查

问题 1:证书链不完整("Certificate chain incomplete")

症状:Android 旧设备或 Java 客户端无法连接。

解决:确保 ssl_certificate 包含完整链:

# 下载证书商提供的中间证书,合并到 fullchain
cat your_domain.crt ca_intermediate.crt > fullchain.crt

问题 2:OCSP Stapling 失败

症状ssl_stapling on 但 OCSP 状态为 No response sent

解决ssl_trusted_certificate 必须包含签发你证书的 CA 的完整链:

# 从证书中提取并保存中间证书
openssl crl2pkcs7 -nocrl -certfile fullchain.crt | openssl pkcs7 -print_certs -out chain.pem

问题 3:顺序错误

错误顺序(中间证书在前)会导致握手失败:

# ❌ 错误:不要这样合并
cat intermediate.crt your_domain.crt > wrong.crt

最佳实践配置模板

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    # 证书配置
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;  # 证书+中间证书
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;      # 私钥
    # 受信 CA 链(用于 OCSP 和客户端验证)
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    # 现代 SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    # 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
}

配置完成后,务必使用 nginx -t 测试配置,并重启 Nginx 使配置生效。

到此这篇关于Nginx 通过ssl_trusted_certificate正确补全中间证书的文章就介绍到这了,更多相关Nginx ssl_trusted_certificate补全中间证书内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文