ssl_certificate必须指向含域名证书与中间证书的完整pem链文件(如fullchain.pem),使用绝对路径,私钥须未加密、权限600且与证书模数匹配,否则将导致tls握手失败或客户端信任链校验错误。

配置 ssl_certificate 不只是填个路径,而是保障 HTTPS 通信可信起点的关键环节。配错会导致浏览器报“证书无效”、TLS 握手失败,甚至服务完全不可用。
证书必须是完整链(fullchain)
不能只放域名证书(如 example.com.crt),必须包含中间证书(intermediate CA),否则 Android、旧版 iOS 或部分企业客户端无法构建信任链,直接报错。
- 推荐使用 Let’s Encrypt 提供的
fullchain.pem,它已合并域名证书 + 中间证书 - 若自行拼接,顺序必须为:域名证书在最前,中间证书紧随其后,根证书不放入(浏览器自带)
- 验证方式:
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout,应输出至少两段证书
路径必须绝对且可读
Nginx worker 进程需能读取该文件,相对路径、符号链接未解析或权限不足都会导致启动失败或 500 错误。
- 一律使用绝对路径,例如
/etc/nginx/ssl/example.com/fullchain.pem - 文件属主建议设为
root,但需确保 nginx worker 用户(如www-data或nginx)有读权限 - 避免放在
/tmp或用户家目录等可能被清理或权限受限的位置
证书与私钥必须数学配对
二者靠密钥参数匹配,而非文件名或位置。模数(modulus)不一致,Nginx 会静默失败或握手中断。
- 验证命令(两行 MD5 输出必须完全一致):
openssl x509 -noout -modulus -in fullchain.pem | openssl md5openssl rsa -noout -modulus -in example.com.key | openssl md5 - 私钥不能加密:Nginx 不支持密码保护的私钥。如有密码,先解密:
openssl rsa -in key_encrypted.key -out key_decrypted.key - 私钥权限必须为
600,且不可被组或其他用户读取
配合其他安全项协同生效
ssl_certificate 是基础,但单独配置无法抵御现代攻击。需与协议、套件、头信息联动:
- 禁用 TLSv1.0/TLSv1.1:
ssl_protocols TLSv1.2 TLSv1.3; - 禁用弱算法:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; - 启用 OCSP Stapling 加速吊销验证:
ssl_stapling on; ssl_stapling_verify on; - 强制 HSTS 防止降级:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";











