2017-11-21 2 views
1

Ich versuche, mit einem externen Webservice zu integrieren und es ein Zertifikat mit TLS 1.0-Protokoll verwenden.Spring Integration: Erzwingen Webservice Outbound-Gateway TLSv1 verwenden

Ich habe versucht Einstellung -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2,SSLv3, aber das Outbound-Gateway verwendet immer noch TLSv1.2. Es funktioniert korrekt, wenn ich die Option auf TLSv1 nur beschränken, aber ich kann das nicht tun, da ich zu vielen externen Diensten integriere.

Wie können Sie das Protokoll auf dem Outbound-Gateway selbst festlegen?

Ich habe versucht, mit diesem Code zu tun, aber ich eine Ausnahme lief:

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); 

Ausnahme:

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

Sie wollen vielleicht [SSL-Debugging aktivieren] (https://docs.oracle.com/javase/7/docs/technotes/guides/security/ jsse/ReadDebug.html) um zu sehen, was die Ausnahme verursacht. Aufgrund der Unsicherheit bestimmter Verschlüsselungscodes gibt es fast (wenn überhaupt) sichere Verschlüsselungscodes, die TLSv1/1.1 verwenden kann. In der Regel verhindert das Fehlen sicherer Verschlüsselungen einen nachfolgenden SSL-Handshake. Die Aktivierung des TLSv1-Protokolls kann daher [nicht ausreichen] (https://stackoverflow.com/questions/46356762/enable-tlsv1-ciphers-in-spring-boot) –

+0

@RomanVottner Die Chiffre ist verfügbar. Das Problem ist, dass wenn ich TLSv1 zusammen mit den anderen Protokollen aktiviere, es fehlschlägt, weil die Anwendung TLSv1.2 standardmäßig verwendet. Aber wenn ich nur TLSv1 alleine aktiviere, funktioniert es. Der Hauptunterschied ist 'ClientHello, TLSv1.2' für die ehemalige und' ClientHello, TLSv1' für letztere. Letztere überprüft am Ende das korrekte Zertifikat. –

+0

@RomanVottner Hier ist ein Protokollausschnitt für beide: https://pastebin.com/6b8LWT4D –

Antwort

2

ich an der zugehörigen Dokumentation für HttpComponentsMessengerSender gesucht und gefunden HttpComponentsMessageSender.RemoveSoapHeadersInterceptor

HttpClient HttpRequestInterceptor-Implementierung, die Content-Length und Transfer-Encoding entfernt Header aus der Anfrage. Dies ist erforderlich, da einige SAAJ- und andere SOAP-Implementierungen diese Header selbst festlegen und HttpClient eine Ausnahme auslöst, wenn sie festgelegt wurde.

Die Lösung ist, es zu den Interzeptoren von HttpComponentsMessengerSender hinzuzufügen.

Die endgültige Version des Absenders:

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

HttpComponentsMessageSender sender = new HttpComponentsMessageSender(httpClient);