Pull to refresh

Настройка SSL для TomCat

Reading time 6 min
Views 82K
Пару недель назад столкнулся с проблемой — стоит TomCat на сервере(windows 2008), ставлен не мной, мало того, я даже не видел как его ставили. Нужно сделать авторизацию по SSL протоколу. Раньше никогда не настраивал веб-сервера ни на винде ни на никсах, а решать нужно в кратчайшие сроки — 3 дня. Решил спросить у гугла с яндексом и нашел куче статей как сделать SSL шифрование канала и одну малопонятную о «двухфазной авторизации». Мучался все 3 дня и на исходе срока получил решение (как всегда светлая идея пришла с великого бодуна). Теперь подробнее:
как устанавливать TomCat описывать не буду, т.к. таких статей валом.
Для начала создаём хранилище (keystore) с ключом:
Наберем в коммандной строке следующий код:

>keytool -genkey -alias tomcat -keyalg RSA -keystore mystore -validity 999 -keysize 512

Здесь:
— tomcat — имя псевдонима
— keyalg — алгоритм формирования ключа
— keystore — имя хранилища
— validity – Срок действия сертификата
— keysize – Размер ключа
В результате на консоле увидите следующее:
Enter keystore password: mystorepassword
What is your first and last name?
[Unknown]: firstname lastname
What is the name of your organizational unit?
[Unknown]: organizationalunit
What is the name of your organization?
[Unknown]: organization
What is the name of your City or Locality?
[Unknown]: city
What is the name of your State or Province?
[Unknown]: state
What is the two-letter country code for this unit?
[Unknown]: ru
Is CN=firstname lastname, OU=organizationalunit, O=organization, L=city, ST=state, C=ru correct?
[no]: yes
Enter key password for (RETURN if same as keystore password):
То что выделено жирным — вводиться вручную, запросы появляются построчно.
Обратите внимание на то, что для ключа пароль не был введён (в этом случае используется пароль хранилища).

Конфигурируем SSL-коннектор (фрагмент server.xml):
Находим запись

<!-- Define a SSL HTTP/1.1 Connector on port 443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->

и ниже нее добавляем

<Connector port="8443" SSLEnabled="true" maxHttpHeaderSize="8192" 
        maxThreads="150" minSpareThreads="25" maxSpareThreads="200"
        enableLookups="false" disableUploadTimeout="true"         
        acceptCount="100" scheme="https" secure="true"
         clientAuth="false" sslProtocol="TLS"
         keystoreFile="mystore" keystorePass="mystorepassword" keystoreType="JKS"
         keyAlias="tomcat"/>

Находим строку:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
— по умолчанию 27 строка, закомментируем её.
Так же, если у вас есть вот такая строка:

<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />

тоже её комментируем.
Теперь кидаем файл mystore из папки с явой в корень томката, если кинуть не в корень то нужно изменить строку
 keystoreFile="mystore"
на
 keystoreFile="/ваш путь/mystore"

Строка
keystorePass="mystorepassword"
— «mystorepassword», это ваш пароль указанный при создании хранилища с ключем.
Запускаем Tomcat, SSL- шифрование уже работает.

«Двухфазный» SSL — авторизация на сайте по сертификату

Механизм проверки очень прост: необходимо, чтобы у сервера нашелся ключ, subject distinguished name которого будет совпадать с issuer distinguished name проверяемого ключа (при этом клиент не обязательно должен обладать таким ключом, т. к. можно в диалоговом режиме подтвердить доверие). Когда используются ключи, выданные центром сертификации, у нас уже есть публичный ключ центра и свой, подписанный этим центром. В случае с самоподписанным ключом (именно такие ключи по создаёт keytool) необходимо, чтобы публичный ключ используемый клиентом, был в truststore сервера.

Ключ сервера мы генерировали выше, теперь сделаем ключ клиента
Наберем в консоли следующую команду

keytool -genkey -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12 -validity 999 -keysize 512

на консоли появится следующее:
Enter keystore password: myclientstorepassword
What is your first and last name?
[Unknown]: client
What is the name of your organizational unit?
[Unknown]: orgunit
What is the name of your organization?
[Unknown]: org
What is the name of your City or Locality?
[Unknown]: locality
What is the name of your State or Province?
[Unknown]: state
What is the two-letter country code for this unit?
[Unknown]: RU
Is CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU correct?
[no]: yes
Enter key password for (RETURN if same as keystore password):

