Witam,
Za pomocą Axisa/TomCata tworzę sobie klienta SOAP do komunikacji z zewnętrznym serwerem z wykorzystaniem SAAJ. I byłoby fajnie i pięknie, ale niestety do komunikacji potrzeba zaakceptować certyfikat serwera jak i połączyć się z nim z wykorzystaniem certyfikatu lokalnego z hasłem. Mam certyfikaty serwera jak i klienta zaimportowane do cacerts i niby robię jak google radzą, ale serwer cały czas zwraca
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
.
Certyfikat lokalny w formacie pem, serwera w formacie p12. No i jak zapewne podejrzewam coś źle robię z setProperty, bo na logikę to trzeba by wybierać certyfikat, tak więc najpierw serwera, a następnie lokalny. W każdym razie poniżej moje dotychczasowe wypociny:
public static String main(String[] args)
{
try
{
String keystore = System.getProperty("java.home") + "/lib/security/cacerts";
String storepass = "haslo_lokalnego_certyfikatu";
String storetype = "pkcs12"; // a moze jks ???
String trustpass = "haslo_do_cacerts";
System.setProperty("javax.net.ssl.trustStore", keystore);
System.setProperty("javax.net.ssl.trustStorePassword", trustpass);
System.setProperty("javax.net.ssl.keyStore", keystore);
System.setProperty("javax.net.ssl.keyStorePassword", storepass);
System.setProperty("javax.net.ssl.keyStoreType", storetype);
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection conn = scf.createConnection();
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();
SOAPPart sp = msg.getSOAPPart();
SOAPEnvelope env = sp.getEnvelope();
env.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");
env.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");
env.addNamespaceDeclaration("soap12","http://www.w3.org/2003/05/soap-envelope");
SOAPBody bd = env.getBody();
SOAPElement be = bd.addChildElement(env.createName("JakasMetoda", "", "url"));
be.addChildElement("att1").addTextNode("string");
be.addChildElement("att2").addTextNode("string");
msg.saveChanges();
String urlval = "url_do_wywolania";
SOAPMessage rp = conn.call(msg, urlval);
ByteArrayOutputStream baos = null; String s = null; baos = new ByteArrayOutputStream(); rp.writeTo(baos); s = baos.toString();
conn.close();
return s;
}
catch (Exception e) { return "ERROR: " + e.getMessage();}
}
Wszelakie hasła i URL'e są tutaj zaciemnione więc nie to jest problemem jakby co ;)
Do postu wdarła cię pomyłka, certyfikat serwera z końcówką .cer ;)