nginx 1.24 上换证书,把新域名证书和旧私钥拼在一起,nginx -t 报 SSL_CTX_use_PrivateKey_file() failed,openssl 检查提示 key values mismatch,reload 之后 443 直接连不上。
一开始怀疑是「私钥带了密码,nginx 启动时读不到明文内容」,查了一圈,方向不对。
原因不止一个,得分开看。证书和私钥不是同一对,公钥模数对不上。也可能是证书链文件里混进了别的站点证书,取到的是第一张的公钥。
少数情况下是证书是 ECC 而私钥是 RSA,算法都不一样。
第一件事是分别算出证书和私钥的公钥摘要
openssl x509 -noout -modulus -in fullchain.pem | openssl md5 && openssl rsa -noout -modulus -in privkey.pem | openssl md5
然后确认链里第一张就是站点证书
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | head -10
去掉私钥密码再验证一次
openssl rsa -in privkey.pem -out privkey.nopass.pem && openssl pkey -in privkey.nopass.pem -noout -text | head -3
末了重新校验配置并看端口
nginx -t && systemctl reload nginx && ss -lntp | grep 443
这次没动代码,只在配置和运行环境上找原因。
隔了一天再看,现象没变,说明不是偶发。
恢复的判定其实很直接。nginx -t 通过,openssl s_client 能拿到完整证书链,verify return code 是 0。
ECC 证书要用 openssl pkey 或 ec 查,用 rsa 子命令会直接报错,别被提示带偏;私钥给 600 权限、属主 root 就够了。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
