Java https伺服器憑證認證問題解決方案
Java https串連的”unable to find valid certification path to requested target”,”PKIX path building failed”錯誤
問題原因
這個問題的是由於Java內建的根憑證庫中不包含HTTPS伺服器上的根憑證,因此無法得到認證。
解決方案
比較容易實現的方案有兩種:
匯入伺服器憑證到本地Java環境 代碼中忽略認證信任問題
由於第二種方案會導致安全性問題,因此並不推薦。
認證匯入注意事項
將伺服器的根憑證匯入到Java運行環境的根憑證庫中,能解決對應的伺服器https串連問題。
實現方式是使用$JAVA_HOME/jre/bin下的keytool工具將伺服器端的認證添加到jre/lib/security/cacerts檔案中。
需要注意的是:
確定當前Java程式所用的java運行環境jre的路徑(可能為jdk下的jre,也可能是單獨的jre)。 確定有jre/lib/security/cacerts檔案的寫入許可權(可以用管理員權限運行keytool)。詳細步驟:1. 擷取伺服器端的認證檔案
可以使用瀏覽器開啟伺服器網站頁面,然後匯出認證檔案,假設匯出的認證檔案為test.crt 。
2. 產生keystore檔案
利用keytool產生密鑰檔案keystore:
keytool -importcert -noprompt -trustcacerts -alias test -file test.cer -keystore ~/mykeystore
這裡會要求設定口令,設定後請記住口令 。
3. 匯入認證到Java運行時環境
將認證匯入jre/lib/security/cacerts:
keytool -importkeystore -srckeystore ~/keystore -destkeystore [path_to_jre]/lib/security/cacerts
會要求輸入目標密鑰庫口令(也就是jre/lib/security/cacerts 的口令,預設是changeit或者changeme),以及源密鑰庫口令(之前設定的口令).
最後會顯示是否匯入成功。如果成功則重啟Java程式。