正确指定ssl_certificate和ssl_certificate_key需同时满足配对性、完整性、路径规范和权限合规四条件:证书与私钥modulus必须一致,ssl_certificate须为域名证+中间证的fullchain.pem,路径须绝对且同server块,私钥权限600且属nginx用户。

正确指定 ssl_certificate 和 ssl_certificate_key 不是简单填两个路径,而是要同时满足配对性、完整性、路径规范和权限合规这四个硬性条件。少一个,Nginx 就可能启动失败,或浏览器提示“您的连接不是私密连接”。
证书与私钥必须数学配对
二者靠的是密钥参数一致(比如 RSA 的 modulus),不是文件名或放一起就自动匹配。常见错误是用错私钥、混用不同证书生成的密钥,或私钥被密码保护。
- 验证是否配对:运行两行命令,比对输出的 MD5 值是否完全一致
openssl x509 -noout -modulus -in example.com.crt | openssl md5openssl rsa -noout -modulus -in example.com.key | openssl md5 - 如果私钥有密码,Nginx 无法加载,需先解密:
openssl rsa -in key_encrypted.key -out key_decrypted.key - 确认私钥格式为 PEM,且开头是
-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----(PKCS#8)
ssl_certificate 必须是完整证书链
不能只放域名证书(example.com.crt),否则 Android、旧版 iOS 或某些企业网络会因无法构建信任链而报错。
- 正确内容顺序:你的域名证书(第一段) + 所有中间证书(按颁发顺序追加)
根证书不要放进这个文件 - 推荐命名为
fullchain.pem,例如:/etc/nginx/ssl/example.com.fullchain.pem - 若证书提供方给的是分开的
domain.crt和ca-bundle.crt,可用命令合并:cat domain.crt ca-bundle.crt > fullchain.pem
路径必须绝对、同块、可访问
Nginx 不支持相对路径、内联内容,也不允许把两个指令拆到不同 server 块中。
- ✅ 正确写法(在同一个
server { }内):ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;ssl_certificate_key /etc/nginx/ssl/example.com.key; - ❌ 常见错误:
路径用./cert.pem(相对路径)
私钥写成 base64 内联(Nginx 完全不支持)
把ssl_certificate放 http 块,ssl_certificate_key放 server 块 - 确保 Nginx worker 进程用户(如
www-data或nginx)对这两个文件有读取权限
权限与所有权要严格控制
私钥泄露等于证书失守,Nginx 启动时也会检查权限是否过于宽松。
- 私钥文件权限必须是
600(仅属主可读写):chmod 600 /etc/nginx/ssl/example.com.key - 属主建议设为 Nginx worker 用户,例如:
chown www-data:www-data /etc/nginx/ssl/example.com.key - 证书文件(fullchain.pem)权限建议
644,但至少不能是777或666


















