Ошибка использования веб-службы из-за отсутствия сертификата в Java (на основе XML SOAP) - PullRequest
7 голосов
/ 31 января 2012

Мне нужно использовать веб-сервис, который был построен под Https в Java.Клиент веб-службы был создан с использованием Eclipse, и для его вызова я использую следующий код:

ServicioTimbradoPruebasLocator ServicioTimbradoLocator = new ServicioTimbradoPruebasLocator();
                            ServicioTimbradoPruebasSoap ServicioTimbrado = ServicioTimbradoLocator.getServicioTimbradoPruebasSoap();
                            javax.xml.rpc.Stub s =((javax.xml.rpc.Stub)ServicioTimbrado);
                            s._setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY, "XXXXXXXX");
                            s._setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, "psswd");          
                            String resultado = ServicioTimbrado.generaTimbre(xml.getBytes());
                            System.out.println("resultado: " +resultado);

В этой строке String resultado = ServicioTimbrado.generaTimbre (xml.getBytes ()); Я получаю следующую ошибку:

AxisFault
     [java]  faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
     [java]  faultSubcode: 
     [java]  faultString: 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
     [java]  faultActor: 
     [java]  faultNode: 
     [java]  faultDetail: 
     [java]     {http://xml.apache.org/axis/}stackTrace: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
     [java]     at sun.security.ssl.Alerts.getSSLException(Unknown Source)
     [java]     at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
     [java]     at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
     [java]     at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
     [java]     at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
     [java]     at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
     [java]     at sun.security.ssl.Handshaker.processLoop(Unknown Source)
     [java]     at sun.security.ssl.Handshaker.process_record(Unknown Source)
     [java]     at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
     [java]     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
     [java]     at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
     [java]     at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
     [java]     at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
     [java]     at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
     [java]     at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
     [java]     at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
     [java]     at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
     [java]     at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
     [java]     at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
     [java]     at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
     [java]     at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
     [java]     at org.apache.axis.client.Call.invoke(Call.java:2767)
     [java]     at org.apache.axis.client.Call.invoke(Call.java:2443)
     [java]     at org.apache.axis.client.Call.invoke(Call.java:2366)
     [java]     at org.apache.axis.client.Call.invoke(Call.java:1812)
     [java]     at mx.com.timbrado.test.cfdi.ServicioTimbradoPruebasSoapStub.generaTimbre(ServicioTimbradoPruebasSoapStub.java:107)
     [java]     at natura.facturacion.general.GuardarFacturaElectronicav2.doPost(GuardarFacturaElectronicav2.java:136) ...

Я хочу знать, есть ли способ отправить сертификат вместе с вызовом веб-службы.Дополнительную информацию о контракте wsdl и сгенерированных java файлах можно найти здесь

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

В зависимости от используемой версии Java, одно из «последних» обновлений 1.6 JRE / JDK включает в себя значительное изменение в глобальных CACerts (доверенный орган, подписывающий SSL-сертификаты, например, Verisign), включающий некоторые из новых типов сертификатов, которые вокруг.

Я рекомендую обновить до последних версий Java, чтобы увидеть, работает ли это, если нет, вариант 2 ...

Используя SSLPoke.java , вы можете узнать, какие сертификаты отсутствуют, и InstallCert.java для их установки следующим образом;

  1. Java InstallCert webserver.domain.com:443
  2. Скопируйте сгенерированный файл «jssecacerts» в папку «$ JAVA_HOME \ jre \ lib \ security».

Если это все еще вызывает проблемы, можете ли вы включить вывод из sslpoke, пример использования;

# java SSLPoke webserver.domain.com 443
Successfully connected

Если ВСЕ, что не работает, и вы можете получить файл сертификата (crt), вы можете вручную импортировать файл с помощью команды keytool (cacerts - это файл, который будет создан в вашем локальном рабочем каталоге; убедитесь, что вы переместили его в папка безопасности Java в вашем JRE / JDK);

keytool -import -trustcacerts -alias AddTrustExternalCARoot -file cetificate.crt -keystore cacerts

1 голос
/ 01 февраля 2012

Вы можете обратиться к этой теме: Как обрабатывать недействительные сертификаты SSL с помощью Apache HttpClient?

Конечно, здесь у вас есть веб-служба WSDL SOAP, там у вас есть клиент Apache HTTP, но ошибка та же, и вы можете обработать ее таким же образом (или способами).

Вы можете:

1 - Принудительно заставить вашу программу принять ЛЮБОЙ SSL-сертификат

2 - Загрузите и установите в своей JVM недостающий SSL-сертификат

1-й легче (в большинстве случаев),но вы должны использовать его ТОЛЬКО перед выпуском, иначе вы легко столкнетесь с «человеком в середине атаки».2-й (обычно) лучший выбор.

Здесь есть синтетическая, но хорошо объясненная документация к этим двум пунктам, описанным ранее с примерами кода: http://ws.apache.org/xmlrpc/ssl.html

...