SSL证书配置关键在于确保客户端能完整可信地验证服务器身份,需满足私钥与证书数学配对、证书链严格按“域名证书→中间证书”顺序拼接为fullchain.pem(不含根证书),且区块间仅一个换行符;根证书不可加入,私钥须未加密、权限600,并用openssl命令验证配对性与链完整性。

ssl_certificate 配置的关键,不在于“填对文件”,而在于让客户端能完整、可信地验证服务器身份。这依赖两个前提:一是证书必须由对应的私钥签发(数学配对),二是客户端必须能顺着证书链逐级回溯到它信任的根证书——这就决定了证书文件的内容顺序不能随意。
证书链拼接必须严格按“叶→中→根”方向
ssl_certificate 指向的文件不是单张证书,而是从你的域名证书开始,向下拼接所有中间证书,最终止于但不包含根证书的 PEM 文件(常称 fullchain.pem)。顺序错乱会导致浏览器无法构建信任链,报“证书不可信”或“NET::ERR_CERT_AUTHORITY_INVALID”。
- 正确顺序:你的域名证书(example.com.crt)在最上方 → 紧接着是第一级中间证书 → 再下一级中间证书(如有)→ 最后是最后一级中间证书
- 错误示例:把中间证书放在前面、域名证书放后面;或把根证书也一并粘进去;或两段之间多了一个空行、一个空格、甚至中文标点
- 验证方法:用文本编辑器打开拼接后的文件,应看到多个以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾的区块,且区块之间**仅有一个换行符,无额外空白
为什么不能只放域名证书?
浏览器内置了主流根证书,但一般不预装中间证书。当你只提供域名证书时,客户端拿到后发现签发者(Issuer)是一个中间 CA,却找不到该 CA 的公钥来验证签名,信任链就断了。拼接中间证书,相当于把“验证路径”主动交给客户端,让它能一级级向上验到已知根证书。
- Let’s Encrypt 的证书链通常含两级中间证书(R3 和 ISRG Root X1),需全部拼入
- 部分商业 CA(如 Sectigo、DigiCert)可能只有一级中间证书,但也必须拼接
- 根证书(Root CA)无需也不应放入 ssl_certificate 文件——它已在客户端系统/浏览器中内置
如何安全生成与验证拼接结果?
手动拼接易出错,推荐用命令行操作,并立即验证模值和链完整性:
-
拼接命令(Linux/macOS):
cat example.com.crt intermediate.crt > fullchain.pem -
验证是否配对:运行以下两条命令,输出的 MD5 值必须完全一致
openssl x509 -noout -modulus -in fullchain.pem | openssl md5openssl rsa -noout -modulus -in example.com.key | openssl md5 -
验证链结构:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt fullchain.pem(若提示 OK,说明链可被系统信任库识别)
宝塔面板等可视化工具的特别提醒
在宝塔、cPanel 等界面中填写证书时,“证书(PEM格式)”栏必须粘贴拼接后的 fullchain.pem 全文;“私钥(KEY)”栏只能粘贴原始 .key 文件内容,不能加注释、不能有密码保护、不能混入任何非 PEM 格式字符。
- 私钥若被加密(提示输入 password),需先解密:
openssl rsa -in key_encrypted.key -out key_decrypted.key - 私钥权限必须为 600:
chmod 600 /path/to/your.key,否则 Nginx 启动会拒绝加载 - 配置保存后务必执行
nginx -t测试语法,再 reload,避免因证书路径或格式问题导致全站 HTTPS 中断


















