Статьи

Разрешение CertPathValidatorException: путь не связан ни с одной из якорей доверия. Ошибка в Axis2

Я получал эту ошибку (см. Ниже) в одном из наших веб-сервисов на основе 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 из коробки.