PM.kitten События Почему Dotty Вечный сервер LazWebBox 2.0 ИПФ Назначение Статьи

SSL в jetty без nginx

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  канал в Дзен