证书和私钥必须数学配对,验证方法是比对二者modulus的MD5值是否一致;ssl_certificate需为包含域名证书和中间证书的fullchain.pem文件,路径须绝对且与ssl_certificate_key同在server块内;私钥须无密码、权限600、属主可读。

证书和私钥必须数学配对
ssl_certificate 和 ssl_certificate_key 不是随便放两个文件就能用的。它们是一对密钥组合:证书里含公钥,私钥文件里含对应私钥参数。Nginx 启动时会校验二者是否真正匹配——核心看 RSA 或 ECC 的模数(modulus)是否一致。
验证方法很简单:
- 运行 openssl x509 -noout -modulus -in your_cert.crt | openssl md5
- 再运行 openssl rsa -noout -modulus -in your_key.key | openssl md5
- 两个命令输出的 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),而应是拼接好的完整信任链:域名证书 + 所有中间证书(不含根证书),按顺序保存为一个 PEM 文件。
正确写法示例:
- 第一行:你的域名证书内容(-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----)
- 紧接着:中间证书内容(可能有一段或多段,顺序不能颠倒)
- 不能包含根证书,也不能把中间证书放在最前面
推荐命名和路径:
/etc/nginx/ssl/example.com.fullchain.pem(证书+中间链)
/etc/nginx/ssl/example.com.key(已解密私钥)
路径必须绝对,且必须同在一个 server 块内
Nginx 对这两个指令的位置和路径格式很严格:
- 必须写在同一个 server { } 块里,不能一个在 http 块、一个在 server 块,也不能拆到不同 server 块中
- 路径必须是绝对路径,比如 /etc/nginx/ssl/example.com.fullchain.pem
- 禁止相对路径(如 ./cert.pem)、禁止内联私钥(如直接贴 BEGIN RSA PRIVATE KEY 字符串)
否则在 systemd 等环境下容易因工作目录变化导致加载失败,Nginx 启动直接报错。
私钥权限要设为 600,且确保 Nginx 进程可读
私钥一旦泄露,HTTPS 安全性就形同虚设。所以部署后务必执行:
- chmod 600 /etc/nginx/ssl/example.com.key
- 确认 nginx 主进程用户(通常是 www-data 或 nginx)对该文件有读权限
- 不要把私钥放在 web 可访问目录下,也不要设置成 644 或 755
权限不到位会导致 Nginx 启动失败或日志提示 “permission denied”。


















