SSL без nginx
Чтобы добавить ssl в своё приложение, обычно, приходится ставить всякие прослойки или добавлять непонятные и никем не контролируемые стартёры и зависимости.
Конечно, java и scala отлично работают с SSL, к примеру, при использовании jetty добавление нового коннектора для https будет выглядеть так
val server = new Server(httpPort)val sslContextFactory = new SslContextFactory.Server sslContextFactory.setKeyStoreResource(findKeyStore) sslContextFactory.setKeyStorePassword(storePassword) sslContextFactory.setKeyManagerPassword(managerPassword)
// Установка конфигурации HTTPS val httpsConf = new HttpConfiguration httpsConf.setSecurePort(httpsPort) httpsConf.setSecureScheme("https") httpsConf.addCustomizer(new SecureRequestCustomizer) // Добавления ssl для объекта запроса
// Установка коннектора для SSL val httpsConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, "http/1.1"), new HttpConnectionFactory(httpsConf)) httpsConnector.setPort(httpsPort)
server.addConnector(httpsConnector)
В этом плане, чем хорош wicket, так это тем, что он позволяет прозрачно и ясно определять коннекторы и поведение приложения напрямую, без копания в конфигах помников, чем, к слову, довольно часто грешит Spring Boot.
Однако, сертификат letsencypt, как и любой другой, к сожалению не вечен - его надо обновлять.
Как же быть в таком случае?
Неужели ставить nginx и мириться с ограничением длины заголовков и молчаловой обрезкой контента при нехватке места в temp?
Разумеется, нет, достаточно потратить минут пять своего времени и можно отлично обновлять сертификаты без какого-либо посредика.
Пример простенького скрипта для обновления сертифкатов в java приложении:
#!/usr/bin/bash# # Сценарий для обновления сертификатов сайта pmkitten.com # Сертификаты выдаются сервисом letsencrypt.org и должны продляться раз в три месяца # Данный сценарий самостоятельно освобождает порт подтверждения владения доменом, # получает сертификат через бот сертификации и запускат приложение заново. #
#--- Настройки сценария ---
#Наименование JAR файла с приложением на scala3 JAR_NAME=scala3-pmkitten-ui-assembly-0.1.0.jar #Наименование пользователя JAR_USER_NAME=... #Каталог, где находится JAR файл JAR_PATH=pm #Порт, на котором приложение должно работать JAR_SERVER_PORT=8080
#Домены, на которых работает приложение, через запятую JAR_DOMAINS=pmkitten.com,www.pmkitten.com #Основной домен (без www) JAR_MAIN_DOMAIN=pmkitten.com #Пароль в хранилище ключей JAR_KEY_PASS=... #Хранилище ключей для scala 3 приложения JAR_KEYSTORE=kestore #Путь к хранилищу ключей внутри JAR JAR_KEYSTORE_PATH=/resources/ssl
#--- Конец настроек ценария ---
if openssl x509 -noout -in /etc/letsencrypt/live/$JAR_MAIN_DOMAIN/fullchain.pem -checkend 1 then echo "Сертификат не просрочен - обновления сертификата не требуется" exit 0 fi
#Остановка приложения, которое работало в отключенной сессии экрана ps -ef | grep $JAR_NAME | grep -v SCREEN | grep -v grep | awk '//{print $2}' | xargs kill
#Время на остановку приложения sleep 1
#Запуск бота сертификации от lets encrypt certbot -d $JAR_DOMAINS certonly --standalone --http-01-port $JAR_SERVER_PORT
CURDIR=$(pwd) WRKDIR=$(mktemp -d)
#Забор ключа, пролученного от бота сертификации в хранилище ключей java для https cd $WRKDIR openssl pkcs12 -export \ -in /etc/letsencrypt/live/$JAR_MAIN_DOMAIN/fullchain.pem \ -inkey /etc/letsencrypt/live/$JAR_MAIN_DOMAIN/privkey.pem \ -out fullchain_and_key.p12 \ -name jetty \ -passout pass:$JAR_KEY_PASS
keytool -importkeystore \ -destkeystore $JAR_KEYSTORE \ -srckeystore fullchain_and_key.p12 \ -alias jetty \ -deststorepass $JAR_KEY_PASS \ -srcstorepass $JAR_KEY_PASS
jar uvf $JAR_NAME $JAR_KEYSTORE $JAR_KEYSTORE_PATH
cd $CURDIR rm -r $WRKDIR
#Запуск приложения под его пользователем в новой сесси экрана sudo -H -u $JAR_USER_NAME bash -c "(cd; cd $JAR_PATH; screen -d -m java -Dserver.port=$JAR_SERVER_PORT -jar $JAR_NAME)"
Сценарий надо запускать когда сертификат уже просрачивается и на почту приходит уведомление - до этого времени сертифкат ботом не будет перевыпускаться.
Написано на Dotty и Wicket
!без Web 2.0!
Адаптировано для работы в Lynx
канал в Дзен