Let's Encrypt публичная бета: десять сервисов на TLS за один вечер
Let's Encrypt открыл публичную бету - теперь без очереди и приглашений. За вечер выпустили сертификаты для десяти внутренних сервисов через certbot. Оправданий держать HTTP больше нет.
Let's Encrypt переходит в публичную бету - бесплатные TLS-сертификаты через ACME-протокол доступны всем без приглашений
В сентябре мы писали про закрытую бету Let's Encrypt - тогда нужно было ждать приглашение. Сегодня Let's Encrypt объявил публичную бету: любой желающий может зайти, поставить letsencrypt-auto и получить сертификат без очереди, без формы, без менеджера CA на том конце провода.
Мы это восприняли как руководство к действию и сделали то, что откладывали с сентября.
Что откладывали и почему
После закрытой беты публичные домены клиентов перешли на Let's Encrypt без проблем. Но оставался список внутренних сервисов, которые торчат наружу по HTTPS с самоподписанными сертификатами или вообще на HTTP. Это всякое: Kibana с ELK-стека, Zabbix, внутренний GitLab, несколько API-эндпоинтов под мониторинг, веб-интерфейс Nexus. Боль была небольшая, но постоянная - браузер ругается на сертификат, curl требует -k, новый инженер в команде тратит полчаса чтобы разобраться почему не работает.
Откладывали потому что «надо разобраться отдельно» - у части сервисов домен вида monitoring.example.ru с реальной A-записью, у части что-то хитрее. Казалось, что это на полдня работы.
Оказалось - на вечер, включая чай.
Как шли
Схема для каждого сервиса одинаковая. letsencrypt-auto в режиме --webroot или --standalone, в зависимости от того стоит ли уже что-то на 80-м порту. Если стоит nginx или HAProxy - --webroot с указанием директории для challenge-файлов. Если сервис сам висит на 80-м и его можно на минуту остановить - --standalone, клиент поднимает временный HTTP-сервер сам.
# Вариант с --webroot (nginx уже работает)
./letsencrypt-auto certonly --webroot \
-w /var/www/.well-known \
-d monitoring.example.ru \
--email ops@example.ru \
--agree-tos
# Вариант с --standalone (порт 80 свободен)
./letsencrypt-auto certonly --standalone \
-d nexus.example.ru \
--email ops@example.ru \
--agree-tos
Для --webroot добавили в nginx один location:
location /.well-known/acme-challenge/ {
root /var/www/.well-known-root;
try_files $uri =404;
}
Это универсальный блок, который теперь стоит на всех наших nginx-хостах. Раз добавили - дальше все сертификаты через webroot без остановки сервиса.
После получения сертификата - поправить конфиг приложения или nginx чтобы указывал на /etc/letsencrypt/live/<домен>/fullchain.pem и privkey.pem, перезапустить. Минута работы.
Где зацепились
Три сервиса из десяти дали небольшие проблемы.
Первое - Zabbix. Он стоит на Apache, а у нас всё остальное на nginx. Пришлось либо добавить location для acme-challenge в apache-конфиг, либо поднять nginx спереди как прокси. Выбрали второе - nginx как фронтенд перед Apache стоит у нас в нескольких местах, конфиг типовой. Заодно HTTP/2 включили.
Второе - сервис с нестандартным портом на 443. certbot не знает про нестандартные порты, ему всё равно нужен 80-й для HTTP-валидации. Порт 80 был закрыт файрволом. Открыли, получили сертификат, закрыли обратно. Это немного кривовато, но работает.
Третье - Nexus. Nexus Repository Manager умеет SSL, но конфиг у него в XML-файле Jetty, и туда надо передавать Java keystore, а не PEM. Написали маленький скрипт который после обновления сертификата конвертирует его через openssl и keytool в .jks. Некрасиво, но Nexus в целом некрасивый - это его нормальное состояние.
Автоматическое обновление
Команда renew работает так же как в закрытой бете - проверяет все сертификаты и обновляет те у которых меньше 30 дней. Добавили в cron одну строку которая обслуживает все десять сертификатов сразу:
0 4 * * 2 /path/to/letsencrypt-auto renew --quiet && systemctl reload nginx
Для Nexus с его jks - отдельная строка которая запускает конвертацию после renew.
Что получилось
За один вечер - десять сервисов, ни одного самоподписанного сертификата, ни одного HTTP-эндпоинта. ssllabs.com даёт A на всех публичных, внутренние не проверяли но там то же самое.
Самое ценное наблюдение: ACME-протокол убирает всю бюрократию, которая раньше делала TLS чем-то «что надо запланировать». Раньше получить сертификат - это задача с подзадачами: выбрать CA, заплатить, подтвердить домен через email, скачать, разложить, поставить напоминание за 30 дней до истечения. Сейчас - одна команда и cron.
Это значит что у «оставим на HTTP, там внутренний сервис» больше нет технического обоснования. Только организационная инерция. Мы с ней справились за вечер.
Инфраструктура на сопровождении теперь целиком на TLS. Платные сертификаты остаются только там где нужен EV - и таких кейсов у нас немного.