Cześć,

piszę pewną aplikację i z jej poziomu muszę odpytać zewnętrzne API SOAP chronione certyfikatami i base auth'em. Pierwsze testy po otrzymaniu certyfikatów i haseł za pomocą curl'a bezproblemowe:

curl --cert client.cer --key private.key --cacert server-chain.pem ...

client.cer - certyfikat wygenerowany na podstawie CSR według private.key
private.key - zwyczajny -----BEGIN RSA PRIVATE KEY-----
server-chain.pem - certyfikat wygenerowany dla serwera, a w nim główny, pośredni i serwera

Gdy request leci z powłoki curl'em otrzymuję poprawną odpowiedź. Teraz montując wszystko w JBoss Fuse i korzystając z BindingProvider:

SomeService service = new SomeService();
Service soap = service.getServiceSOAP();
BindingProvider bp = (BindingProvider) soap;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);

próbuję wykonać to samo. Kroki, które wykonałem:

  • zaimportowałem server-chain.pem do jre\lib\security\cacerts
  • zmergowałem client.cert i private.key do cert.p12
  • wrzuciłem do jre\lib\security\cacerts nowo stworzony cert: cert.p12

i niestety ciągle otrzymuję błąd:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

Wykonałem już wiele kombinacji mergowania, kombinowałem z własną fabryką, gdzie sam ładuję stworzony własny keystore

SSLContext sc = SSLContext.getInstance("TLSv1.2");
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
...
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(path), pass);
factory.init(keyStore, pass);
sc.init(factory.getKeyManagers(), null, null);

bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", sc.getSocketFactory());
lub bez internal
bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", sc.getSocketFactory());

i również ten sam błąd. Wspomożecie?