Подтвердить что ты не робот

Сертификат хранилища ключей Tomcat HTTPS

Перейдите в другую проблему с использованием SSL и Tomcat: я настроил хранилище ключей, которое содержит ключ и сертификат (сертификат сервера, который я хочу представить клиентам, подключающимся к сайту). Я сделал то же самое для доверия (мне нужна аутентификация клиента).

Теперь проблема заключается в том, что когда я подключаюсь к экземпляру Tomcat через HTTPS, сертификат, представленный мне (сертификат сервера), не является моим фактическим сертификатом сервера, а скорее ключевым в JS keystore. Использование -Djavax.net.debug = ssl показывает, что он представляет правильный CA для проверки подлинности клиента, но не правильный сертификат сервера.

adding as trusted cert:
  Subject: CN=A
  Issuer:  CN=A
  Algorithm: RSA; Serial number: -
  Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010

adding as trusted cert:
  Subject: X
  Issuer:  X
  Algorithm: RSA; Serial number: -
  Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015

Я заменил реальные значения держателями мест. A = доменное имя сервера (но в этом случае по какой-либо причине это ключ, а не сертификат). X = VeriSign CA (это должно быть правильно). У меня есть существующий сертификат, который я хотел бы использовать для представления клиентам, который я импортировал в хранилище ключей JKS с помощью keytool.

Конфигурация соединителя Tomcat:

Connector port="444" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"       
keystoreFile="conf/ssl/keystore.jks"
keystorePass="xx"
keyAlias="testkey"
truststoreFile="conf/ssl/truststore.jks"
truststorePass="xx"

Любая идея, почему мой экземпляр Tomcat не представляет правильный сертификат?

4b9b3361

Ответ 1

Проблема (по-видимому, я не могу это подтвердить), что невозможно правильно импортировать ранее сгенерированный сертификат (и соответствующий ключ) в хранилище ключей JKS и правильно ли он был представлен Tomcat.

Ситуация, в которой произошла моя проблема, выглядит следующим образом:

  • У меня есть файл сертификата, который я сгенерировал сам с помощью OpenSSL с нуля (ключ + CSR → сертификат), подписанный моим собственным CA.
  • Я хочу настроить Tomcat так, чтобы он представлял этот конкретный сертификат для пользователей, подключающихся к моему сайту.

Решение, которое я нашел для работы, это:

  • Преобразуйте существующий сертификат и его закрытый ключ в формат DER. Например (используя OpenSSL):

    Для закрытого ключа

    openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER

    Для действительного подписанного сертификата

    openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER

  • Импортируйте оба файла DER в хранилище ключей (файл JKS) с использованием пользовательского класса Java.

    java ImportKey my_private_key.der my_certificate.der

    Я сам этого не понял (все зависит от оригинального изобретателя). Источник этого Java-класса и некоторые другие подробности можно найти здесь и здесь. Я немного изменил этот класс, так что есть 3-й (или 4-й) параметр, определяющий местоположение вывода результирующего файла JKS.

Конечным результатом является хранилище ключей JKS, которое затем можно использовать в конфигурации коннектора Tomcat в качестве хранилища ключей. Вышеупомянутый инструмент будет генерировать JKS файл с паролями по умолчанию для ключа и самого файла JKS, их можно будет изменить позже, используя keytool -storepasswd и keytool -keypasswd. Надеюсь, что это поможет людям, столкнувшимся с одной и той же проблемой.

Ответ 2

Ваша конфигурация должна работать правильно.

Практическое руководство Tomcat объясняет шаги, которые необходимо предпринять, чтобы иметь надлежащий JKS.

Убедитесь, что вы импортировали сертификат в jks с соответствующим псевдонимом (testKey)

Ответ 3

Расширение комментария @Bozho,

Это было действительно важно. "Ключ и приобретенный сертификат должны находиться под одним и тем же псевдонимом.

Сертификат SSL, приобретенный у CA (Verisign, Digicert и т.д.), должен быть импортирован с тем же псевдонимом, что и закрытый ключ, созданный до создания csr. После импорта приобретенного сертификата в хранилище ключей с помощью java keytool вы увидите "Ответ сертификата, добавленный в хранилище ключей".

Чтобы проверить цепочку доверия, используйте команду терминала openssl s_client -connect yourdomain.com:443 -showcerts.. Он начинается с вашего сертификата и ведет к доверенному корневому ЦС.