OkHttpのすべての証明書を信頼する
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);
また、新しいBuilderのHostnameVerifierを、検証メソッドが常にtrueを返すnewHostnameVerifierオブジェクトに設定します。
最後に、新しい OkHttpClient オブジェクトを取得し、エラーなしで不正な証明書を使用してサイトを再度呼び出すことができます。
OkHttpClient newClient = newBuilder.build();
newClient.newCall(new Request.Builder().url("https://expired.badssl.com/").build()).execute();
5. 結論
この短い記事では、すべての証明書を信頼するようにOkHttpClientを作成および構成する方法を見てきました。 もちろん、すべての証明書を信頼することはお勧めしません。 ただし、必要になる場合もあります。
この記事の完全なコードは、GitHubでから入手できます。