API do którego podłączam się w środowisku testowym wymaga określonego certyfikatu od klienta. Certyfikat jest self-signed, przez co otrzymuję
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Certyfikat otrzymałem od wystawcy w .pfx
, następnie używając
keytool -importkeystore -srckeystore cert_dev.pfx -srcstoretype pkcs12 -destkeystore clientcert.jks -deststoretype JKS
utworzyłem keystore.
konfiguracja WebServiceTemplate
@Bean
public WebServiceTemplate webServiceTemplate() throws Exception {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setMarshallerProperties(Map.of(JAXB_FORMATTED_OUTPUT, true));
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri(properties.getBaseUrl());
webServiceTemplate.setMessageSender(sender());
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
return webServiceTemplate;
}
@Bean
public HttpsUrlConnectionMessageSender sender() throws Exception {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(
properties.getAuthentication().getKeyStore().getInputStream(),
properties.getAuthentication().getKeyStorePassword().toCharArray()
);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(ks, properties.getAuthentication().getKeyStorePassword().toCharArray());
KeyStore ts = KeyStore.getInstance("JKS");
ts.load(
properties.getAuthentication().getTrustStore().getInputStream(),
properties.getAuthentication().getTrustStorePassword().toCharArray()
);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(ts);
HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender();
messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
messageSender.setTrustManagers(trustManagerFactory.getTrustManagers());
messageSender.setHostnameVerifier((hostname, sslSession) -> {
return true;
});
return messageSender;
}
przy każdym wywołaniu otrzymuję
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
czy to dlatego, że certyfikat jest self signed?
dodam, że przez SoapUI działa bez problemu.