- PVSM.RU - https://www.pvsm.ru -
Возникла передо мной такая задача: автоматический выпуск сертификатов для Web приложения. И требования:
Наверное многие уже слышали про бесплатные сертификаты от LetsEncrypt [2] и certbot. А можно ли certbot заменить Java?
Многие, конечно, любят LetsEncrypt за бесплатные сертификаты, которые, фактически, позволят перевести весь вэб на https. Но не многие
знают, что для этого они придумали специальный протокол — ACME. И для меня он по значимости чуть ли не выше самих бесплатных сертификатов.
Основные особенности протокола:
Для тех, кому интересны детали и все возможные варианты взаимодействия, можно почитать официальную документацию [3]. Она действительно простая и легко читается в отличии от наших гостов. Здесь же я приведу диаграмму последовательности при выдаче сертификата, которую нужно представлять, если Вы решили интегрироваться.
На официальном сайте LetsEncrypt есть множество клиентов [5] работающих по протоколу ACME. Я взял acme4j [6]. Эта библиотека достаточно компактная и работает в compact1 profile!
У неё есть вполне рабочий пример использования [7], с помощью которого я смог выпустить себе сертификат. Для того, чтобы интегрировать библиотеку достаточно с минимальными изменениями скопировать этот код.
Для продления сертификата необходимо авторизоваться, взять уже готовый CSR и отправить его в CA [8]. После чего скачать новый сертификат.
Единственная проблема, которая у меня возникла — это подкладывание сертификата в nginx. Поясню на примере:
И вот тут проблема: для того чтобы включить 443 порт с новым сертификатом, nginx должен перезачитать конфигурацию. Но чтобы это сделать нужен root. Запускать приложение из под root — плохая идея. Запускать nginx из под пользователя тоже — нельзя будет слушать 80/443 порты.
Я добавил правило для пользователя в sudoers, чтобы можно было делать sudo nginx -s reload
. Но это выглядит как костыль. Может кто-нибудь знает как это сделать красивее?
Получение сертификата в автоматическом режиме оказалось достаточно простой процедурой. А если использовать ACME сервер boulder [9], то можно даже развернуть такую схему у себя в большой организации! Если у вас есть собственный CA для внутренних сервисов, то ACME должен сильно упростить работу с сертификатами.
Автор: dernasherbrezon
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/263580
Ссылки в тексте:
[1] Java и без 16Gb памяти?: https://habrahabr.ru/post/333430/
[2] LetsEncrypt: https://letsencrypt.org
[3] draft: https://tools.ietf.org/html/draft-ietf-acme-acme-06
[4] JSON Web Token: https://tools.ietf.org/html/rfc7519
[5] множество клиентов: https://letsencrypt.org/docs/client-options/
[6] acme4j: https://github.com/shred/acme4j
[7] пример использования: https://github.com/shred/acme4j/blob/master/acme4j-example/src/main/java/org/shredzone/acme4j/ClientTest.java
[8] отправить его в CA: https://shredzone.org/maven/acme4j/usage/certificate.html
[9] boulder: https://github.com/letsencrypt/boulder
[10] Источник: https://habrahabr.ru/post/337592/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.