更新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
參考文檔: