nginx中ssl_certificate必须与域名、私钥、证书链严格匹配:域名需精确对应san字段,证书须为含中间ca的fullchain.pem,私钥需数学配对且权限600,二者必须同置于server块内并用绝对路径。

在 Nginx 中,ssl_certificate 不是简单指向一个.crt文件就能生效的——它必须和域名、私钥、证书链三者严丝合缝地对齐。配错任意一环,浏览器就可能显示“您的连接不是私密连接”,或者 Nginx 直接启动失败。
域名必须精确匹配证书中的 Subject Alternative Name(SAN)
证书里写的域名,必须和 server_name 完全一致(包括 www 前缀)。比如证书签发的是 www.example.com,那配置里就不能只写 example.com;反之亦然。通配符证书(如 *.example.com)能覆盖所有一级子域,但不包括根域本身。
- 多域名证书需在 SAN 字段中明确列出所有要支持的域名
- 用
openssl x509 -in cert.pem -text -noout | grep -A1 "Subject Alternative Name"可查看实际支持的域名 - 测试时建议用
curl -I https://yourdomain.com或在线工具(如 SSL Labs)验证域名匹配状态
ssl_certificate 必须是完整证书链(fullchain)
只放域名证书(yourdomain.crt)会导致部分客户端(尤其是 Android 和旧版 iOS)无法验证信任路径,报“证书不可信”。Nginx 要求把中间证书追加在域名证书后面,组成一个 fullchain 文件。
- 正确顺序:你的域名证书(第一段)→ 中间证书(按颁发顺序,逐个追加)
- 根证书不要放入该文件(系统或客户端已内置)
- Let’s Encrypt 用户直接用
fullchain.pem,别误用cert.pem - 阿里云/腾讯云下载的 Nginx 包通常含
xxx.pem(即 fullchain)和xxx.key,可直接使用
私钥必须与证书数学配对且无密码
Nginx 加载私钥时不做“文件名匹配”,而是校验密钥参数是否一致。哪怕文件名对得上,只要模数(modulus)不同,就会握手失败。
- 验证命令:
openssl x509 -noout -modulus -in example.com.crt | openssl md5openssl rsa -noout -modulus -in example.com.key | openssl md5
两行输出 MD5 必须完全相同 - 若私钥被加密(提示
Enter pass phrase),需先解密:openssl rsa -in key_encrypted.key -out key_decrypted.key - 私钥权限必须为
600,且属主为运行 Nginx worker 的用户(通常是nginx或www-data)
路径与作用域必须严格限定
这两个指令不能写在 http 块顶层,也不能跨 server 块拆开使用——它们必须成对出现在同一个 server { ... } 块内,并用绝对路径。
- ✅ 正确:
ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;ssl_certificate_key /etc/nginx/ssl/example.com.key; - ❌ 错误:
使用相对路径(如./cert.pem)
内联写私钥(Nginx 不支持)
把ssl_certificate放 http 块,ssl_certificate_key放 server 块 - systemd 管理下工作目录不确定,相对路径极易失效











