it-swarm.com.ru

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

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

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

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

Сертификат SSL и управление ключами -> хранилища ключей и сертификат -> NodeDefaultTrustStore -> Сертификаты подписавшего -> Получить из порта: 

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

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

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.net.ssl.trustStore = jssecacerts (jssecacerts - это файл, созданный InstallCert.Java). 

7
Nabil

Я тестирую миллионную конфигурацию веб-сферы. 

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

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

Определив перехватчик cxf: 

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

Для более подробной информации, пожалуйста, смотрите: 

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

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

3
Nabil

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

  1. Обнаружил, что следующие свойства javax вернули нулевое значение в WebSphere .
    • javax.net.ssl.trustStore, 
    • javax.net.ssl.trustStorePassword 
    • javax.net.ssl.trustStoreType

Для более подробной информации, пожалуйста, смотрите эту ссылку,

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

  1. Настроил свойства, как показано ниже в WebSphere

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

а) javax.net.ssl.trustStore = jre_install_dir\lib\security\cacerts

Пример: C:\Program Files\WebSphere\AppServer\Java\jre\lib\security\cacerts

б) javax.net.ssl.trustStorePassword = changeit (по умолчанию)

в) javax.net.ssl.trustStoreType = jks

Для более подробной информации, пожалуйста, смотрите эту ссылку,

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

После настройки удалось увидеть в журналах, что сертификаты добавляются в хранилище доверенных сертификатов.

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

10
user3458628

Может быть, вам стоит взглянуть на следующее technote .

Если вы находитесь на определенном уровне пакета Fix Pack, вы можете установить значение com.ibm.websphere.ssl.retrieveLeafCert равным true и получить листовой сертификат при Извлечение из порта.

0
trikelef

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

A) Получить сертификат для импорта

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

B) Импортировать сертификат

  1. Запустите утилиту ikeyman. Утилита (ikeyman.bat или ikeyman.sh) находится в папке WAS_HOME\bin.
  2. В меню Файл базы данных ключей выберите Открыть.
  3. В типе базы данных ключей выберите JKS.
  4. В поле Имя файла введите cacerts.
  5. В поле Расположение введите WAS_HOME\Java\jre\lib\security.
  6. В окне «Запрос пароля» введите пароль для хранилища ключей в окне «Пароль и подтверждение пароля». Пароль по умолчанию - changeit . Нажмите OK.
  7. Добавьте сертификат, который вы создали для сервера LDAP, в это хранилище сертификатов.
  8. В главном окне в области содержимого базы данных ключей выберите Сертификаты подписавшего из списка . Нажмите кнопку Добавить.
  9. В поле Имя файла сертификата найдите и найдите файл сертификата сервера, созданный для сервера LDAP, который находится в данных Binary Der. Убедитесь, что соответствующий каталог отображается в поле Местоположение . Нажмите кнопку ОК.
  10. В командной строке введите метку для этого сертификата. Например, введите LDAPCA . Нажмите кнопку ОК.
0
edubriguenti

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

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

0
Anton Novopashin

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

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

0
Robert Höglund