сертификат, которому не доверяет Websphere

у меня есть веб-приложение, которое вызывает веб-службу SOAP, защищенную через SSL .(https://zzzzzzzzzzzz/xxxxx).

сервер отправляет два сертификата (Root и Leaf), поэтому я импортирую два сертификата, используя свойство:com.ibm.websphere.ssl.retrieveLeafCert .

чтобы включить проверку ssl в websphere, я просто добавляю сертификаты в websphere:

SSL-сертификат и управление ключами - > хранилища ключей и сертификат - > NodeDefaultTrustStore - > Signer cerificates - > извлечение из порта :

  • хоста : имя хоста
  • порт : 443
  • псевдоним : псевдоним

проблема в том, что webshphere не доверяет сертификату и дает мне этот stacktrace,

used by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking `https://------------------------------` : com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: 
    java.security.cert.CertPathValidatorException: T`he certificate issued by CN=-------------------------------------------------------------------- is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.6.0]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:56) ~[na:1.6.0]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39) ~[na:1.6.0]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:527) ~[na:1.6.0]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1338) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1322) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:354) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:385) ~[cxf-rt-frontend-jaxws-2.7.4.jar:2.7.4]
    ... 100 common frames omitted
`Caused by: javax.net.ssl.SSLHandshakeException`: com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: 
    java.security.cert.CertPathValidatorException: `The certificate issued by CN=--------------------------------------------------------- is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.jsse2.o.a(o.java:8) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:549) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:355) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:130) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:135) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:368) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.s(kb.java:442) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:136) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:495) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:223) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:724) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:81) ~[na:6.0 build_20130515]
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:8) ~[na:6.0 build_20130515]
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:20) ~[na:6.0 build_20130515]
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1043) ~[na:1.6.0]
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:85) ~[na:6.0 build_20130515]
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:168) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1282) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1233) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:195) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1295) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    ... 110 common frames omitted
`Caused by: com.ibm.jsse2.util.j: PKIX path building failed:` java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: 
    java.security.cert.CertPathValidatorException: T`he certificate issued by CN=--------------------------------------------  is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.jsse2.util.h.b(h.java:39) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.util.h.b(h.java:21) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.util.g.a(g.java:1) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.a(pc.java:36) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.checkServerTrusted(pc.java:19) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.b(pc.java:51) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:65) ~[na:6.0 build_20130515]
    ... 128 common frames omitted
Caused by: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.engineBuild(PKIXCertPathBuilderImpl.java:411) ~[na:na]
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:258) ~[na:na]
    at com.ibm.jsse2.util.h.b(h.java:107) ~[na:6.0 build_20130515]
    ... 134 common frames omitted
Caused by: java.security.cert.CertPathValidatorException: The certificate issued by CN=-------------------------------------------------------
    at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:111) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathValidatorImpl.engineValidate(PKIXCertPathValidatorImpl.java:178) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.myValidator(PKIXCertPathBuilderImpl.java:737) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:649) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:595) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.engineBuild(PKIXCertPathBuilderImpl.java:357) ~[na:na]
    ... 136 common frames omitted
Caused by: java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.security.cert.CertPathUtil.findIssuer(CertPathUtil.java:298) ~[na:na]
    at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:108) ~[na:na]
    ... 141 common frames omitted

тот же код тестируется в моей локальной среде с простым использованием Installcert.java и провожу тесты с -Djavax.чистая.протокол SSL.хранилище truststore=jssecacerts (jssecacerts-это файл, созданный с помощью InstallCert.ява.)

6 ответов


Спасибо за ответ. В состоянии решить проблему java.безопасность.сертификат.CertPathValidatorException: ошибка цепочки сертификатов со следующей конфигурацией.

  1. обнаружил, что следующие свойства javax вернули значение null в WebSphere.
    • пакета javax.чистая.протокол SSL.хранилище,
    • пакета javax.чистая.протокол SSL.trustStorePassword
    • пакета javax.чистая.протокол SSL.trustStoreType

для больше деталей, пожалуйста см. эта ссылка,

java-путь к свойству trustStore-set не работает?

  1. настройки свойства как ниже в WebSphere

    выберите серверы > серверы приложений > имя_сервера > определение процесса > виртуальная машина Java > пользовательские свойства > создать.

А) класс javax.чистая.протокол SSL.и truststore = jre_install_dir\Либ\безопасность\cacerts в

Пример: C:\Program Файлы\с WebSphere\каталоги appserver\Ява\среда jre\lib в\безопасность\cacerts в

b) javax.сеть.ssl.trustStorePassword = changeit (по умолчанию)

с) пакета javax.чистая.протокол SSL.trustStoreType = JKS по

для получения более подробной информации см. Эту ссылку,

http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/index.jsp?topic=%2Fcom.ibm.isim.doc_6.0%2Finstalling%2Ftsk%2Ftsk_ic_ins_first_security_truststore.htm

после того, как конфигурация смогла увидеть в регистрирует сертификаты, добавляемые в хранилище доверия.

спасибо, Удай Нилайкар


Я тестирую миллион конфигураций websphere .

единственная процедура, которая работает, - это процедура, описанная в этой ссылке:

http://blog.xebia.com/2012/10/01/mutual-ssl-authentication-using-websphere-application-server-and-cxf/

определив CXF intercpter:

<cxf:bus>
 <cxf:outInterceptors>
   <bean class="---------------------.WebsphereSslOutInterceptor" />
</cxf:outInterceptors>
</cxf:bus>

для больше деталей, пожалуйста см. :

https://github.com/vlussenburg/websphere-cxf-extensions#websphere-cxf-extensions

большое спасибо за вашу помощь, ребята .


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

по умолчанию требуется подписанный сертификат.


проблема здесь в том, что построитель пути сертификата (часть API пути сертификата Java) не может построить цепочку сертификатов во время рукопожатия SSL. Во время рукопожатия одноранговый узел SSL отправляет свой сертификат (удостоверение) клиенту, чтобы клиент доверял этому конкретному сертификату, на стороне клиента должна быть построена цепочка доверия, что происходит, когда вы получаете ошибку. Проблема здесь в том, что цепь доверия не может быть создана, так как вам не хватает подписывающего лица сертификат и/или корневой сертификат в хранилище доверенных сертификатов (доверия).

обратите внимание, что pkix trustmanager выполняет проверку "область доверия", что означает, что вам не нужна полная цепочка сертификатов на стороне клиента для выполнения отношений доверия с узлом SSL, вам понадобятся только подписывающие/промежуточные сертификаты в вашем truststore. Фактически, если вы должны поместить сертификат leaf в truststore, это также должно заставить вещи работать, так как это гласит, что у вас есть явное доверие к этому конкретному сертификату, и проверка цепочки сертификатов не требуется.


Возможно, вам стоит посмотреть на следующее technote.

Если вы находитесь на определенном уровне пакета исправлений, вы можете установить значение com.компания IBM.в WebSphere.использование SSL.retrieveLeafCert to правда и получить сертификат, когда извлечение из порта.


вот шаги для импорта сертификата в JVM на HTTPS WS вызов:

A) получить импортируемый сертификат

  1. каждый браузер отображает сертификаты по-разному, но они обычно очень похожи. На панели URL браузера обычно есть зона, на которую вы можете нажать, чтобы отобразить информацию о сертификате SSL. Например, вы можете увидеть замок в строке состояния и нажать на кнопку замочек открывает информацию о сертификате. После того, как информация о сертификате открыта, нажмите на" путь сертификации " Информация. Обычно есть способ экспортировать каждый из сертификатов подписи (доверенные корни). Экспортируйте сертификаты в " база-64 закодирована X. 509 (.CER)". Экспортированный файл в этом формате будет текстовым файлом ASCII, который имеет строки" BEGIN CERTIFICATE "и" END CERTIFICATE " вверху и внизу. После экспорта подписанных сертификатов SSL-сертификат удаленного сервера затем можно импортировать в JVM.

B) импортируйте сертификат

  1. запустите утилиту ikeyman. Утилиты (утилитой ikeyman.летучая мышь или ikeyman.sh) находится в папке WAS_HOME\bin.
  2. в меню файл базы данных ключей выберите Открыть.
  3. в типе базы данных ключей выберите JKS.
  4. в поле Имя файла введите cacerts.
  5. в поле расположение введите Каталог-was\Ява\среда jre\lib в\безопасности.
  6. в окне запрос пароля Введите пароль для хранилища ключей в окне Пароль и подтвердите пароль. Пароль по умолчанию-changeit. нажимать OK.
  7. добавьте сертификат, созданный для сервера LDAP, в это хранилище сертификатов.
  8. в главном окне в области содержимое базы данных ключей выберите сертификаты подписавшего из списка. нажать кнопку add.
  9. в поле Имя файла сертификата, просматривать и найдите файл сертификата сервера, созданный для сервера LDAP, который находится в двоичных данных Der. Убедитесь, что в поле расположение отображается соответствующий каталог. нажимать OK.
  10. в приглашении введите метку для этого сертификата. Например, введите LDAPCA. нажимать OK.