
文章插圖
問題現象
前些天第三方公司同我們公司開發的業務系統對接,調用我們系統的https接口時出現如下日志提示:
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 問題分析幾經周折,歷經磨難后發現,此類問題一般是證書本身或者jdk版本問題導致的 。解決問題的辦法也有幾種 。
第一種辦法:重新申請更換符合安全規范的證書 。(推薦)
第二種辦法:重寫SSLSocketFactory類,信任所有所有證書 。
public class HttpsClientUtil { private static ThreadSafeClientConnManager cm = null; // 多連接的線程安全的管理器 private static int MAX_TOTAL = 500; // 最大連接數 private static int defaultMaxConnection = 100; // 默認最大 主機連接數 public final static int CONNECT_TIMEOUT = 10000; // 連接超時時間 public final static int SOCKET_TIMEOUT = 90000; // 讀取數據超時時間 static {// 設置訪問協議SchemeRegistry schemeRegistry = new SchemeRegistry();schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));try {schemeRegistry.register(new Scheme("https", 443, getSSLSocketFactory()));} catch (KeyManagementException e1) {e1.printStackTrace();} catch (NoSuchAlgorithmException e1) {e1.printStackTrace();}cm = new ThreadSafeClientConnManager(schemeRegistry);try {cm.setMaxTotal(MAX_TOTAL);// 每條通道的并發連接數設置(連接池)cm.setDefaultMaxPerRoute(defaultMaxConnection);} catch (NumberFormatException e) {e.printStackTrace();} } public static HttpClient getHttpsClient() {HttpParams params = new BasicHttpParams();// HTTP 協議的版本,1.1/1.0/0.9params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);/* 連接超時 */HttpConnectionParams.setConnectionTimeout(params, CONNECT_TIMEOUT);/* 請求超時 */HttpConnectionParams.setSoTimeout(params, SOCKET_TIMEOUT);return new DefaultHttpClient(cm, params); } /*** 設置信任所有證書** @return* @throws KeyManagementException* @throws NoSuchAlgorithmException*/ private static SSLSocketFactory getSSLSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {// SSLContext ctx = SSLContext.getInstance("SSL");SSLContext ctx = SSLContext.getInstance("TLS");X509TrustManager tm = new X509TrustManager() {public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {}public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}};ctx.init(null, new TrustManager[] { tm }, null);SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);// 信任所有域名主機return ssf; } public static void release() {if (cm != null) {cm.shutdown();} }} 第三種辦法:把安全證書導入到java中cacerts證書庫 。廢話不多說,直接上干貨 。
第一步是要下載證書 建議使用谷歌瀏覽器,如下圖所示,點擊“小鎖” 。
證書下載
在“證書”頁面,點擊“復制到文件”按鈕,選擇https證書存放到的目錄位置 。
復制證書到文件
在“證書導出向導”頁面,選擇base64編碼 。
選擇編碼
導入證書 切換到jdk jre的/lib/security/下,執行如下命令:
keytool -import -alias test -keystore cacerts -file D://test.cer 說明:【如何導入證書 CA證書驗證信任關系時系統層】-alias 指定別名
-keystore 指定存儲文件
-file 指定證書文件所在的目錄
注意:當切換到 cacerts 文件所在的目錄時,才可指定 -keystore cacerts,否則應該指定全路徑 。此時命令行會提示你輸入cacerts證書庫的密碼,敲入changeit即可,這是java中cacerts證書庫的默認密碼 。
庫密鑰口令輸入:changeit
是否信任:y
證書導入成功 。
查看證書,密鑰默認是changeit
keytool -list -keystore cacerts -alias test 更新證書時,要先刪除原來的證書,然后導入新的證書 keytool -list -keystore cacerts keytool -delete -alias test -keystore cacerts keytool -import -alias test -file mytest.cer -keystore cacerts -trustcacerts以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫或請專業人士給予相關指導!
「愛刨根生活網」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助:- 如何使用GoldWave剪裁音樂制作個性鈴聲
- 如何在Photoshop中清除文檔中所選畫板參考線
- 如何在WPS文檔中插入折線圖
- 如何打造一個整潔有序的電腦桌面
- 如何下載和安裝方正仿宋簡體字體
- 如何批量在Excel中添加標題
- 如何在WORD文檔中插入多行多列的表格
- 如何在WPS文字中加入一個對話框
- 如何在PS中制作更生動的光線投射效果
- 如何在Win7中建立WiFi熱點,讓手機共享上網
