Tomcat 8 + SSL
Исходные данные:
1. Сервер с ОС Linux Debian. В нашем случае это x64 с 8 версией.
2. Apache Tomcat 8
3. 4 сертификата, подписанные удостоверяющим центром:
ca.pem – корневой сертификат,
chain.crt- промежуточный сертификат,
private.key – приватный ключ,
domain_name.crt – собственно сам сертификат домена
Переходим к работе:
Вариант 1.
1. Добавляем пароль к приватному ключу private.key, если он Вами был получен в текстовом виде.
openssl rsa -des3 -in private.key -out private_encrypted.key
после вводим пароль и сохраняем в надежном месте,т.к. утеря пароля приведет Вас к необходимости перевыпуска ssl сертификата.
2. Проводим импорт сертификатов для будущего хранилища:
openssl pkcs12 -export -in domain_name.crt -inkey private_encrypted.key -out keystore.p12 -name it-notepad.com -CAfile ca.pem -caname root
Здесь все довольно понятно, разве что поясним – myhostname, это имя хоста, для которого выпущен ssl сертификат, а также не забываем указать приватный ключ именно тот, который защищен паролем(private_encrypted.key). После отображения приглашения создания пароля, вводим пароль, такой же, как у приватного ключа, иначе по окончании всей работы получим в логах Tomcat Caused by: java.io.IOException: Cannot recover key.
3. Создаем само хранилище
keytool -importkeystore -deststorepass пароль хранилища keystore -destkeystore keystore.kdb -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass пароль защиты от импорта -alias aliasname
4. Добавляем в хранилище промежуточный/промежуточные сертификаты
keytool -import -trustcacerts -alias chainalias -file chain.crt -keystore keystore.kdb
В заключение добавляем коннектор в конфигурационный файл Apache Tomcat – server.xml
Connector port=8443 protocol=HTTP/1.1 SSLEnabled=true maxThreads=150 scheme=https secure=true clientAuth=false sslProtocol=TLS keystoreFile=/etc/tomcat8/ssl/keystore.kdb keystorePass=your_keystore_pass keyAlias=Your_alias;
и не забываем в самом начале файла server.xml в разделе с перечислением директив Listener, проверить, имеется ли следующая запись и в случае ее отсутствия добавить:
Listener className=org.apache.catalina.core.AprLifecycleListener SSLEngine=on
Вариант 2.
openssl pkcs12 -export -in domain_name.crt -inkey private.key -out mycert.p12 -name tomcat -CAfile chain.crt -caname root -chain
Если появляется ошибка: “Error unable to get issuer certificate getting chain” – в файл промежуточного сертификата добавляем сертификат корневого сертификата(в конец файла)
Сonnector port=8443 protocol=HTTP/1.1 SSLEnabled=true maxThreads=150 scheme=https secure=true clientAuth=false sslProtocol=TLS keystoreType=PKCS12 keystoreFile=/opt/tomcat8/ssl/mycert.p12 keystorePass=your_keystore_pass
Возможные ошибки:
keytool error: java.lang.Exception: Public keys in reply and keystore don’t match – проверьте файлы сертификатов, если Вы их создавали в ОС Windows – могут быть артефакты в текстовых файлах – символы перевода строк. В этом случае необходимо создать заново файлы сертификатов. Вторая проблема – в том, что вы пытаетесь добавить промежуточный сертификатом с имеющимся уже alias’ом в keystore.
Обновление для Tomcat 10
Поддержка P12 в Томкат10 считается устаревшей и не будет поддерживаться в будущих версиях. Для RSA шифрования и сертификатов изменяем/добавляем секцию, ответственную за SSL соединение
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" maxThreads="150" SSLEnabled="true" > <SSLHostConfig> <Certificate certificateKeyFile="/opt/tomcat/ssl/private.key" certificateFile="/opt/tomcat/ssl/domain_name.crt" certificateChainFile="/opt/tomcat/ssl/chain.crt" type="RSA" /> </SSLHostConfig> </Connector>