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 ;)