2012-06-21 2 views
0

Я пытаюсь получить доступ к веб-сервису с использованием защищенного клиента.Axis2/Rampart Client Самоподписанные сертификаты

Я два файла:

nb19200.pkcs12

server.jks

Я вставил в хранилище ключей сервера кота и загрузил PKCS12 в мой браузер, все работает хорошо.

Теперь в моем клиентском приложении, я попытался следующие:

Во-первых, экспортировать сертификат сервера, я использовал следующую команду:

Keytool -exportcert -alias servercert -file servercert.cer - server.jks -storepass хранилища ключей * *

, а затем импортировать его на хранилище ни с чем там:

Keytool -importcert -keystore truststore.jks -alias servercert -file servercert.cer -v trustcacerts -noprompt -storepass * **

Мой код выглядит следующим образом:

System.setProperty("javax.net.ssl.trustStore","servertrust.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "password"); 

    //To be able to load the client configuration from axis2.xml 
    ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem("client-repo", null); 

    SecureServiceStub stub = new SecureServiceStub(ctx,"https://localhost:8443/axis2/services/SecureService"); 

    ServiceClient sc = stub._getServiceClient(); 

    sc.engageModule("rampart"); 

    //call the service etc. 

Ok, с этой конфигурацией я получаю следующее сообщение об ошибке:

вызвано следующими причинами: java.net.SocketException: Соединение закрыто удаленным хостом

Если я комментирую первые две строки, то ошибка, я получаю:

Вызванный: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти правильный путь сертификации к запрошенной цели

Так что я делаю неправильно?

Я полностью потерян.

Обновление Полный код:

http://pastebin.com/8xTYK3tY

Стек след:

Exception in thread "main" org.apache.axis2.AxisFault: Connection refused: connect 
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) 
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:197) 
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75) 
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404) 
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231) 
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) 
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406) 
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
at tutorial.rampart.client.SecureServiceStub.add(SecureServiceStub.java:191) 
at tutorial.rampart.client.SecureServiceCGClient.main(SecureServiceCGClient.java:36) 
Caused by: java.net.ConnectException: Connection refused: connect 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
at java.net.Socket.connect(Socket.java:529) 
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:564) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140) 
at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:130) 
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) 
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) 
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) 
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621) 
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193) 
+0

ли установить вы 'javax.net.ssl.trustStore' где-нибудь еще в вашем коде, или SSL используется вообще раньше? Обычно он загружается только один раз (даже из значений по умолчанию). – Bruno

+0

Nop. Я обновлю полный код на вставке. – Wasted

+0

Вы можете попробовать следующее: http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/ – Tomer

ответ

0

Я нашел решение.

Я этого не хватает:

System.setProperty("javax.net.ssl.keyStore","keys/client.jks"); 
System.setProperty("javax.net.ssl.keyStorePassword", "password"); 
1

Посмотрите на линии, где вы определяете путь к хранилищу:

System.setProperty("javax.net.ssl.trustStore","servertrust.jks"); 

Но вы сказали, что имя файла: server.jks. Поэтому, если это так, то код не может найти правильный файл сертификата.

UPDATE:

При использовании SSL (HTTPS) сервер ищет свидетельства на право accroding на 'CN'.CN должен быть равен имени хоста. Согласно URL-адресу, который вы опубликовали, я вижу, что вы используете localhost, поэтому вам нужно сделать CN равным имени вашего компьютера (вы можете увидеть его, щелкнув правой кнопкой мыши My computer-> propeties).

+0

Извините, я набрал имя неправильно. Я использовал хранилище ключей, которое я создал с экспортированным сертификатом сервера, то есть truststore.jks. Но он не работает. – Wasted

+1

Несоответствие имени хоста не создало бы этого исключения. Кроме того, CN представляет собой просто резерв для альтернативного имени субъекта (он должен соответствовать только если нет DNS SAN). – Bruno

0

Пожалуйста, убедитесь, что услуга прослушивает порт 8443. Проверьте, есть ли URL-адрес https://localhost:8443/axis2/services/SecureService. Вы можете попробовать этот URL https://localhost:8443/axis2/services/SecureService?wsdl и посмотреть, можете ли вы получить WSDL услуги с этого URL-адреса

Смежные вопросы