Підтримка https зовсім без налаштувань

Написав програму для автоматичного виписування ssl-сертифікатів нальоту (при першому запиті до домену).
Для початку роботи програми її достатньо просто запустити, налаштовувати не треба зовсім (навіть домени для сертифікатів вказувати не треба).

github.com/rekby/lets-proxy/releases/latest

Подробиці всередині.


ПередісторіяЯ працюю з let's encrypt приблизно з квітня цього року, виписуючи сертифікати у великих кількостях (багато тисяч, постійно додаються нові).
Спочатку це виглядало приблизно так: одна програма складає список доменів, для яких потрібен сертифікат, друга програма йде і ці сертифікати виписує, третя перевіряє виписані сертифікати і складає їх список для 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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.