Я получал эту ошибку (см. Ниже) в одном из наших веб-сервисов на основе axis2, и это то, что я сделал, чтобы устранить ее.
org.apache.axis2.AxisFault: sun.security.validator.ValidatorException: сбой проверки пути PKIX : java.security.cert.CertPathValidatorException: путь не связан ни с одним из якорей доверия
в org.apache.axis2.AxisFault.makeFault ( AxisFault.java:430)
в org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo (SOAPMessageFormatter.java:83)
…
Вызванный: com.ctc.wstx.exc.WstxIOException: sun.security.validator.ValidatorException: PKIX Ошибка проверки пути: java.security.cert.CertPathValidatorException: путь не связан ни с одним из якорей доверия
на com.ctc.wstx.sw.BaseStreamWriter.flush (BaseStreamWriter.java:313)
на org.apache.axiom.om. impl.MTOMXMLStreamWriter.flush (MTOMXMLStreamWriter.java:146)
…
Вызвано: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой проверки пути PKIX: java.security.cert.CertPathValidatorException: путь не связан ни с одним из якорей доверия
на com.sun.net. ssl.internal.ssl.Alerts.getSSLException (Alerts.java:150)
…
Вызванный: sun.security.validator.ValidatorException: проверка PKIX путь не удалось: java.security.cert.CertPathValidatorException: путь не цепь с любым из доверия анкеры
в sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:187)
…
Вызванный: java.security.cert.CertPathValidatorException: Путь не цепь ни с одной из целевых якорей
at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:195) по
адресу java.security.cert.CertPathValidator.validate (CertPathValidator.java:206)
по отношению к sun.secid.VididValid.ValidateValid.VididValid.ValidateValid.VididValid.ValidateValid.VididValid.ValidateValid. : 182)
… еще 49
Решение
Axis2 использует библиотеку commons-httpclient (теперь является частью проекта Apache HttpComponents ™) для установления соединений http /
https . Я делаю небольшую настройку, чтобы он принимал любой
сертификат сервера, как это:
(Кстати, я совсем не беспокоился о том, был ли сертификат действительным, самоподписанным или имеет действительную цепочку доверия)
Stub stub = ; . . . //Line #1 org.apache.commons.httpclient.protocol.Protocol.unregisterProtocol("https"); //Line #2 org.apache.commons.httpclient.protocol.Protocol.registerProtocol ("https", new Protocol("https", (ProtocolSocketFactory) new org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory(), 13087));
Строка # 1: незарегистрированная фабрика сокетов по умолчанию для схемы протокола https URI.
Строка # 2 : используется фабрика нестандартных сокетов — EasySSLProtocolSocketFactory — используется для создания соединений SSL, которые позволяют целевому серверу проходить аутентификацию с помощью самозаверяющего сертификата (проще говоря). , он принимает любой самоподписанный сертификат). Помните, что эта фабрика сокетов НЕ ДОЛЖНА использоваться для продуктивных систем по соображениям безопасности, если только это не является обдуманным решением, и вы не в полной мере осведомлены о последствиях безопасности для принятия самозаверяющих сертификатов.
Чтобы использовать эту фабрику нестандартных сокетов, вам нужно включить not-пока-commons-ssl-0.3.9.jar в classpath, и он доступен здесь (на момент написания этого поста): http://repository.jboss.org/maven2/ org / apache / commons / not-commons-ssl / 0.3.9 / . если вы не найдете здесь, вы можете Google и получить его.
Что касается commons-httpclient, то он обеспечивает полную поддержку протоколов HTTP по протоколу Secure Sockets Layer (SSL) или IETF Transport Layer Security (TLS) , используя расширение Java Secure Socket Extension (JSSE). JSSE была интегрирована в платформу Java 2 начиная с версии 1.4 и работает с HttpClient из коробки.