Я пытаюсь принять все сертификаты и/или принять самозаверяющие сертификаты, используя Apache HTTPClient версии 4.5 (ссылка на учебник здесь)
Я рассматривал решение этой проблемы из множества постов на SO. Пока что ни один из них не работал.
Я получаю эту ошибку: Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Документы Apache:
- Учебник по Apache v4.5
- Настройка SSL/TLS
- В Apache есть руководство для версии 3, но нет версии 4.
Вопросы по Qaru - Вот несколько ссылок на решения, которые я пробовал:
- Игнорирование SSL-сертификата в Apache HttpClient 4.3
- Как игнорировать ошибки SSL-сертификата в Apache HttpClient 4.0
- Игнорировать ошибки сертификатов SSL с помощью Java
- Нужно доверять всем сертификатам при разработке с использованием Spring
- Как обрабатывать недействительные сертификаты SSL с помощью Apache HttpClient?
Обратите внимание, что во всех этих примерах я также передаю хранилище файлов cookie и поставщик учетных данных прокси, который я определил ранее. Они работают, я просто пытаюсь добавить поддержку SSL.
Попробуйте # 1
Создайте свой собственный контекст ssl с SSLContextBuilder
и доверьтесь всем самоподписанным стратегиям с TrustSelfSignedStrategy
.
SSLContextBuilder sshbuilder = new SSLContextBuilder();
sshbuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sshbuilder.build());
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.build();
РЕЗУЛЬТАТ: не сработало. Получил Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Попробуйте №2
То же, что и выше, но добавьте PoolingHttpClientConnectionManager
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslsf)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(2000);//max connection
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.setConnectionManager(cm)
.build();
РЕЗУЛЬТАТ: не сработало. Получил Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Попробуйте №3
Просто примите ВСЕ сертификаты, переопределив TrustStrategy
(это не рекомендуется)
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
});
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslsf)
.build();
РЕЗУЛЬТАТ: не сработало. Получил Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
Попробуйте # 4
Я нашел что-то полезное из этого ответа:
Начиная с версии 4.5, HttpClient отключает версию протокола SSLv3 по умолчанию
Вот решение, которое он дал:
SSLContext sslcontext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1", "SSLv3" }, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.setDefaultCookieStore(cookieStore)
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
РЕЗУЛЬТАТ: не сработало. Получил Error while trying to execute request. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake