ssl_certificate与ssl_certificate_key是强绑定的凭证对,必须数学匹配(模值一致)、同server块内使用绝对路径,且私钥须解密并设chmod 600权限;ssl_certificate应为域名证书+中间证书拼接的fullchain.pem文件。

ssl_certificate 和 ssl_certificate_key 不是两个独立配置项,而是一对强绑定的凭证组合——证书必须由对应私钥签名生成,否则 Nginx 启动失败或浏览器报“证书无效”。配对逻辑的核心在于数学一致性,而非文件名或路径相似。
证书与私钥必须匹配:验证公钥模值是否一致
证书(.crt/.pem)里封装的是公钥,私钥(.key)里保存的是对应的数学密钥参数。二者是否真正配对,取决于它们生成时的 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 可以是单证书,也可以是证书链
ssl_certificate 指向的不是单纯的域名证书,而是“可被客户端信任的完整链”——即域名证书 + 所有中间证书(不含根证书),按顺序拼接成一个 PEM 文件。
- 正确顺序:域名证书在最上方,中间证书依次追加在下方
- 错误做法:把根证书也放进该文件,或顺序颠倒(如中间证书在前、域名证书在后)
- 推荐命名和存放方式:
/etc/nginx/ssl/example.com.fullchain.pem(含域名证书+中间证书)
/etc/nginx/ssl/example.com.key(已解密、权限为 600)
路径与作用域要求严格:必须同 server 块 + 绝对路径
Nginx 不允许跨块复用或相对路径引用,否则在 systemd 等环境下极易因工作目录变化导致加载失败。
- 两个指令必须出现在同一个 server { ... } 块内
- 路径必须为绝对路径,例如:
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-----...";(不支持内联私钥)
权限与安全边界:Nginx 进程必须能读私钥,但不能过度开放
私钥文件一旦泄露,HTTPS 安全性即彻底失效。Nginx 对私钥权限有强制校验逻辑。
- 推荐权限设置:
chmod 600 /etc/nginx/ssl/example.com.key(仅属主可读写) - 可接受但非最优:
chmod 644(其他用户可读,不推荐用于生产) - 明确拒绝:
chmod 777 或 chmod 640(若属组非 Nginx 工作用户,如 www-data) - 确认 Nginx 工作用户(如 nginx 或 www-data)对证书目录及文件具有读取权限


















