Назад | Перейти на главную страницу

Куда ставить сертификаты в Tomcat, когда приложение работает как клиент?

Во-первых, у меня 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 также очень помогает при отладке.