Nginx 加载证书报 key values mismatch:核对叶证书顺序与私钥
Nginx 更新 HTTPS 证书后报 key values mismatch,按配置实际路径、公钥配对和叶证书顺序区分原因,检查通过后再重载。
更新 HTTPS 证书后,Nginx 在配置检查或启动时出现 SSL_CTX_use_PrivateKey_file、key values mismatch。先核对配置实际读取的证书与私钥,再检查证书链第一张是否为本站的叶证书。这个错误表示加载的证书公钥与私钥无法配对,单凭它不能判断是文件放错还是链顺序不对。
本文适用于 Nginx 使用 PEM 证书文件和独立私钥的场景。下文公钥检查使用 OpenSSL 3.0 的命令接口,可用于常见 RSA、ECDSA 密钥;硬件密钥、远程密钥服务和其他专用加载方式应按对应配置检查。
先确认 Nginx 读的是哪两个文件
检查发生错误的 server 中 ssl_certificate 与 ssl_certificate_key 的实际路径,也检查被包含的配置、软链接和部署脚本有没有仍指向旧文件。磁盘上某一对文件匹配,不等于 Nginx 正在读取那一对。
证书续期或更换供应商时,新证书不一定沿用旧私钥。文件名相似、域名相同以及文件权限正确,都不能证明配对关系。如果日志说的是 Permission denied 或无法打开文件,应先处理相应的路径和访问权限问题,不能用调整证书顺序解决。
不要先停止现有服务再尝试新配置。保留正在使用的证书、私钥和配置,先完成配置检查;私钥备份仍应按原来的访问控制保护。
比较公钥,不输出私钥内容
以下路径是示例。server-chain.pem 应替换为配置实际使用的证书文件,server.key 替换为对应私钥;输出文件放在自己新建的诊断目录中,使用尚未占用的文件名:
openssl x509 -in /path/server-chain.pem -noout -subject -issuer
openssl x509 -in /path/server-chain.pem -pubkey -noout -out cert-public.pem
openssl pkey -in /path/server.key -pubout -out key-public.pem
openssl dgst -sha256 cert-public.pem key-public.pem
第一条显示证书文件中首先被读取的证书身份,后两条只提取公钥。私钥带口令时,OpenSSL 可能要求交互输入;不要把口令直接写进命令或日志。
只有两次提取均成功、输出文件确实包含公钥时,比较哈希才有意义。命令失败或两个空文件得到相同哈希,不是配对成功。使用这里相同的 PEM 公钥输出方式,两个哈希一致说明这张证书与该私钥的公钥匹配;不一致则继续区分证书选错、私钥选错和链顺序错误。
不要把 openssl rsa -modulus 当作所有密钥类型的通用检查,也不要为了查看密钥而运行会将私钥本体输出到终端的命令。
叶证书正确,链第一张却是中间证书
Nginx 的证书文件需要先放域名的叶证书,再接中间证书链。若先放中间证书,Nginx 可能拿它的公钥与本站私钥比较,从而报 key values mismatch。
分别检查域名叶证书与私钥的公钥。如果它们匹配,而当前 ssl_certificate 文件第一张是中间证书,就重新按供应商提供的链关系生成文件:叶证书在前,中间证书按签发链顺序放在后面。不要在原文件上反复追加;另存候选文件,并保留旧文件以便恢复。
顺序正确但仍不匹配时,寻找申请这张叶证书时使用的私钥。CSR、证书和私钥是不同文件,不能把 CSR 填进 ssl_certificate_key。正确私钥遗失时,需要按证书供应商流程重新签发,而不是把另一把私钥改名后继续使用。
检查通过后再切换
用实际部署使用的 Nginx 可执行文件与配置运行 nginx -t。若有自定义配置路径,检查时也使用同一路径;检查成功后再按部署方式重载。
成功标准是配置检查不再出现密钥配对错误,公网 HTTPS 连接返回预期域名证书,证书链与有效期也符合要求。配置检查通过还不能证明浏览器一定信任整条链。如果随后出现缺少中间证书或过期错误,应继续检查链完整性和证书有效期。
切换失败时恢复先前匹配的证书、私钥和配置,再检查并重载;不要删除可恢复的私钥或通过关闭客户端证书校验掩盖问题。


