Ошибка использования веб-службы из-за отсутствия сертификата в java (на основе XML SOAP)

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


person user1084509    schedule 31.01.2012    source источник
comment
Мне кажется, что это больше похоже на то, что CA, перечисленные в цепочке сертификатов, не могут быть проверены, например он использует CA, о котором java ничего не знает.   -  person Marc B    schedule 31.01.2012
comment
Ах ... Испанский уроки и методы ... Я давно не работал с ними.   -  person Luciano    schedule 31.01.2012
comment
Для связи клиент и WS должны совместно использовать сертификаты. У каждого из них есть хранилище ключей с собственным закрытым ключом для дешифрования ввода и открытым ключом партнера для шифрования вывода. Этот путь настроен в XML-файле, относящемся к политикам, имя которых я не могу вспомнить ...   -  person Alfabravo    schedule 01.02.2012


Ответы (2)


В зависимости от версии 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

person Toby Jackson    schedule 31.01.2012
comment
Я использовал класс InstallCert.java, и он указывает, что сертификат правильно добавлен в мое хранилище javastore. С этой информацией создается файл с именем jsseacacerts. Я копирую этот файл в $ JAVA_HOME / jre / lib / security и получаю ту же ошибку. Я пытаюсь вручную импортировать свой сертификат в хранилище ключей с помощью следующей команды: $ JAVA_HOME / bin / keytool.exe -import -file mycert.cer -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass psswd, и я получаю java .ioFileNotFoundException ‹Доступ запрещен› - person user1084509; 01.02.2012
comment
SSLPoke выдает следующую ошибку: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели на солнце .security.ssl.Alerts.getSSLException (Неизвестный источник) в sun.security.ssl.SSLSocketImpl.fatal (Неизвестный источник) в sun.security.ssl.Handshaker.fatalSE (Неизвестный источник) в sun.security.ssl.Handshaker.fatalSE (Неизвестный источник) на sun.security.ssl.ClientHandshaker.serverCertificate (Неизвестный источник) ... - person user1084509; 01.02.2012
comment
Возможно, на вашем компьютере установлено несколько Java, рекомендуется способ решения этой проблемы. Можете ли вы попробовать запустить команду InstallCert, используя те же среды выполнения java, которые работают с контейнером вашего сервера (я предполагаю, что это в Tomcat / JBoss / Glassfish или аналогичных?) - person Toby Jackson; 01.02.2012
comment
У меня работает после того, как я следую руководству от mkyong.com/webservices/jax-ws/. В нем рассказывается, как использовать InstallCert.java. Убедитесь, что этап проверки пройден. Однако необходимо перезапустить сервер приложений. - person antimatter; 07.02.2014

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

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

Ты сможешь:

1. Заставьте вашу программу принимать ЛЮБОЙ сертификат SSL.

2 - Загрузите и установите на свою JVM сертификат SSL, который вам не хватает.

Первый вариант проще (в большинстве случаев), но вы должны использовать его ТОЛЬКО перед выпуском, иначе вы легко подвергнетесь воздействию человека в средней атаке. Второй (обычно) лучший выбор.

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

person thermz    schedule 31.01.2012