После обновления до Spring Boot 3.4 от Spring Boot 2.5 мы начали получать 403 пропущенных аутентификации сертификата при вызове клиентской SOAP Service. У нас есть правильный магазин ключей и касерты. Мы можем получить ответ от API REST, размещенных на одном хосте. Вот мой класс конфигурации болота. Я попробовал несколько разных способов пройти хранилище ключей и TrustStore, но не могу понять, чего не хватает. Может кто -нибудь, пожалуйста, предложить, чего мне не хватает < /p>
@SpringBootConfiguration
@EnableAutoConfiguration
public class SoapConfiguration {
@Bean
public Jaxb2Marshaller awardsMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.google.get");
return marshaller;
}
@Bean
public AwardsClient awardsClient(Jaxb2Marshaller awardsMarshaller) throws Exception {
AwardsClient client = new AwardsClient();
client.setDefaultUri(kpmgUrl);
client.setMarshaller(awardsMarshaller);
client.setUnmarshaller(awardsMarshaller);
client.setMessageSender(getKpmgHttpComponentsMessageSender());
return client;
}
@Bean
public HttpComponents5MessageSender getKpmgHttpComponentsMessageSender() throws Exception {
final HttpComponents5MessageSender sender = new HttpComponents5MessageSender();
sender.setConnectionTimeout(Duration.ofMillis(kpmgConnectionTimeout));
sender.setReadTimeout(Duration.ofMillis(kpmgReadTimeout));
sender.setHttpClient(getKpmgHttpClient());
return sender;
}
@Bean
public HttpClient getKpmgHttpClient() throws Exception {
PoolingHttpClientConnectionManager httpClientConnectionManager;
SSLConnectionSocketFactory sslSocketFactory = getSSLConnectionSocketFactory();
httpClientConnectionManager = new PoolingHttpClientConnectionManager(
RegistryBuilder.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslSocketFactory).build());
httpClientConnectionManager.setDefaultMaxPerRoute(3000);
httpClientConnectionManager.setMaxTotal(4000);
httpClientConnectionManager.setDefaultConnectionConfig(ConnectionConfig.custom().setValidateAfterInactivity(TimeValue.ofMilliseconds(120000))
.setConnectTimeout(Timeout.ofMilliseconds(3000)).build());
HttpClientBuilder httpClientBuilder = HttpClients.custom()
.setConnectionManager(httpClientConnectionManager).setConnectionManagerShared(true)
.addRequestInterceptorFirst(new RemoveSoapHeadersInterceptor()) ;
return httpClientBuilder.build();
}
private SSLConnectionSocketFactory getSSLConnectionSocketFactory() throws Exception {
HostnameVerifier hostnameVerifier = null;
hostnameVerifier = NoopHostnameVerifier.INSTANCE;
try {
return new SSLConnectionSocketFactory(getKpmgSSLContext(), hostnameVerifier);
} catch (Exception e) {
throw new Exception(e.getCause());
}
}
@Bean
public SSLContext getKpmgSSLContext() {
SSLContext sslContext;
try {
byte[] passwd = Base64.getDecoder().decode(keyStorePassword);
byte[] keyStoreBytes = BaseEncoding.base64().decode(encodedkeyStore);
String keypassword = new String(passwd, StandardCharsets.UTF_8);
KeyStore keyStore = KeyStore.getInstance("jks");
byte[] trustStoreBytes = BaseEncoding.base64().decode(encodedTrustStore);
KeyStore trustStore = KeyStore.getInstance("jks");
keyStore.load(new ByteArrayInputStream(keyStoreBytes), null);
trustStore.load(new ByteArrayInputStream(trustStoreBytes), null);
sslContext = new SSLContextBuilder().loadKeyMaterial(keyStore, keypassword.toCharArray()).loadTrustMaterial(new File("\\cacerts2.jks"), keypassword.toCharArray())
.build();
return sslContext;
} catch (KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
} catch (NoSuchAlgorithmException | CertificateException | IOException e) {
}
return null;
}
}
< /code>
Исключение: < /p>
org.springframework.ws.client.WebServiceTransportException: Missing certificate authentication [403]
at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:666) ~[spring-ws-core-4.0.11.jar:?]
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:588) ~[spring-ws-core-4.0.11.jar:?]
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:539) ~[spring-ws-core-4.0.11.jar:?]
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:391) ~[spring-ws-core-4.0.11.jar:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52) ~[jersey-server-3.1.10.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146) [jersey-server-3.1.10.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189) [jersey-server-3.1.10.jar:?]
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:219) [jersey-server-3.1.10.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93) [jersey-server-3.1.10.jar:?]
Подробнее здесь: https://stackoverflow.com/questions/795 ... -webservic