LetsEncrypt: Tomcat
ЛЕНЬ
Ранее поленился и сделал таким образом, что сертификаты синхронизировались в директорию /data/tomcat и в server.xml сделал следующее:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="True"
allowTrace="false"
xpoweredBy="false">
<SSLHostConfig protocols="TLSv1.2">
<Certificate certificateFile="/data/tomcat/letsencrypt/live/site.example.com/cert.pem"
certificateKeyFile="/data/tomcat/letsencrypt/live/site.example.com/privkey.pem"
certificateChainFile="/data/tomcat/letsencrypt/live/site.example.com/chain.pem" />
</SSLHostConfig>
</Connector>
И ничего, вроде все работало до сегодняшнего дня. На сервере ничего не обновлялось значит видимо проблема то ли в letsencrypt либо в Mozilla. В этот раз все таки собрался с силами и сделал как надо ибо сервер скоро уже выходит в продакшн.
ПЕРЕЛЕНЬ
Первым дело переместил сертификаты в /etc/letsencrypt как и должно быть. Погуглил и почитал пару статей для подготовки. Далее надо было из сертификата letsencrypt сделать сертификат формата PKCS:
openssl pkcs12 -export -out /tmp/site.p12 -in /etc/letsencrypt/live/site.example.com/fullchain.pem -inkey /etc/letsencrypt/live/site.example.com/privkey.pem -name tomcat
# тут просят ввести пароль для экспорта
# тут просят подтвердить пароль
Далее конвертируем PKCS в JKS и импортируем в хранилище:
keytool -importkeystore -deststorepass mypass -destkeypass mypass -destkeystore /tmp/site.jks -srckeystore /tmp/site.p12 -srcstoretype PKCS12 -srcstorepass mypass -alias tomcat
# mypass заменить на свой пароль
Подправим server.xml:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="True"
scheme="https"
secure="true"
keystoreFile="/tmp/site.jks"
keystorePass="mypass"
clientAuth="false"
sslProtocol="TLS"
allowTrace="false"
xpoweredBy="false"
keystoreType="PKCS12" />
Перезапускаем сервер и все работает. Далее надо автоматизировать эти действия.
СКРИПТ ДЛЯ СКРИПТА
Поскольку openssl требует ввода пароля, то накидаем expect скрипт, который сам будет вводить пароль:
#!/usr/bin/expect -f
set pwd [lindex $argv 0];
spawn /usr/bin/openssl pkcs12 -export -out /tmp/site.p12 -in /etc/letsencrypt/live/site.example.com/fullchain.pem -inkey /etc/letsencrypt/live/site.example.com/privkey.pem -name tomcat
expect {Enter Export Password:} {send "$pwd\n"}
expect {Verifying - Enter Export Password:} {send "$pwd\n"}
expect eof
Теперь накидаем bash скрипт, который будет запускать expect скрипт и импортировать получившийся сертификат с перезапуском tomcat:
#!/bin/env bash
# mypass заменить на свой пароль
PWD="mypass"
rm -f /tmp/site.p12 /tmp/site.jks
/root/bin/openssl.exp $PWD
keytool -importkeystore -deststorepass $PWD -destkeypass $PWD -destkeystore /tmp/site.jks -srckeystore /tmp/site.p12 -srcstoretype PKCS12 -srcstorepass $PWD -alias tomcat
systemctl restart tomcat
Теперь этот скрипт можно запускать через ssh с скрипта централизованной синхронизации сертификатов.