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

參考文檔:

相關文章
相關標籤/搜索