更新nginx证书后,报错:
$ nginx -t
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/usr/local/nginx/conf/ssl/allzainanjing365.com.key")
failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
出现如下错误只有两种可能:
一、私钥与认证过后与证书不匹配
因为nginx首先需要用私钥去解密服务器证书,解不了。
解决办法:
~]# openssl x509 -in /path/to/yourdomain.crt -noout -modulus | openssl sha1
~]# openssl rsa -in /path/to/yourdomain.key -noout -modulus | openssl sha1
如果获取的模数值相等则表示该密钥与证书匹配。不相等则表示不匹配,不匹配时你需要仔细重新操作一遍了。
二、证书连接的顺序不正确
有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另外一些浏览器却接受它们。这是由于证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构授权代为签发证书,但是它们自己却不被广泛认知,所以有些客户端不予识别。针对这种情况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和自己的关系,需要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书需要出现在认证方证书链的前面:
正确的证书链连接顺序应该是: 你的服务器证书
->中间证书(签署你服务器证书的机构)
->根证书
一般申请证书后,如果申请的机构不是根CA,都会提供两个证书文件,一个为你所申请的域名证书,另一个则是机构被上一层机构(可能中间有好个个中间机构,最后才是根CA)签署的证书,这里需要根据上面的顺序合并成一个新的证书文件,这才是可以正常使用的。
~]# cat www.example.com.crt bundle.crt > www.example.com.chained.crt
一般情况下根证书
是可以省略的,因为默认所有的客户端都嵌入了根证书
,所以没有必要在服务器端使cpu在运转一次。
解决办法:
检查证书链顺序,并修改成正确顺序即可。
~]# openssl s_client -connect www.cnblogs.com:443
...
Certificate chain
0 s:/CN=*.cnblogs.com
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1 #中间签署cnblogs.com的机构CA
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA #根CA
---
证书完整性验证:https://whatsmychaincert.com
参考文档: