javax.net.ssl.SSLHandshakeException: java.security.CertificateException.Исключение CertificateException при подключении к защищенному порту

#java #ssl #websphere-liberty

#java #ssl #websphere-liberty

Вопрос:

Я получаю исключение SSL, когда один из моих серверов пытается подключиться к защищенному порту.

 javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: PKIXCertPathBuilderImpl could not build a valid CertPath. java.security.cert.CertificateException: PKIXCertPathBuilderImpl could not build a valid CertPath. PKIXCertPathBuilderImpl could not build a valid CertPath
  

Я установил хранилище доверия в jvm.options:

 -Djavax.net.ssl.trustStore=/home/rpp/TrustStore
-Djavax.net.ssl.trustStorePassword=passw0rd
-Djavax.net.ssl.trustStoreType=jks
  

В server.xml Я добавил

 <keyStore id="defaultKeyStore" location="/root/ssl/bmx-zuu.net.jks" password="passw0rd" />
  

Есть ли какие-либо другие настройки, которые я должен добавить?

Комментарии:

1. Является ли это самозаверяющим сертификатом?

2. @Azim да, это самозаверяющий сертификат

Ответ №1:

Возможно, вы захотите попробовать определить конфигурацию SSL в Liberty, как показано ниже. Хранилище ключей определяется точно так, как определено выше, но добавьте TrustStore в server.xml . Предполагается, что TrustStore.jks имеет сертификаты подписавшего для установления доверия с сервером.

 <ssl id="defaultSSLConfig" keyStoreRef="defaultKeyStore" trustStoreRef=“myTrustStore"/>
        <<keyStore id="defaultKeyStore" location="/root/ssl/bmx-zuu.net.jks" password="passw0rd" />
        <keyStore id=“myTrustStore" location="${server.config.dir}/TrustStore.jks" password="mypassword" type="JKS"/>
  

Комментарии:

1. Liberty устанавливает SSLContext по умолчанию для SSLContext по умолчанию для процесса, используя SSLContext.setDefault() . Итак, то, что было установлено в вашем файле jvm.options, будет уничтожено. Это упоминается здесь ibm.com/support/knowledgecenter/SSEQTP_8.5.5 /…

Ответ №2:

Попробуйте использовать

 openssl s_client -connect <hostname>:<portnumber> -showcerts
  

Посмотрите на выходные данные и определите, каковы субъект и эмитент сертификата.

Убедитесь, что эмитент сертификата находится в вашем файле TrustStore.

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

Комментарии:

1. Похоже, это не проблема с truststore, поскольку это работает с Tomcat. Я сталкиваюсь с этой проблемой в Liberty

2. Пытается ли liberty вызвать что-то в TLS? Установка хранилища доверия таким образом, чтобы соответствовать liberty, позволила бы ему доверять сертификатам, выданным тем, что там есть

3. Как мне это проверить? Есть ли какой-либо другой способ установить хранилище доверия?

4. Вы ожидаете, что будет использоваться хранилище доверия JSSE по умолчанию, cacerts? Liberty не использует cacerts. Вы всегда можете настроить Liberty для указания на файл cacerts для доверия, если хотите.