// 完整なエラーメッセージ
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オブジェクトがあります