POST请求的I/O错误...java.net.SocketException:连接被重置

12

我正在使用Spring Rest Template调用一个托管在SSL终端的REST服务。在第一次请求后,我得到了以下错误信息。环境是AWS EC2,Open JDK 1.8.161Linux。该终端仅支持TLSv1.21.3

 org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://mycompany.com": Connection reset; nested exception is java.net.SocketException: Connection reset
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:743)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:686)
        at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:437)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    ... more stack here
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
    at .....
    ... 107 common frames omitted

任何指导将不胜感激=!!

这是完整的堆栈跟踪吗? - Blagoj Atanasovski
请同时发布您的Java代码。 - samabcde
连接是否为“Keep-Alive”?您可以从响应头中检查。如果是,那么“Keep-Alive”参数是什么?例如:Keep-Alive: timeout=10, max=20。 - Unknown
那是我的第一反应。我在这里遇到了同样的问题,现在正在使用保持连接和连接池部署更改以尝试解决该问题。我的环境完全支持TLS1.2,并且在AWS ec2上运行。 - Garis M Suero
请展示您的 RestTemplate 配置?您是否已经配置了 SSL? - Urosh T.
这是RestTemplate构建器的默认配置。 - Garis M Suero
2个回答

18
这似乎是协议问题。 AWS完全支持TLS 1.2或更高版本,但客户端不支持。 如果未进行其他配置,则Rest Template将开始与TLS 1.0进行协商。 您必须强制使客户端仅使用1.2或1.3协议堆栈连接。通常可以在创建客户端时进行配置。类似于以下内容:
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, null, null);

CloseableHttpClient httpClient = HttpClientBuilder.create().setSSLContext(context)
    .build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);

你可以找到如何根据Spring版本调整模板的方法。强制客户端仅协商允许使用的协议将解决此问题。


完全明白,我上周已经解决了这个问题。我将HTTP客户端移动到我们软件的默认设置(OkHttp),并指定TLS版本始终为1.2。谢谢! - Garis M Suero

0

我使用了那些属性 -

"-Djsse.enableSNIExtension=false",

问题在将该属性从命令行中移除后得到解决。
java -Djsse.enableSNIExtension=false -jar app.jar

java -jar app.jar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接