Проблема рукопожатия SSL в веб-сервисе с Java и Tomcat - PullRequest
1 голос
/ 16 февраля 2011

Мне нужно использовать веб-сервис, созданный в 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);

Ответы [ 4 ]

2 голосов
/ 21 марта 2011

Два общих подхода здесь:
http://ws.apache.org/xmlrpc/ssl.html
В WebLogic есть свои вещи:
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/security/SSL_client.html#wp1029670

0 голосов
/ 16 февраля 2011

Чтобы доверять сертификату, вы должны сообщить java, что вы доверяете центру сертификации, подписавшему сертификат. В случае самоподписанного сертификата это сам сертификат. Вам необходимо установить системное свойство javax.net.ssl.trustStore в хранилище ключей, которое содержит CA для сертификата сервера, к которому вы подключаетесь.

Возможно, вы сможете получить сертификат из своего браузера, когда получите его из-за ошибки ненадежного соединения. Попробуйте найти вариант экспорта сертификата в формате PKCS12, сохраните этот файл. При запуске кода установите для свойства javax.net.ssl.trustStore файл, который вы только что сохранили, а также установите для javax.net.ssl.trustStoreType значение PKCS12.

0 голосов
/ 16 февраля 2011

возможно отсутствует соответствующая сертификация SSL. Прочитайте эту запись в блоге: http://blogs.oracle.com/andreas/entry/no_more_unable_to_find программа, приведенная здесь, помогла мне однажды.

0 голосов
/ 16 февраля 2011

Я думаю, вам нужно настроить, чтобы неподписанный сертификат можно было доверять. Возможно это поможет вам.

...