banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

SSL証明書の検証を無視する方法:javax.net.ssl.SSLHandshakeException

// 完整なエラーメッセージ
javax.net.ssl.SSLHandshakeException: PKIX パスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットの有効な認証パスを見つけることができません

このエラーは、SSL/TLS ハンドシェイクのプロセス中に、クライアントがサーバーの SSL 証明書を検証できないことを意味します。原因は次のとおりです:

  • サーバー証明書がクライアントに信頼されていない:サーバーの SSL 証明書が、クライアントに信頼されていない証明書発行機関(CA)によって発行されている可能性があります。または、証明書が期限切れです。
  • ネットワークの問題:一部の場合、クライアントとサーバー間のネットワーク接続に問題があると、SSL ハンドシェイクが失敗する場合があります。

証明書の解決策#

それはサーバー側で解決することですが、通常は他の人の API を呼び出しているため、相手の 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オブジェクトがあります
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。