Java «Удаленное соединение закрытое соединение во время рукопожатия» с использованием Bittrex HTTP API - PullRequest
0 голосов
/ 29 августа 2018

Я неожиданно получаю эти ошибки при выполнении HTTP-запросов:

Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1002)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:290)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:259)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:138)
... 24 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:505)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
... 41 more

Так было не всегда, какое-то время работало нормально. Затем я использовал для тестирования разные библиотеки и даже другой проект IntelliJ, но те же проблемы. Вещи, которые я пробовал:

  • Изменение используемой конечной точки
  • Установка версии TLS на TLSv1.2 (как я обнаружил при выполнении запроса браузера)

Я могу нормально загрузить конечную точку с помощью браузера и почтальона. Мой код (с использованием библиотеки Unirest):

System.setProperty("https.protocols", "TLSv1.2");
System.out.println(Unirest.get("https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-ltc").asString().getBody());

Я в растерянности относительно того, что может быть причиной этой проблемы, и это очень расстраивает. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Обновление до JDK10 исправило проблему. См. Выбранный ответ и его ветку комментариев для получения дополнительной информации.

1 Ответ

0 голосов
/ 30 августа 2018

Сначала включите Отладка SSL : -Djavax.net.debug = all

Перенаправьте стандартный вывод вашего кода в файл и проверьте его на наличие ошибок при рукопожатии.

Если вы изучите URL, который вы используете с nmap или openssl:

nmap --script ssl-enum-ciphers -p <port> <host>

или

openssl s_client -connect <host>:<port>

(хост: bittrex.com, порт: 443)

видно, что используется шифр TLSv1.2 и ECDHE-ECDSA-AES128-GCM-SHA256:

New, TLSv1/SSLv3, Cipher is ECDHE-ECDSA-AES128-GCM-SHA256
Server public key is 256 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-ECDSA-AES128-GCM-SHA256

В зависимости от версии JDK может потребоваться установить расширение JCE и / или указать этот шифр.

Чтобы быть уверенным, вы должны распечатать текущие поддерживаемые шифры, используя этот маленький код Java. Если ECDHE-ECDSA-AES128-GCM-SHA256 нет в списке, это ваша проблема.

...