SSLHandshakeException - Вызов веб-сервиса из веб-приложения с использованием самозаверяющего сертификата. - PullRequest
0 голосов
/ 06 февраля 2019

Мое веб-приложение и веб-службы работают в одном контейнере Tomcat.Если я не использую HTTPS, все работает нормально.
Когда я запускаю веб-приложение и веб-службы на HTTPS, я получаю исключение SSLHandshakeException, когда веб-приложение пытается вызвать веб-службы.

CASE 1

Я создал локальный самозаверяющий файл сертификата, используя следующую команду

%JAVA_HOME%\bin\keytool -genkeypair -alias test1 -keyalg RSA -keystore c:/apps/test1.crt

Файл сертификата с именем test1.crt был создан в папке C:\apps.

Теперь я хочу импортировать этот сертификат в хранилище ключей Java с помощью приведенной ниже команды

%JAVA_HOME%\bin\keytool -import -alias test1 -file c:/apps/test1.crt-keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

Ошибка ниже:

Ошибка инструмента ключа: java.lang.Exception: Запись не является сертификатом X.509

Когда я использую этот файл сертификата в Tomcat со значением ниже

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

Я не получаю никакой ошибки при запуске сервера,Когда я вызываю веб-сервисы из приложения, я получаю SSLHandshakeException

CASE 2

Я добавил локальный самоподписанный сертификат в хранилище ключей Java с приведенной ниже командой

%JAVA_HOME%/bin/keytool -genkeypair -alias test2 -keyalg RSA -validity 1000 -keysize 2048 -keystore %JAVA_HOME%/jre/lib/security/cacerts

Был добавлен сертификат, который я проверял с помощью следующей команды

JAVA_HOME%\bin\keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

Теперь я экспортировал файл сертификата из хранилища ключей Java с помощью следующей команды

%JAVA_HOME%/bin/keytool -export -alias test2 -keystore %JAVA_HOME%/jre/lib/security/cacerts -rfc -file C:/apps/test2.crt

Файл сертификата с именем test2.crt был создан в папке C:\apps.

Когда я использую этот файл сертификата в Tomcat со значением ниже

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

Я получаю следующую ошибку

в org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:491)
Причина: java.lang.IllegalArgumentException: неверный формат хранилища ключей
в org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext (AbstractJsseEndpoint.java:114)
в org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl (AbstractJsseEndpoint.java:85) * 1052.util.net.NioEndpoint.bind (NioEndpoint.java:224)
в org.apache.tomcat.util.net.AbstractEndpoint.init (AbstractEndpoint.java:1044)
в org.apache.coyote.AbstractProtocol.init (AbstractProtocol.Java: 540)
на org.apache.coyote.http11.AbstractHttp11Protocol.init (AbstractHttp11Protocol.java:74)
на org.apache.catalina.connector.Connector.initInternal (Connector.java:932)
... 13 more

Причина: java.io.IOException: Неверный формат хранилища ключей
в sun.security.provider.JavaKeyStore.engineLoad (JavaKeyStore.java:663)
в ВС.security.provider.JavaKeyStore $ JKS.engineLoad (JavaKeyStore.java:56)
в sun.security.provider.KeyStoreDelegator.engineLoad (KeyStoreDelegator.java:224)
в sun.security.provider.JavaKeyStore $.engineLoad (JavaKeyStore.java:70)
в java.security.KeyStore.load (KeyStore.java:1445)
в org.apache.tomcat.util.net.SSLUtilBase.getStore (SSLUtilBase.java:160)

Хотя сервер запущен и я могу использоватьмое заявление.Но когда я пытаюсь вызвать веб-сервисы, я получаю

Вот журнал исключения SSLHandshakeException

:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти допустимый путь сертификации к запрошенной цели

Ошибка: (org.apache.axis.AxisFault) -> [;вложенное исключение:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой при создании пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удается найти действительный путь сертификации для запрошенной цели]

AxisFault
код ошибки: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
код ошибки:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации к запрошенной цели
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, что для Tomcat файл хранилища ключей - это "% JAVA_HOME% / jre / lib / security / cacerts", и скорее вам не нужно указывать какое-либо хранилище ключей, потому что вы добавили пару ключей в общее хранилище ключей jre, но это совершенно неправильно для использования"C: /apps/test2.crt".

Также попробуйте добавить сертификат сервера в файл склада доверенных сертификатов:

 JAVA_HOME%\bin\keytool -import -v -trustcacerts -alias test2 -file C:/apps/test2.crt -keystore  %JAVA_HOME%/jre/lib/security/cacerts -keypass changeit -storepass changeit
...