SSL鏈接一個很奇怪的錯誤

  • 背景

    1. git代碼相同,數據庫相同的情況下,測試版本報異常,但是本地的開發版沒有異常出現,同事電腦上的代碼和數據庫都一致,也報異常。一直搞不懂原因。聯想到最近換了SSL證書,排除證書過期,域名不一直以後,google之,得到答案,參考[這裏](https://stackoverflow.com/questions/26180650/unable-to-find-valid-certification-path-to-requested-target-but-browser-says),發現證書鏈在根證書中沒有被信任。
  • 異常報告

    1. 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
    2. Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    3. Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  • 異常原因

    • 原因一:你的SSL證書和域名不匹配

      1. 就是頒發的證書域名和你真正訪問的域名不一致
    • 原因二:證書鏈不完整

      1. 證書鏈由兩個環節組成—信任錨(CA 證書)環節和已簽名證書環節。自我簽名的證書僅有一個環節的長度—信任錨環節就是已簽名證書本身。
      2. 證書鏈可以有任意環節的長度,所以在三節的鏈中,信任錨證書CA 環節可以對中間證書籤名;中間證書的所有者可以用自己的私鑰對另一個證書籤名。CertPath API 可以用來遍歷證書鏈以驗證有效性,也可以用來構造這些信任鏈。
      3. 證書最初生成時是一個自簽名證書。自簽名證書是其簽發者(簽名者)與主題(其公共密鑰由該證書進行驗證的實體)相同的證書。如果擁有者向 CA 發送證書籤名請求 (CSR),然後輸入響應,自簽名證書將被證書鏈替換。鏈的底部是由 CA 發佈的、用於驗證主題的公共密鑰的證書(回覆)。鏈中的下一個證書是驗證 CA 的公共密鑰的證書。通常,這是一個自簽名證書(即,來自 CA、用於驗證其自身的公共密鑰的證書)並且是鏈中的最後一個證書。
      4. 在其他情況下,CA 可能會返回一個證書鏈。在此情況下,鏈的底部證書是相同的(由 CA 簽發的證書,用於驗證密鑰條目的公共密鑰),但是鏈中的第二個證書是由其他 CA 簽發的證書,用於驗證您向其發送了 CSR CA 的公共密鑰。然後,鏈中的下一個證書是用於驗證第二個 CA 的密鑰的證書,依此類推,直至到達自簽名的[根證書]。因此,鏈中的每個證書(第一個證書之後的證書)都需要驗證鏈中前一個證書的簽名者的[公共密鑰]。

      微信截圖_20180113110420.png

    • 根證書沒有被信任

      1. 證書鏈是由根證書-----CA-----已簽名證書這條證書鏈依次被信任,如果根證書不被信任,那麼由該根證書籤發的所有頒發者證書都不被信任,進而導致頒發者頒發的所有證書都不被信任
  • 解決辦法

    • 換個證書,換個JRE中默認被信任根證書籤發的CA證書頒發的證書(這裏提供jre中默認信任的證書列表)

      1. 算了,給出查找方法吧,在配置好java運行環境的情況下,
      2. windows運行
      3. keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts
      4. Linux運行
      5. keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
      6. 輸入密鑰庫口令: <直接回車>
      7. ***************** WARNING WARNING WARNING *****************
      8. * 存儲在您的密鑰庫中的信息的完整性 *
      9. * 尚未經過驗證! 爲了驗證其完整性, *
      10. * 必須提供密鑰庫口令。 *
      11. ***************** WARNING WARNING WARNING *****************
      12. 密鑰庫類型: JKS
      13. 密鑰庫提供方: SUN
      14. 您的密鑰庫包含 104 個條目
      15. ....
      16. 然後這裏會列出你所有的被信任的根證書頒發者
    • 手動將你的證書,CA證書和根證書引入到jre的信任列表中

      1. windows:
      2. keytool -import -alias my-cert -file c:\cert.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts
      3. linux:
      4. keytool -import -alias my-cert -file /your/cert/path/cert.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章