Клиент CXF: невозможно найти действительный путь сертификации для запрошенной цели
Я пытаюсь реализовать клиент для веб-службы на основе CXF, которую я также написал.
Мой веб-сервис работает отлично (проверено, работает нормально с помощью soapUI), но запустить клиента не удается со следующим:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
Сообщение ясно указывает на проблему с сертификатом, поэтому я сделал быстрый поиск и нашел правильный подход кподдержка SSL в CXF и добавил следующее в XML-конфигурацию контекста моего приложения Spring:
<http:conduit name="https://myserver/myws/register/soap?wsdl:{http://glob.reg.com/myws}.http-conduit">
<http:tlsClientParameters>
<sec:keyManagers keyPassword="password">
<sec:keyStore type="JKS" password="password"
file="my/file/dir/Morpit.jks"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="JKS" password="password"
file="my/file/dir/Truststore.jks"/>
</sec:trustManagers>
<sec:cipherSuitesFilter>
<!-- these filters ensure that a ciphersuite with
export-suitable or null encryption is used,
but exclude anonymous Diffie-Hellman key change as
this is vulnerable to man-in-the-middle attacks -->
<sec:include>.*_EXPORT_.*</sec:include>
<sec:include>.*_EXPORT1024_.*</sec:include>
<sec:include>.*_WITH_DES_.*</sec:include>
<sec:include>.*_WITH_AES_.*</sec:include>
<sec:include>.*_WITH_NULL_.*</sec:include>
<sec:exclude>.*_DH_anon_.*</sec:exclude>
</sec:cipherSuitesFilter>
</http:tlsClientParameters>
<http:authorization>
<sec:UserName>Betty</sec:UserName>
<sec:Password>password</sec:Password>
</http:authorization>
<http:client AutoRedirect="true" Connection="Keep-Alive"/>
</http:conduit>
И перестроил клиента. Клиент успешно собран, но я все еще получаю ту же самую точную ошибку и ту же самую точную трассировку стека, как будто я никогда не добавлял этоhttp:conduit
вещь.
Я еще не добавил сертификат в хранилище, и путь к хранилищу неверен, но это намеренно, поскольку я просто хотел посмотреть, как пересозданный клиент сообщает об этой проблеме, приспосабливаясь к новомуhttp:conduit
Информация.
Вместо этого я был удивлен, увидев, что это было полностью проигнорировано.
Что я пропустил?
Как правильно подойти к этому?
Обновить: Я только что заметил, что мой applicationcontext.xml подчеркиваетhttp:conduit
с этим сообщением об ошибке:
The prefix "http" for element "http:conduit" is not bound.
Поэтому я сделал быстрый поиск и нашелнить это предполагает:
Клиент должен настроить канал HTTP с хранилищем ключей, которое содержит сертификат STS, например:
<http:conduit name="https://localhost:.*">
<http:tlsClientParameters disableCNCheck="true">
<sec:trustManagers>
<sec:keyStore type="jks" password="cspass" resource="clientstore.jks"/>
</sec:trustManagers>
</http:tlsClientParameters>
</http:conduit>
Что подтверждает то, что написал @GreyBeardedGeek. Собираюсьработать над этим в настоящее время...