使用Bittrex HTTP API的Java“远程主机关闭握手期间连接”(Java “Remote

2019-11-05 03:52发布

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固定的问题。 请参阅选择答案,它的评论主题的更多信息。

Answer 1:

首先,打开SSL调试 :-Djavax.net.debug =所有

重定向代码的标准输出到一个文件,并检查它周边的握手错误。

如果您检查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扩展和/或指定这个暗号。

可以肯定,你应该使用打印出当前支持cyphers 这一点java代码。 如果ECDHE-ECDSA-AES128-GCM-SHA256没有上市,这是你的问题。



文章来源: Java “Remote host closed connection during handshake” using Bittrex HTTP API
标签: java unirest