私は外部Webサービスと統合しようとしており、TLS 1.0プロトコルで証明書を使用しています。Spring統合:TLSv1を使用するWebサービスアウトバウンドゲートウェイを強制的に実行する
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2,SSLv3
を設定しようとしましたが、発信ゲートウェイには依然としてが使用されています。私はちょうどオプションを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
あなたがしたい場合があります[SSLデバッグを有効](https://docs.oracle.com/javase/7/docs/technotes/guides/security/ jsse/ReadDebug.html)を使用して、例外の原因を調べます。特定の暗号の不安定さのため、TLSv1/1.1が使用するために残された安全な暗号はほとんど(まったく存在する)暗号化されています。通常、安全な暗号がないと、後続のSSLハンドシェイクが防止されます。したがって、TLSv1プロトコルを有効にするだけでは不十分です(https://stackoverflow.com/questions/46356762/enable-tlsv1-ciphers-in-spring-boot) –
@RomanVottner暗号が利用可能です。問題は、他のプロトコルと一緒にTLSv1を有効にすると、アプリケーションがデフォルトでTLSv1.2を使用するために失敗するということです。しかし、TLSv1だけを有効にすれば、それは機能します。 主な違いは、前者の場合は「ClientHello、TLSv1.2」、後者の場合は「ClientHello、TLSv1」です。後者は、正しい証明書を最後に検証することになります。 –
@RomanVottnerここに、両方のログスニペットがあります:https://pastebin.com/6b8LWT4D –