Написал программу для автоматического выписывания ssl-сертификатов налету (при первом запросе к домену).
Для начала работы программы её достаточно просто запустить, настраивать не надо совсем (даже домены для сертификатов указывать не надо).
github.com/rekby/lets-proxy/releases/latest
Подробности внутри.
Изначально это выглядело примерно так: одна программа составляет список доменов для которых нужен сертификат, вторая программа идёт и эти сертификаты выписывает, третья проверяет выписанные сертификаты и составляет их список для haproxy/nginx (потому что с неправильными сертификатами они не перезапустятся при обновлении списка сертификатов и все https-сайты лягут). Работает это вполне надёжно, но получается много компонентов.
Кроме того запуск этого чуда на windows + iis оказался нетривиальным и там коллега придумывал дополнительные костыли.
Требования:
1. Со стороны клиента поддержка SNI (основными браузерами давно поддерживается).
2. Со стороны сервера: чтобы туда можно было из golang бинарник скомпилировать (windows,linux,freebsd,mac). Проверяется на windows и linux.
Принцип работы:
Программа работает как реверс-прокси, выписывая правильные сертификаты на ходу по мере необходимости.
При получении запроса через расширение SNI программа узнаёт домен для которого нужен сертификат. Если сертификат уже есть — дальше идёт обработка с уже существующим сертификатом.
Если сертификата нет — отправляется запрос в lets encrypt на получение сертификата из SNI-заголовка и потом обработка идёт с только что полученным сертификатом (сертификат сохраняется в кеш).
В lets encrypt домен проверяется методом tls-sni-01 — путём выдачи сертификата на специально сформированный https-запрос.
Время на все проверки и получение сертификата — около 3 секунд. Это задержка для первого https-запроса к домену.
Дальше запрос уходит на тот же IP, на котором был принят https-запрос, но уже на порт 80 и без шифрования — т.е. обычный http.
Автор: rekby