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