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
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) –
@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. –
@RomanVottner Hier ist ein Protokollausschnitt für beide: https://pastebin.com/6b8LWT4D –