Сертификат хранилища ключей 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 не представляет правильный сертификат?
Ответы
Ответ 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.. Он начинается с вашего сертификата и ведет к доверенному корневому ЦС.