-
背景
在git代碼相同,數據庫相同的情況下,測試版本報異常,但是本地的開發版沒有異常出現,同事電腦上的代碼和數據庫都一致,也報異常。一直搞不懂原因。聯想到最近換了SSL證書,排除證書過期,域名不一直以後,google之,得到答案,參考[這裏](https://stackoverflow.com/questions/26180650/unable-to-find-valid-certification-path-to-requested-target-but-browser-says),發現證書鏈在根證書中沒有被信任。
-
異常報告
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
-
異常原因
-
原因一:你的SSL證書和域名不匹配
就是頒發的證書域名和你真正訪問的域名不一致
-
原因二:證書鏈不完整
證書鏈由兩個環節組成—信任錨(CA 證書)環節和已簽名證書環節。自我簽名的證書僅有一個環節的長度—信任錨環節就是已簽名證書本身。
證書鏈可以有任意環節的長度,所以在三節的鏈中,信任錨證書CA 環節可以對中間證書籤名;中間證書的所有者可以用自己的私鑰對另一個證書籤名。CertPath API 可以用來遍歷證書鏈以驗證有效性,也可以用來構造這些信任鏈。
證書最初生成時是一個自簽名證書。自簽名證書是其簽發者(簽名者)與主題(其公共密鑰由該證書進行驗證的實體)相同的證書。如果擁有者向 CA 發送證書籤名請求 (CSR),然後輸入響應,自簽名證書將被證書鏈替換。鏈的底部是由 CA 發佈的、用於驗證主題的公共密鑰的證書(回覆)。鏈中的下一個證書是驗證 CA 的公共密鑰的證書。通常,這是一個自簽名證書(即,來自 CA、用於驗證其自身的公共密鑰的證書)並且是鏈中的最後一個證書。
在其他情況下,CA 可能會返回一個證書鏈。在此情況下,鏈的底部證書是相同的(由 CA 簽發的證書,用於驗證密鑰條目的公共密鑰),但是鏈中的第二個證書是由其他 CA 簽發的證書,用於驗證您向其發送了 CSR 的 CA 的公共密鑰。然後,鏈中的下一個證書是用於驗證第二個 CA 的密鑰的證書,依此類推,直至到達自簽名的[根證書]。因此,鏈中的每個證書(第一個證書之後的證書)都需要驗證鏈中前一個證書的簽名者的[公共密鑰]。
-
根證書沒有被信任
證書鏈是由根證書-----CA-----已簽名證書這條證書鏈依次被信任,如果根證書不被信任,那麼由該根證書籤發的所有頒發者證書都不被信任,進而導致頒發者頒發的所有證書都不被信任
-
-
解決辦法
-
換個證書,換個JRE中默認被信任根證書籤發的CA證書頒發的證書(這裏提供jre中默認信任的證書列表)
算了,給出查找方法吧,在配置好java運行環境的情況下,
windows運行
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts
Linux運行
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
輸入密鑰庫口令: <直接回車>
***************** WARNING WARNING WARNING *****************
* 存儲在您的密鑰庫中的信息的完整性 *
* 尚未經過驗證! 爲了驗證其完整性, *
* 必須提供密鑰庫口令。 *
***************** WARNING WARNING WARNING *****************
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 104 個條目
....
然後這裏會列出你所有的被信任的根證書頒發者
-
手動將你的證書,CA證書和根證書引入到jre的信任列表中
windows:
keytool -import -alias my-cert -file c:\cert.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts
linux:
keytool -import -alias my-cert -file /your/cert/path/cert.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
-