ssl证书链


aa

更新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

参考文档:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM