2017-11-21 22 views
1

私は外部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 
+0

あなたがしたい場合があります[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) –

+0

@RomanVottner暗号が利用可能です。問題は、他のプロトコルと一緒にTLSv1を有効にすると、アプリケーションがデフォルトでTLSv1.2を使用するために失敗するということです。しかし、TLSv1だけを有効にすれば、それは機能します。 主な違いは、前者の場合は「ClientHello、TLSv1.2」、後者の場合は「ClientHello、TLSv1」です。後者は、正しい証明書を最後に検証することになります。 –

+0

@RomanVottnerここに、両方のログスニペットがあります:https://pastebin.com/6b8LWT4D –

答えて

2

私はHttpComponentsMessengerSenderのために、関連するドキュメンテーションを見て、HttpComponentsMessageSender.RemoveSoapHeadersInterceptor

を見つけましたContent-LengthおよびTransfer-Encodingを削除するHttpClient HttpRequestInterceptorの実装要求のヘッダー。いくつかのSAAJや他のSOAP実装がこれらのヘッダーを自分で設定し、HttpClientが設定されていると例外をスローするため、必要です。

解決策は、HttpComponentsMessengerSenderのインターセプタに追加することです。

送信者の最終バージョンは次のとおりです。

SSLContext sslContext = SSLContexts.custom().useProtocol("TLSv1").build(); 
CloseableHttpClient httpClient = HttpClients.custom() 
      .setSSLContext(sslContext) 
      .addInterceptorFirst(new 
HttpComponentsMessageSender.RemoveSoapHeadersInterceptor()) 
      .build(); 

HttpComponentsMessageSender sender = new HttpComponentsMessageSender(httpClient); 
関連する問題