banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

如何忽略 SSL 证书验证:javax.net.ssl.SSLHandshakeException

// 完整的報錯信息
javax.net.ssl.SSLHandshakeException: PKIX 路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到有效的證書路徑到請求的目標

這個錯誤意味著在 SSL/TLS 握手過程中,客戶端無法驗證服務器的 SSL 證書。原因有:

  • 服務器證書不被客戶端信任:服務器的 SSL 證書可能未被客戶端信任的證書頒發機構(CA)簽發,或者證書已過期。
  • 網絡問題:在某些情況下,如果客戶端和服務器之間的網絡連接存在問題,也可能導致 SSL 握手失敗。

證書方面解決#

那就是在服務端解決了,但是一般我們都是調用被人的接口,對方的 SSL 證書有問題,我們也不能幫別人修改對吧

自己解決#

自己解決那就是忽略 SSL 證書驗證,但這會降低安全性,不建議使用,除非迫不得已

// 創建一個無需驗證SSL的OkHttpClient
public static OkHttpClient getClient() throws NoSuchAlgorithmException, KeyManagementException {
    TrustManager[] trustManagers = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            }
    };

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustManagers, new SecureRandom());

    final OkHttpClient client = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0])
            .hostnameVerifier((s, sslSession) -> true)
            .build();

    return client;
}

private final OkHttpClient client = getClient();

// 現在忽略SSL證書驗證的OKHttpClient對象就有了
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。