Для начала, у меня Tomcat8 настроен на https с действительной сертифицированной ссылкой в xml-файле коннектора.
Примерно так:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" enableLookups="false" keyAlias="https"
keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\conf\keystore.jks"
keystorePass="changeit"/>
Но мне нужно, чтобы мое веб-приложение подключалось в качестве клиента к стороннему поставщику данных с действующим сертификатом. Куда мне поместить этот дополнительный сертификат? Когда я помещаю в хранилище ключей для соединителя, "https" сертификат - это не первый сертификат, и он ломается. Я, вероятно, смогу исправить это с помощью атрибута keyAlias
в коннекторе ...
Но ... Широко ли приложение хранилищ ключей соединителя? Какой вариант лучше всего подходит для такой установки?
Эта статья в значительной степени суммирует мои варианты, какой из них выбрать? Лучшим вариантом, по-видимому, является передача хранилища ключей с обоими сертификатами в JVM, но как указать соединителю, какой сертификат использовать?
РЕДАКТИРОВАТЬ:
После предложения я отредактировал свой соединитель и хранилище ключей следующим образом:
Теперь я получаю:
Wrapped javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Cause: sun.security.validator.ValidatorException: PKIX path building
failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target]
В конце я создал одно хранилище ключей (с проводником хранилища ключей в Windows) со всеми необходимыми сертификатами (ключами) и псевдонимами. Затем я заполнил хранилище ключей и trustore как параметры запуска виртуальной машины Java:
-Djavax.net.ssl.keyStore=%KEYSTORE%
-Djavax.net.ssl.keyStorePassword=changeme
-Djavax.net.ssl.trustStore=%TRUSTSTORE%
-Djavax.net.ssl.trustStorePassword=changeme
Такое же хранилище ключей используется в соединителе tomcat с соответствующими keyAlias для HTTPS.
Включение -Djava.net.debug = ssl
также очень полезно при отладке.
В нашей среде (tomcat7), если мы используем хранилище ключей java, наш соединитель выглядит так:
<Connector SSLEnabled="true"
acceptCount="100"
connectionTimeout="20000"
executor="tomcatThreadPool"
keyAlias="tomcat"
keystoreFile="${catalina.base}/conf/tomcat.keystore"
keystorePass="changeme"
maxKeepAliveRequests="15"
port="443"
protocol="org.apache.coyote.http11.Http11Protocol"
redirectPort="8443"
scheme="https"
secure="true"/>
Различия заключаются в $ {catalina.base}
(в нашем случае / opt / tomcat / ) вместо $ {user.home} /
, и, как вы упомянули keyAlias
.
Если вы хотите импортировать ключ в хранилище ключей, вы можете сделать это следующим образом (мы используем это, когда tomcat является клиентом для аутентификации в ADFS):
keytool -importcert -file cert.cer -keystore tomcat.keystore -alias myalias
Я думаю, с хранилищем ключей в $ {catalina.base}
и keyAlaias
вы сможете решить свой вопрос.