Ошибка рукопожатия SSL — HttpClient 4.1.2

Я пытаюсь выполнить вызов API на сервере, но получаю ошибку рукопожатия SSL. Я использую библиотеку httpclient 4.1.2.

Вот как я создаю объект httpClient

System.setProperty("https.protocols","TLSv1");
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(null, null, null);

SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme httpsScheme = new Scheme("https", 443, sslSocketFactory);

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(httpsScheme);

ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry);

HttpClient httpClient = new DefaultHttpClient(cm);

Вот журналы рукопожатия SSL

trigger seeding of SecureRandom
done seeding SecureRandom
main, setSoTimeout(0) called
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
%% No cached client session
*** ClientHello, TLSv1
RandomCookie:  GMT: 1440191547 bytes = { 208, 238, 36, 204, 125, 170, 169, 142, 211, 115, 213, 236, 25, 69, 216, 182, 176, 189, 232, 38, 244, 13, 172, 17, 249, 254, 183, 21 }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
***
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT:  fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)
main, called close()
main, called closeInternal(true)
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at com.waseem.stuff.HttpClientExample2.sendPost(HttpClientExample2.java:107)
    at com.waseem.stuff.HttpClientExample2.main(HttpClientExample2.java:29)

person Waseem Akram Malik    schedule 03.03.2016    source источник
comment
Возможный дубликат ошибки SSL Peer Not Authenticated с HttpClient 4.1   -  person Robert    schedule 03.03.2016
comment
Я не думаю, что это дубликат. Я думаю, что это другое и как-то связано с несоответствием протокола SSL.   -  person Waseem Akram Malik    schedule 03.03.2016
comment
Если сервер подключен к Интернету, проверьте его возможности SSL с помощью онлайн-инструмента, такого как SSL Labs — ssllabs. .com/ssltest/index.html — чтобы определить, поддерживает ли он TLS1.0 или выше. В зависимости от вашей версии Java старые протоколы и небезопасные наборы шифров могут быть заблокированы вашим клиентом по умолчанию.   -  person Anand Bhat    schedule 04.03.2016
comment
Сервер не подключен к Интернету :( Он доступен в VPN. Мы попытались установить параметр JVM System.setProperty(https.protocols,TLSv1); и это сработало. Но мы не можем этого сделать, так как это изменение уровня проекта. Я хочу, чтобы некоторые способ установить протокол на TLSv1 в httpclient 4.1.2   -  person Waseem Akram Malik    schedule 04.03.2016


Ответы (1)


У меня была такая же проблема с использованием Rest Assured, и обновление моей библиотеки HTTP-клиента до 4.5.3 исправило ее.

person Hazel Troost    schedule 03.04.2017