自簽證書:請求第三方自簽名https證書報錯:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
使用 ssl 連接時,遇到不信任的證書,應用程序一般都會拒絕連接。
瀏覽網站時,我們可以通過在瀏覽器的設置中導入證書,把證書加入到信任列表中。
而在 JAVA 直接進行 SSL 連接應用時,默認沒有一個界面來導入證書。JAVA 進行不信任的 ssl 連接時,會報如下異常:
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
發現報錯后,才知道對方用的是自簽名證書。
於是向對方要了:server.cer 證書
原理:
Java 使用了一種叫 keystore 的文件來存儲證書 (默認是位於 $JAVA_HOME/lib/security/cacerts ) 。
該文件使用 keytool 工具去管理 (該工具默認位於 $JAVA_HOME/bin/keytool )。
keytool 工具的使用不在這里展開,網上有比較詳細的說明。這里主要列舉幾個會用到的命令。
列出 keystore 中的證書
keytool -list
默認情況下,它會在你的 $HOME 目錄下產生一個空的 .keystore 文件。如要指定 Java 正在用的 keystore 文件,使用以下參數
keytool -list -keystore $JAVA_HOME/lib/security/cacerts
注意一下, keystore 文件都受 密碼 保護。生成新的 keystore 文件時,會要求你輸入一個新密碼;而當訪問一個已有的 keystore 文件時,會要求你驗證密碼。
$JAVA_HOME/lib/security/cacerts 的默認密碼為 “changeit” !!!
$JAVA_HOME/lib/security/cacerts 的默認密碼為 “changeit” !!!
$JAVA_HOME/lib/security/cacerts 的默認密碼為 “changeit” !!!
重要的事情說三遍!!!
我的java環境目錄是:
/home/centos/jdk1.8.0_161
導入證書一:
keytool -import -alias <證書別名> -keystore $JAVA_HOME/jre/lib/security/cacerts -file your.crt
導入證書二:
我是進入到:/home/centos/jdk1.8.0_161/jre/lib/security,然后執行
/home/centos/jdk1.8.0_161/bin/keytool -import -alias payServer -keystore cacerts -file /root/server.cer
安裝時,請輸入:yes
最后一步
重啟web服務