Apache-tomcat

Материал из OpenWiki
Перейти к: навигация, поиск

Для того, чтобы tomcat смог работать по https, необходимо включить соответствующий коннектор. Коннектор - это то, что принимает непосредственно клиентские подключения и может аутентифицировать.

Коннекторы настраиваются в server.xml. Важен ригистр букв, это пример для 6 версии, для 5.5 кое-какие параметры должны быть полностью в нижнем регистре.

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
                address="192.168.0.1"
                maxHttpHeaderSize="8192" minSpareThreads="25" maxSpareThreads="75"
                enableLookups="false" disableUploadTimeout="true"
                acceptCount="100" 
                keystoreFile="${catalina.home}/conf/ssl/key_store.jks"
                keystorePass="qwerty"
                truststoreFile="${catalina.home}/conf/ssl/key_store.jks"
                truststorePass="qwerty"
                keyAlias="server"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS" />

Далее создаем keystore - это хранилище ключей, своего рода база данных с ключами и сертификатами в формате JKS(Java Key Store). Хранилище создается автоматически при генерации первого ключа. Если в настройках коннектора не указано обратное, то на стороне сервера используется первая пара сертификат/ключ.

Пример для простого случая, без CA, когда не нужно импортировать, подписавать и т.д.:

Генерируем ключи:

keytool --genkey -alias server -keystore keystore.jks -storepass qwerty
keytool --genkey -alias client1 -keystore keystore.jks -storepass qwerty
keytool --genkey -alias client2 -keystore keystore.jks -storepass qwerty

При этом, хранилище keystore.jks создается автоматически при попытки записи в него первой пары, которая, в свою очередь, будет использоваться на стороне сервера. Если в будущем планируется экспортировать из хранилища ключи, то при их создании пароль необходимо оставить пустым.

Смотрим что получилось:

keytool --list -keystore keystore.jks -v -storepass qwerty

Теперь настройка ролей(tomcat-users.xml), пример объясняет все:

<tomcat-users>
  <role rolename="manager"/>
  <role rolename="simpleuser"/>
  <user username="CN=Vasva Pupkin, OU=IT dept., O=RogaAndKopblta, L=Moscow, ST=Moscow, C=RU" password="null" roles="manager"/>
  <user username="CN=Bzdishek Zapodlivsky, OU=IT dept., O=RogaAndKopblta, L=Moscow, ST=Moscow, C=RU" password="null" roles="simpleuser"/>
</tomcat-users>

Работать с JKS может, в основном, java-софт, да и то не весь. По этому возникает необходимость в конвертации пары ключ/сертификат в формат PKCS#12 для последующей передачи пользователю. Для начала экспортируем из JKS соответствующий сертификат:

keytool -export -alias client1 -keystore keystore.jks -storepass qwerty -file \
client1.der

По скольку утилита keytool экспортирует в формате DER, конвертируем это дело сначала в PEM, потом в PKCS#8:

openssl x509 -out client1.pem -outform PEM -text -in client1.der -inform DER
openssl pkcs8 -inform PEM -nocrypt -in client1.der -out client1.p8

Теперь необходимо "выдернуть" из JKS ключ соответствующий экспортированному сертификату. Проблема в том, что keytool не умеет этого делать. Для этого воспользуемся сторонней утилитой(или напишем сами), например http://www.mailthru.com/jkskeyexporter:

sh exportKeys.sh keystore.jks client1 qwerty > client1.pem

И, наконец, создаем PKCS#12:

openssl pkcs12 -export -out client1.pfx -inkey client1.p8 -in client1.pem

Проверяем, что получилось:

openssl pkcs12 -in client1.pfx -nodes