我正在使用Spring Rest Template
来调用托管在SSL端点上的REST服务。在第一个请求之后,我收到以下错误。环境为AWS EC2,Open JDK 1.8.161
,Linux
。端点仅支持TLSv1.2
和1.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
任何指导将不胜感激= !!
答案 0 :(得分:1)
这很像协议问题。 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);
您可以找到如何根据春季版本调整模板。强制客户端仅就允许的协议进行协商将解决此问题。
答案 1 :(得分:0)
我使用了这些属性-
"-Djsse.enableSNIExtension=false"
,
从命令行删除该属性后,问题解决了。
java -Djsse.enableSNIExtension=false -jar app.jar
java -jar app.jar