更新nginx证书后,报错:html
$ 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
由于nginx首先须要用私钥去解密服务器证书,解不了。
解决办法:shell
~]# openssl x509 -in /path/to/yourdomain.crt -noout -modulus | openssl sha1 ~]# openssl rsa -in /path/to/yourdomain.key -noout -modulus | openssl sha1
若是获取的模数值相等则表示该密钥与证书匹配。不相等则表示不匹配,不匹配时你须要仔细从新操做一遍了。
浏览器
有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另一些浏览器却接受它们。这是因为证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构受权代为签发证书,可是它们本身却不被普遍认知,因此有些客户端不予识别。针对这种状况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和本身的关系,须要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书须要出如今认证方证书链的前面:服务器
正确的证书链链接顺序应该是: 你的服务器证书
->中间证书(签署你服务器证书的机构)
->根证书
dom
通常申请证书后,若是申请的机构不是根CA,都会提供两个证书文件,一个为你所申请的域名证书,另外一个则是机构被上一层机构(可能中间有好个个中间机构,最后才是根CA)签署的证书,这里须要根据上面的顺序合并成一个新的证书文件,这才是能够正常使用的。code
~]# cat www.example.com.crt bundle.crt > www.example.com.chained.crt
通常状况下根证书
是能够省略的,由于默认全部的客户端都嵌入了根证书
,因此没有必要在服务器端使cpu在运转一次。server
解决办法:
检查证书链顺序,并修改为正确顺序便可。htm
~]# 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.comblog
参考文档: