[symptom]
最近工作關係,需要串接財政部的發票明細API, domain為 https://www.einvoice.nat.gov.tw/使用 HttpClient 執行 HttpGet方法時,
卻發生 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 的exception
[root cause]
查了一下,原因是要進行request的url使用https加密連線方法,但因為java client使用的certification資訊太舊,不認得較新的SSL認證,
所以便發生了SSLPeer Unverified的問題
[solution]
此時,需要更新client端的SSL certification資訊。下面簡單說明一下步驟:
1. 先開啟一個瀏覽器(我用的是chrome),連至目標的url, 然後透過瀏覽器把這個網站的SSL認識資訊匯出, 獲得一個 sitename.cer 檔, ,
在這裡應該會看到一個 cacerts 的檔案, 它就是我們需要更新的憑證檔
3. 執行
keytool -import -keystore cacerts -alias <any Unique Name> -file <filepath>\sitename.cer" -storepass changeit
其中, 以下請改成自己的設定:
<any Unique Name>為這個新增憑證的別名, 不能與其他別名重覆,
<filepath> 為剛剛你匯出sitename.cer 所儲存的路徑
4. 指令會請你確認是否要加入此憑證資訊, 輸入 "y" 進行確認
然後你就會看到 "Certificate was added to keystore" 的資訊, 表示成功
5. 再次執行java的部份,應該就可以成功通過https的連線了
※ 若仍然無法解決 SSLPeerUnverifiedException,代表憑證檔可能沒有成功更新,請檢查一下你的java runtime是否就是你剛剛所更新的jre版本,像我自己就有jre6, jre7, jdk等幾個環境。
沒有留言:
張貼留言