Мне нужно использовать веб-сервис, созданный в Axis, с моим веб-приложением на Java (которое работает на Tomcat). Компания, которая создала веб-сервис, использует HTTPS и сертификат, подписанный для тестирования.
Я запустил мастер Netbeans для создания веб-сервиса на основе WSDL, и это сделано правильно. Если я захожу на веб-сайт веб-службы с помощью браузера, я получаю предупреждение из-за SSL-сертификата, и мне приходится создавать исключение.
При попытке запустить мой код я получаю исключения при установлении SSL-соединения. Исключения:
1
com.sun.xml.ws.client.ClientTransportException: ошибка транспорта HTTP: javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: handshake_failure
и несколько раз (без изменения кода)
2
com.sun.xml.ws.client.ClientTransportException: ошибка транспорта HTTP: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой при создании пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
Я полагаю, что мне нужно включить сертификат в виртуальную машину Java и / или Tomcat, а также указать, что не следует доверять источнику.
Как это сделать? Как правильно использовать этот безопасный веб-сервис?
Если информации, которую я предоставляю, недостаточно, пожалуйста, попросите больше.
Спасибо
Эзекуэль
UPDATE:
Я пробовал эти две вещи, обе безуспешно, исключения одинаковы.
Вариант 1)
System.setProperty("javax.net.ssl.trustStore","/home/serverapp/BSS-cert.p12");
System.setProperty("javax.net.ssl.trustStorePassword","password");
System.setProperty("javax.net.ssl.trustStoreType","PKCS12");
Вариант 2)
KeyStore ks = KeyStore.getInstance ("pkcs12");
ks.load (новый FileInputStream ("/ home / serverapp / BSS-cert.p12"), "пароль" .toCharArray ());
KeyStore jks = KeyStore.getInstance( "JKS" );
jks.load( null );
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
kmf.init( ks, "f0p6k9n2".toCharArray() );
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
tmf.init( jks );
SSLContext ctx = SSLContext.getInstance( "TLS" );
ctx.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
Кроме того, поскольку я подумал, что проблема может заключаться в веб-службе, я попытался установить соединение HTTPS, и он завершился неудачно с той же ошибкой при открытии входного потока.
String httpsURL = "https://serverurl:443/theservice?wsdl";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream(); //Exception here!
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);