【发布时间】:2017-11-21 09:00:58
【问题描述】:
我正在尝试与外部 Web 服务集成,它使用具有 TLS 1.0 协议的证书。
我已尝试设置-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2,SSLv3,但出站网关仍使用TLSv1.2。如果我只是将选项限制为TLSv1,它可以正常工作,但我不能这样做,因为我正在集成到很多外部服务。
如何设置出站网关本身的协议?
我尝试使用此代码执行此操作,但遇到了异常:
SimpleWebServiceOutboundGateway handler = new SimpleWebServiceOutboundGateway(url);
HttpComponentsMessageSender sender = new HttpComponentsMessageSender();
SSLContext sslContext = SSLContext.getDefault();
sslContext.getDefaultSSLParameters().setProtocols(new String[]{"TLSv1"});
CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
sender.setHttpClient(httpClient);
handler.setMessageSender(sender);
例外:
Caused by: org.apache.http.client.ClientProtocolException: null
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.springframework.ws.transport.http.HttpComponentsConnection.onSendAfterWrite(HttpComponentsConnection.java:121)
at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:48)
at org.springframework.ws.client.core.WebServiceTemplate.sendRequest(WebServiceTemplate.java:658)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:606)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
... 91 common frames omitted
Caused by: org.apache.http.ProtocolException: Content-Length header already present
at org.apache.http.protocol.RequestContent.process(RequestContent.java:97)
at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:133)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:182)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
... 99 common frames omitted
【问题讨论】:
-
您可能想enable SSL debugging 以查看导致异常的原因。由于某些密码的不安全性,几乎(如果有的话)安全密码留给 TLSv1/1.1 使用,通常缺乏安全密码会阻止成功的 SSL 握手。因此,仅启用 TLSv1 协议可能not be enough
-
@RomanVottner 密码可用。问题是,如果我启用 TLSv1 和其他协议,它会失败,因为应用程序默认使用 TLSv1.2。但如果我只启用 TLSv1 就可以了。主要区别在于前者为
ClientHello, TLSv1.2,后者为ClientHello, TLSv1。后者最后会验证正确的证书。 -
@RomanVottner 这是两者的日志 sn-p:pastebin.com/6b8LWT4D
标签: java spring web-services spring-integration