Moderator
Рейтинг (т): 271
|
Читаем документацию Tomcat 5.5 ( SSL Configuration HOW-TO и Apache Tomcat Configuration Reference - The HTTP Connector), делаем, как написано (c дополнениями и уточнениями, т. к. в документации рассчитывают на стандартный keystore, поставляемый с jre/jdk):
- Создаём keystore с ключом:
>keytool -genkey -alias tomcat -keyalg RSA -keystore mystore 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 <tomcat> (RETURN if same as keystore password): >
Обратите внимание на то, что для ключа пароль не был введён (в этом случае используется пароль хранилища). В принципе, можно было бы указать отдельный пароль для ключа в конфигурации, но в текущей документации я почему-то такого параметра не нашёл. - Конфигурируем SSL-коннектор (фрагмент server.xml):
<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="mystore" keystorePass="mystorepassword" keystoreType="JKS" keyAlias="tomcat"/>
Содержимое до атрибута "keystoreFile" взято из закоментированного примера там же, в server.xml.
Всё, можно запускать Tomcat, SSL уже работает. Осталось разобраться с двухфазовым SSL.
Механизм проверки очень прост: необходимо, чтобы у сервера нашелся ключ, subject distinguished name которого будет совпадать с issuer distinguished name проверяемого ключа (при этом клиент не обязательно должен обладать таким ключом, т. к. можно в диалоговом режиме подтвердить доверие). Когда используются ключи, выданные центром сертификации, у нас уже есть публичный ключ центра и свой, подписанный этим центром. В случае с самоподписанным ключом (именно такие ключи по создаёт keytool) необходимо, чтобы публичный ключ используемый клиентом, был в truststore сервера.
Я приведу пример для второго случая.
- Ключ для сервера у меня уже есть, теперь нужен ключ для клиента:
>keytool -genkey -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12 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 <client> (RETURN if same as keystore password):
Обратите внимание на то, что я задал другой тип хранилища - мой браузер не понимает формата JKS. - Теперь нужно поместить публичный ключ в truststore сервера. Для этого я импортирую его из полученного хранилища:
>keytool -export -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12 -file clientcert Enter keystore password: myclientstorepassword Certificate stored in file <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
- Дополняю конфигурацию сервера. Теперь конфигурация SSL-коннектора выглядит так:
<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="mystore" keystorePass="mystorepassword" keystoreType="JKS" keyAlias="tomcat" truststoreFile="mytruststore" truststorePass="mytruststorepassword" truststoreType="JKS"/>
- Перезапускаю сервер. Теперь мне осталось зарегистрировать свои ключи в браузере. Я использую Оперу, поэтому в меню Tools выбираю пункт Preferences, далее вкладку Advanced, пункт списка Security, нажимаю Manage certificates; импортирую файл myclientstore.
Всё, теперь можно открывать в браузере https://localhost:8443.
Если вы хотите, чтобы браузер не спрашивал каждый раз о доверии серверу, нужно экпортировать публичный ключ из хранилища mystore и зарегистрировать его в браузере, как ключ доверенного центра сертификации.
Гораздо более простой вариант (для тестов) - использовать одно и то же хранилище для всего (нужно только выбрать верный формат). Тогда не нужно будет ничего никуда импортировать/экспортировать.
|