Apache-tomcat
Для того, чтобы 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