1. 概要

このチュートリアルでは、すべての証明書を信頼するようにOkHttpClientを作成および構成する方法を説明します

ライブラリの詳細については、OkHttpに関するの記事をご覧ください。

2. Mavenの依存関係

OkHttp依存関係をpom.xmlファイルに追加することから始めましょう。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.2</version>
</dependency>

3. 通常のOkHttpClientを使用します

まず、標準の OkHttpClient オブジェクトを取得し、有効期限が切れた証明書を使用してWebページを呼び出します。

OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

スタックトレースの出力は次のようになります。

sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed

次に、自己署名証明書を使用して別のWebサイトを試したときに受信したエラーを見てみましょう。

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

そして、間違ったホスト証明書を持つWebサイトを試してみましょう。

Hostname wrong.host.badssl.com not verified

ご覧のとおり、デフォルトでは、サイトに不正な証明書を呼び出すと、OkHttpClientはエラーをスローします。 次に、すべての証明書を信頼するようにOkHttpClientを作成および構成する方法を説明します。

4. すべての証明書を信頼するようにOkHttpClientを設定する

メソッドをオーバーライドすることでデフォルトの証明書検証を無効にする単一のX509TrustManagerを含むTrustManagerの配列を作成しましょう。

TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
        }

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

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
        }
    }
};

このTrustManagerの配列を使用して、SSLContextを作成します。

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

次に、この SSLContext を使用して、OkHttpClientビルダーのSSLSocketFactory設定します。

OkHttpClient.Builder newBuilder = new OkHttpClient.Builder();
newBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]);
newBuilder.hostnameVerifier((hostname, session) -> true);

また、新しいBuilderHostnameVerifierを、検証メソッドが常にtrueを返すnewHostnameVerifierオブジェクトに設定します。

最後に、新しい OkHttpClient オブジェクトを取得し、エラーなしで不正な証明書を使用してサイトを再度呼び出すことができます。

OkHttpClient newClient = newBuilder.build();
newClient.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();

5. 結論

この短い記事では、すべての証明書を信頼するようにOkHttpClientを作成および構成する方法を見てきました。 もちろん、すべての証明書を信頼することはお勧めしません。 ただし、必要になる場合もあります。

この記事の完全なコードは、GitHubから入手できます。