ssl证书链

aa

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

1、私钥与认证事后与证书不匹配

由于nginx首先须要用私钥去解密服务器证书,解不了。
解决办法:shell

~]# openssl x509 -in /path/to/yourdomain.crt -noout -modulus | openssl sha1 
~]# openssl rsa -in /path/to/yourdomain.key -noout -modulus | openssl sha1

若是获取的模数值相等则表示该密钥与证书匹配。不相等则表示不匹配,不匹配时你须要仔细从新操做一遍了。

浏览器

2、证书链接的顺序不正确

有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另一些浏览器却接受它们。这是因为证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构受权代为签发证书,可是它们本身却不被普遍认知,因此有些客户端不予识别。针对这种状况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和本身的关系,须要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书须要出如今认证方证书链的前面:服务器

正确的证书链链接顺序应该是: 你的服务器证书->中间证书(签署你服务器证书的机构)->根证书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

参考文档:

相关文章
相关标签/搜索