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