Мое веб-приложение и веб-службы работают в одном контейнере 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: невозможно найти действительный путь сертификации для запрошенной цели