Во-первых, у меня 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]
В нашей среде (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
вы сможете решить свой вопрос.
В конце я создал одно хранилище ключей (с проводником хранилища ключей в Windows) со всеми необходимыми сертификатами (ключами) и псевдонимами. Затем я заполнил keystore и 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
также очень помогает при отладке.