次の例外が発生します。
javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
私はいくつかの調査を行い、接続コードを次のように変更しました。
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
return true;
}
}).build();
CloseableHttpClient client = HttpClients.custom()
.setRedirectStrategy(new LaxRedirectStrategy())
.setSslcontext(sslContext)
.setConnectionManager(connMgr)
.build();
これでこれまでのところ問題が修正され、例外が発生しなくなり、接続が機能します。
Tomcatで実行されているサーブレットで同じコードを使用すると、問題が再び発生します。
どうして ?
次のコードを試してください。
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class DummyX509TrustManager implements X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString)
throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString)
throws CertificateException {
}
};
final TrustManager[] trustAllCerts = new TrustManager[] { new DummyX509TrustManager() };
try {
SSLContext sslContext= SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, null);
CloseableHttpClient client = HttpClients.custom()
.setRedirectStrategy(new LaxRedirectStrategy())
.setSslcontext(sslContext)
.setConnectionManager(connMgr)
.build();
} catch (KeyManagementException e) {
throw new IOException(e.getMessage());
} catch (NoSuchAlgorithmException e) {
throw new IOException(e.getMessage());
}
Webサイト証明書は、個人/会社所有のCAによって発行されたものですか、それとも自己署名ですか?
... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ...
したがって、Tomcatはあなたの SSLContext を無視したようです。そのように使用すると、sslContextはとにかく役に立たない。結果をデバッグしますか? JVM SSL設定?例外スタックトレース?