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