证书与私钥必须匹配,验证方法是比对二者公钥MD5值是否一致;配置时需用绝对路径、同server块内指定,证书文件含域名证书和中间证书(不含根证书),私钥须无密码且权限合理(如600)。

在 Nginx 中配置 HTTPS,ssl_certificate 指令本身不难,但真正容易出错的是它和 ssl_certificate_key 的配对关系——证书和私钥必须严格匹配,否则 Nginx 启动失败或浏览器报“证书无效”。下面直接说清楚怎么验证、怎么配、怎么排查。
确认证书与私钥是否匹配
这是最关键的一步。光看文件名(比如都叫 domain.crt 和 domain.key)不等于它们真是一对。
- 运行命令比对公钥指纹:
openssl x509 -noout -modulus -in your_cert.crt | openssl md5openssl rsa -noout -modulus -in your_key.key | openssl md5
两个命令输出的 MD5 值**必须完全一致**,才说明证书和私钥匹配。
- 如果提示 “unable to load certificate” 或 “bad decrypt”,检查文件格式:证书应为 PEM(以
-----BEGIN CERTIFICATE-----开头),私钥不能被密码保护(Nginx 不支持加载带密码的私钥);如有密码,用openssl rsa -in key_encrypted.key -out key_decrypted.key解密。
正确书写 ssl_certificate 和 ssl_certificate_key 路径
Nginx 要求这两个指令必须出现在同一个 server 块中,且路径为绝对路径更稳妥(尤其使用 systemd 管理时,工作目录可能非预期)。
- 推荐写法(假设证书放在
/etc/nginx/ssl/):
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
- 注意:
ssl_certificate可以是单个证书,也可以是“证书链”文件(即域名证书 + 中间证书拼在一起),但不能包含根证书;顺序必须是:域名证书在最上面,中间证书依次向下。 - 不要把私钥内容直接写进配置里,也不要用相对路径(如
./cert.pem),避免因启动上下文不同导致读取失败。
常见错误与快速自检清单
遇到 nginx: [emerg] SSL_CTX_use_certificate_chain_file() failed 或浏览器显示“您的连接不是私密连接”,按这个顺序查:
- 执行
nginx -t—— 它会明确提示哪一行、哪个文件出错(比如“no start line”说明格式不对,“key values mismatch”说明不配对); - 用
openssl verify -CAfile fullchain.pem cert.pem验证证书链是否完整可信(需有完整中间证书); - 检查文件权限:Nginx 工作进程(通常是
www-data或nginx用户)必须有读取私钥的权限,但不能太宽松(如600较安全,644可接受,777会拒绝加载); - 确认没有重复定义
ssl_certificate(例如在 http 块和 server 块里都写了,后者生效,但容易误判)。
一个最小可运行 HTTPS server 示例
配好后,可用这个极简配置验证是否跑通:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 200 "HTTPS OK";
}
- 保存后执行
sudo nginx -t && sudo systemctl reload nginx; - 用
curl -I https://example.com或浏览器访问,状态码 200 且无证书警告,就说明配对成功、服务正常。

















