LetsEncrypt: Tomcat

Жил был сервер. Все работало и бац сегодня сертификат истек потому что это еще не продакшн и поленился обновлять скрипт для синхронизации сертификатов с этим сервером. Однако после обновления сертификата tomcat начал выдавать ошибку SSL_ERROR_RX_RECORD_TOO_LONG.

ЛЕНЬ

Ранее поленился и сделал таким образом, что сертификаты синхронизировались в директорию /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">
</Connector>

Перезапускаем сервер и все работает. Далее надо автоматизировать эти действия.

СКРИПТ ДЛЯ СКРИПТА

Поскольку 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 с скрипта централизованной синхронизации сертификатов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *