在 nginx 配置 https 时,使用 ssl_trusted_certificate 指令可以指定受信任的 ca 证书链,用于验证客户端证书或 ocsp stapling 等功能。正确补全中间证书链是确保 ssl/tls 连接兼容性和安全性的关键。
核心概念
| 证书类型 | 说明 |
|---|---|
| 服务器证书 (end-entity) | 你的域名证书,由 ca 签发 |
| 中间证书 (intermediate) | 连接服务器证书和根证书的桥梁 |
| 根证书 (root) | 自签名的顶级 ca 证书,预装在系统信任库 |
为什么 ssl_trusted_certificate 不解决“链不完整”警告
这个指令的作用对象是 nginx 本身,不是浏览器:
- ssl_certificate:nginx 在 tls 握手时发给客户端的证书列表。必须含域名证书 + 所有中间证书(不含根证书)。
- ssl_trusted_certificate:仅供 nginx 内部使用,例如验证 ocsp 响应签名或校验双向 tls 中客户端证书。它不会被发给浏览器,对修复“net::err_cert_authority_invalid”无效。
正确做法:确保 ssl_certificate 指向 fullchain 文件
所有修复动作都围绕一个核心——让 ssl_certificate 的值指向一个拼接好的 pem 文件,内容顺序严格为:
- 你的域名证书(
example.com.crt) - 紧接着是中间证书(如
intermediate.crt;若有多级,按信任路径从近到远追加) - 不要包含根证书(root ca)
正确配置方式
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补全中间证书内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论