все по аналогии с генерацией ключа сервера, появился только параметр
 -storetype
. Этот параметр указывает тип хранилища поддерживаемое нашим браузером, если не знаете точно какой тип у вас — не меняйте, этот подходит для всех (проверено электроникой!!!)
 -keystore
— здесь это уже хранилище сертификатов клиентов.
Следующий этап — помещаем публичный ключ в доверенное хранилище( truststore) сервера. Для этого экспортируем его из полученного хранилища(myclientstore) в файл clientcert:
Введем в консоли следующую комманду:

keytool -export -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12 -file clientcert 


в ответ увидим:

Enter keystore password: myclientstorepassword
Certificate stored in file " clientcert "

Здесь вопрос «Enter keystore password: » просит не новый пароль, а тот, который мы ввели при формировании «myclientstore»
Тут думаю все уже понятно, т.к. всепараметры рассмотрены выше. А результат — файл clientcert.
Полученный файл импортируем в новое хранилище для сервера (это и будет truststore):
Введем в консоли комманду

keytool -import -alias client -keyalg RSA -keystore mytruststore -storetype JKS -file clientcert 


Нас спросят

Enter keystore password: mytruststorepassword

если ответили правильно то увидим

Owner: CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU
Issuer: CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU
Serial number: 462a2361
Valid from: Sat Apr 21 18:44:49 MSD 2007 until: Fri Jul 20 18:44:49 MSD 2007
Certificate fingerprints:
MD5: 78:55:83:13:3A:4F:DB:CA:1A:60:5E:A4:87:1D:EC:93
SHA1: 7A:A7:7C:C6:71:2B:82:74:9C:4F:C7:3D:FA:14:AD:2A:E5:BF:39:2F

последний вопрос

Trust this certificate? [no]: yes

а в ответ

Certificate was added to keystore

Здесь вопрос «Enter keystore password: » просит не новый пароль, а тот, который мы ввели при формировании «mytruststore»
Ну вот, все сертификаты сформированы и помещены в доверенные хранилища.
Теперь надо сказать серверу что их нужно использовать, дополняем конфигурацию сервера. Теперь конфигурация SSL-коннектора выглядит так:

<Connector port="8443" SSLEnabled="true" maxHttpHeaderSize="8192" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="200"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="mystore" keystorePass="123456" keystoreType="JKS"
keyAlias="tomcat"
truststoreFile="mytruststore" truststorePass="123456" truststoreType="JKS"/>

Пути до mytruststore,mystore как и было уже сказано можно менять, не забудьте заодно поменять и значения паролей :-)

Если в trustedstore нужно добавить сторонний сертификат используйте следующий код:
keytool -import -mytruststore -keystore mystore -alias tomcat -file clientcert


Если в trustedstore нужно удалить сертификат используйте следующий код:
keytool -delete -mytruststore -keystore mystore -alias tomcat -file clientcert


Копируем файлы mytruststore и mystore в корень томката или в папки указаные в параметрах коннектора (keystoreFile и truststoreFile) ели вы их изменили.
Импортируем myclientstore в используемый браузер в сертификаты. Т.е. на примере IE:
Сервис-> Свойства обозревателя->Содержание->Сертификаты->Импорт->Далее->Обзор->Все файлы->Находим папку с явой (по умолчанию там сохраняются новые генерированные файлы), выбираем наш myclientstore, -> Далее-> вводим пароль который мы задавали при генерации myclientstore и все!
Перезапускаем сервер.
Сейчас если набрать https :// localhost:8443 — сервер потребует сертификат, но если набрать
http ://localhost:8080 откроется та же страница, что и в первом случае, но без всякой защиты. Для того чтобы все запросы перенаправлялись с http на https в web.xml добавляем
до закрытия web-app:

<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
 <url-pattern>/*</url-pattern>
</web-resource-collection>
<!—если ваш сервер требует аутерификации -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>


Перезапускаем сервер, вуаля – все работает!
Надеюсь эта статья будет более понятна чем остальные, т.к. тут я собрал все крупицы знаний найденных в интернете и опыт полученный мною в момент жесткого занятия любовью с SSL и TomCat.
Tags:
Hubs:
+2
Comments 1
Comments Comments 1

Articles