- PVSM.RU - https://www.pvsm.ru -

Управление сертификатами с помощью протокола ACME

Возникла передо мной такая задача: автоматический выпуск сертификатов для Web приложения. И требования:

  • CA должны доверять все браузеры т.е. самоподписанные сертификаты не подходят;
  • желательно бесплатно;
  • Выпуск надо делать программно с помощью Java Embedded compact1 profile. Это всё по следам Java и без 16Gb памяти? [1].

Наверное многие уже слышали про бесплатные сертификаты от LetsEncrypt [2] и certbot. А можно ли certbot заменить Java?

Управление сертификатами с помощью протокола ACME - 1

ACME

Многие, конечно, любят LetsEncrypt за бесплатные сертификаты, которые, фактически, позволят перевести весь вэб на https. Но не многие
знают, что для этого они придумали специальный протокол — ACME. И для меня он по значимости чуть ли не выше самих бесплатных сертификатов.

Основные особенности протокола:

  • Описывает взаимодействие клиента и REST сервера;
  • Есть поддержка как платных сертификатов, так и бесплатных;
  • Несколько способов авторизации владения доменом;
  • Внесен на принятие в IETF. Сейчас находится в состоянии draft [3];
  • Все сообщения передаются в формате JSON Web Token [4].

Для тех, кому интересны детали и все возможные варианты взаимодействия, можно почитать официальную документацию [3]. Она действительно простая и легко читается в отличии от наших гостов. Здесь же я приведу диаграмму последовательности при выдаче сертификата, которую нужно представлять, если Вы решили интегрироваться.

Управление сертификатами с помощью протокола ACME - 2

Использование

На официальном сайте LetsEncrypt есть множество клиентов [5] работающих по протоколу ACME. Я взял acme4j [6]. Эта библиотека достаточно компактная и работает в compact1 profile!

У неё есть вполне рабочий пример использования [7], с помощью которого я смог выпустить себе сертификат. Для того, чтобы интегрировать библиотеку достаточно с минимальными изменениями скопировать этот код.

Для продления сертификата необходимо авторизоваться, взять уже готовый CSR и отправить его в CA [8]. После чего скачать новый сертификат.

Единственная проблема, которая у меня возникла — это подкладывание сертификата в nginx. Поясню на примере:

  • приложение стартует в первый раз;
  • nginx стартует. Поскольку приложение стартует в первый раз, то сертификата ещё нет, и nginx слушает на 80 порту;
  • пользователь заходит в приложение, соглашается с правилами использования сертификатов LetsEncrypt и нажимает кнопку "выдать сертификат";
  • сертификат скачивается.

И вот тут проблема: для того чтобы включить 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