問題報錯

今天上線了我開發的一個OAuth2單點登入客戶端的實現,在測試系統驗證沒問題,到生產環境由於單點登入服務端HTTPS協議,報錯如下:

I/O error on POST request for "xxx.xxx.xxx.xxx:8080": sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is 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

導致報錯的原因是 HTTPS 域名的公鑰證書不在 JDK/JRE 的證書庫中,被Java認為是不可信的。

解決方案

1、匯出證書

首先需要獲取 HTTPS 域名的公鑰證書,可以通過瀏覽器匯出,如下是 Chrome 瀏覽器匯出百度的公鑰證書。

2、上傳證書到伺服器

如果是本地 JDK 則不需要此步驟。我把CA.cer上傳到了 Linux 伺服器的 /root

3、為 keytool 授予執行許可權

防止 keytool 沒有操作許可權。

sudo chmod +x ${JDK目錄}/bin/keytool

4、匯入證書

Java 證書庫檔案的路徑為 ${JDK目錄}/jre/lib/security/cacerts,以下命令公鑰證書放在 /root/CA.cer

${JDK目錄}/bin/keytool -import \
-alias cacerts -keystore ${JDK目錄}/jre/lib/security/cacerts \
-file /root/CA.cer

順序輸入 yes + 回車 與 changeit +回車,完成證書匯入。

yes 表示允許信任此證書,changeit 是 Java 證書庫預設的密碼。

5、重啟 Java 服務

這我就不多說了,懂得都懂 :happy:

最後

希望對您能有所啟發,如果您有更優雅的實現方式 或者 文中有錯誤,希望您能不吝賜教評論指出,感謝。

本文同步釋出於部落格園(東北小狐狸 https://www.cnblogs.com/hellxz/)與CSDN(東北小狐狸-Hellxz https://blog.csdn.net/u012586326)禁止轉載。