nginx配置ssl证书需确保证书与私钥数学匹配(modulus一致)、ssl_certificate为完整证书链(域名证+中间证)、路径用绝对路径、私钥无密码且权限600并属nginx worker用户。

配置 Nginx 的 ssl_certificate 和 ssl_certificate_key 不是填路径那么简单,关键在于“配对正确、路径可靠、权限合规”。配错一个环节,Nginx 启动失败、浏览器报“证书无效”或 TLS 握手直接中断。
证书与私钥必须数学匹配
二者不是靠文件名或目录位置关联,而是依赖底层密钥参数的一致性——主要是 RSA/ECC 模数(modulus)完全相同。
- 验证命令(两行输出 MD5 值必须完全一致):
openssl x509 -noout -modulus -in example.com.crt | openssl md5openssl rsa -noout -modulus -in example.com.key | openssl md5 - 若提示
unable to load certificate或bad decrypt,说明证书格式错误,或私钥被密码加密——Nginx 不支持带密码的私钥,需先解密:openssl rsa -in key_encrypted.key -out key_decrypted.key
ssl_certificate 必须是完整证书链(fullchain.pem)
不能只放域名证书(example.com.crt),否则部分客户端(如 Android、旧版 iOS)因无法构建信任链而报错。
- 正确内容顺序:你的域名证书(第一行) + 所有中间证书(按颁发顺序追加)
(根证书不要放入该文件) - 推荐命名和结构:
/etc/nginx/ssl/example.com.fullchain.pem(含域名证书+中间证书)/etc/nginx/ssl/example.com.key(已解密私钥)
路径必须为绝对路径,且同属一个 server 块
Nginx 不支持相对路径、内联私钥或跨块复用。工作目录变化时,相对路径极易失效(尤其在 systemd 管理下)。
- ✅ 正确写法:
ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;ssl_certificate_key /etc/nginx/ssl/example.com.key; - ❌ 错误写法:
ssl_certificate ./cert.pem;(相对路径)ssl_certificate_key "-----BEGIN RSA PRIVATE KEY-----...";(内联不支持) - 两个指令必须出现在同一个
server { }块中,不可拆分到不同块或 http 块顶层。
私钥权限必须设为 600,且 Nginx 进程可读
私钥泄露 = HTTPS 安全失效。Nginx 主进程通常以 root 启动,worker 进程以 www-data 或 nginx 用户运行,需确保该用户能读取私钥文件。
- 设置权限:
chmod 600 /etc/nginx/ssl/example.com.keychown root:www-data /etc/nginx/ssl/example.com.key(根据实际 worker 用户调整) - 检查 SELinux(如启用):
若报“Permission denied”,可能需恢复上下文:restorecon -v /etc/nginx/ssl/example.com.key











