2010-01-13 10 views
19

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

Проблема у меня есть сейчас, что, когда я подключаюсь к моему примеру Tomcat через HTTPS, сертификат представил меня (сертификат сервера) не мой фактический сертификат сервера, а скорее ключ в хранилище ключей JKS. Использование -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.

кот Конфигурация разъема:

 
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 не представляя правильный сертификат?

+0

указать конфигурацию соединителя ssl (from server.xml) – Bozho

ответ

15

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

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

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

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

  1. Преобразовать существующий сертификат и его закрытый ключ в формате 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

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

    java ImportKey my_private_key.der my_certificate.der

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

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

+2

+1. Вторая ссылка (agentbob.info) работала для меня. Он выдает пароль в хранилище ключей, которое отсутствует в первой ссылке (comu.de). Клавиатурный ключ Java не любит изменять пароль хранилища ключей, у которого нет пароля. Кроме того, вы можете указать ключевой псевдоним tomcat (он «tomcat»). – Wolfgang

3

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

Tomcat's how-to объясняет шаги, которые необходимо предпринять, чтобы иметь надлежащий JKS.

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

+0

Когда я установил keyAlias ​​в псевдоним сертификата в хранилище ключей, Tomcat не загрузится правильно. Я предполагаю, что параметры keyAlias ​​используются для указания ключа, а не сертификата. У меня возникает ощущение, что Tomcat никогда не представит мой сертификат, потому что он был создан отдельно. Прямо сейчас я собираюсь попытаться создать новый сертификат с нуля, используя keytool вместо openssl, и посмотреть, не изменилось ли это. – tmbrggmn

+1

да, попробуйте это. Ключ и сертификат, как это видно из практического руководства tomcat, должны находиться под одним и тем же псевдонимом. – Bozho

+0

Моя предыдущая попытка не удалась. Я делаю что-то неправильно, но я не знаю, что. Возможно ли представить существующий сертификат, или вам нужно использовать keytool для создания нового? Это смущает. – tmbrggmn

2

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

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

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

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

Смежные вопросы