Современный веб катится в тартарары — старый добрый http отживает своё и на смену идёт http2. И всё бы ничего, но требованием к новому стандарту является обязательное шифрование. К сожалению ключи у нас не просто платные, а довольно негуманно платные. Навскидку глянул на reg.ru — минимум 1499 руб. в год. Но мир не без добрых людей и есть возможность заполучить заветный сертификат бесплатно.
Аттракцион неслыханной щедрости предоставляет сервис Let«s Encrypt, который является некоммерческой организацией и ставит своей целью обеспечение безопасности в сети Интернет.
Платой за халяву является малое время жизни сертификата (90 дней) и соответственно необходимость его периодически обновлять. Но с другой стороны процесс довольно сильно автоматизирован и имея светлую голову и прямые руки растущие из плеч можно переложить всю эту грязную работу на плечи компьютера.
Как оно работает
Работа сервиса основана на использовании протокола автоматического управления сертификатами ACME. Кому интересно переходите по ссылке и изучайте. Мне как-то сильно забивать голову деталями не захотелось, поэтому мне достаточно общего понимания принципа.
В общем суть работы этого сервиса такая на сервер ставится специальная программа-агент, которыая при первом старте генерирует пару ключей и фактически создаёт аккаунт на сервере Let„s Encrypt, к которому (аккаунту) и будут в дальнейшем привязываться домены сервера. Дальше с помощью этой программы мы можем создавать, удалять или обновлять сертификаты. Вот собственно и всё — думаю этих знаний пока достаточно, чтобы начать работу с этим сервисом. Ну чо — поехали ставить.
Установка агента
Как оказалось есть уже довольно много вариантов клиентов Let‚s Encrypt. С полным списком ACME клиентов можно ознакомиться тут. Не хочу особо заморачиваться, поэтому воспользуюсь стандартным клиентом certbot
как собственно и рекомендовано в руководстве. Хотя где-то читал, что acme-client типа довольно неплох. Может как-нибудь и проверю.
Certbot
Итак certbot
. Программа на python-е. Расширяема кучей плагинов. Во время работы поднимает временный веб-сервер для общения с сервером Let‚s Encrypt.
В связи с этим если на сервере уже есть что-то на 443 порту, то лучше его временно стопнуть. Я делал замену самоподписных сертификатов на одном из серверов и получил от certbot
-а ошибку. Хотя думаю при использовании плагина webroot
такой проблемы бы не было.
Стандартный режим работы с плагином webroot
требует наличия на вебсервере папки .well-known
доступной снаружи сервера. В неё он будет генерировать временные файлы и показывать их серверу Let‚s Encrypt.
Но меня больше зацепило наличие плагина для работы с nginx
-ом, который использовался у меня на сервере.
Ставим по инструкции на сайте
Заходим на сайт cetbot
-а https://certbot.eff.org/, выбираем сервер, ОС из списка и получаем инструкции как всё это установить. В моём тестовом случае заветная комбинация была nginx
и CentOS 7
Попытка установить certbot
по инструкции из репозитария потерпела фиаско:
1 | $ sudo yum install certbot |
В результате установка прошла успешно, но получаем древнюю как говно мамонта версию. Критичным для меня оказалось, что в этой версии нет плагина для поддержки nginx-а. Поэтому решил попробовать альтернативные варианты установки.
Ставим вручную
Процесс установки certbot
вручную описан вот тут
Итак ближе к делу — выкачиваем программу и складываем её куда-нибудь на видное место. В моём случае это будет /usr/local/sbin
1 | $ cd /usr/local/sbin |
Программа типа умная и сама устанавливает дополнительные зависимости и питоновские библиотеки. ОС видимо тоже определила сама, т. к. ставилось всё родным пакетным менеджером. Ждём пока ставится куча всякого гуано, а потом запускаем
1 | $ sudo certbot --nginx |
Дальше будет интерактивный процесс установки, скрипт просканирует конфиги nginx-а, спросит для какого из хостов произвести установку, запросит так-же ваш email и собственно на этом всё. Будут сгенерированы ключи и прописаны соответствующие команды в выбранные хосты nginx-а.
Мне эта копипаста в конфигах nginx
-а не понравилась и я решил вынести общие настройки во внешний файл и подключать его includ-ом по надобности, но к удивлению обнаружил, что certbot
такой файл уже создал (но почему-то не задействовал). Файл лежит на сервере вот тут /etc/letsencrypt/options-ssl-nginx.conf
Итого в nginx-е получилась вот такая конструкция
1 | server { |
Подключены сертификаты и общий файл с настройками. Для разных хостов меняем только файлы, а настройки инклюдим те-же.
Далее нужно не забыть прописать команду для обновления ключей в crontab, т. к. ключи выдаются только на 90 дней.
На сайте certbot
-а видел рекомендацию запускать обновление два раза в день в случайное время, но пока поленился и прописал в одно и то-же время раз в два месяца. Собственно частый запуск ни на что не влияет и certbot
достаточно умён, чтобы не обновлять сертификат пока он не истёк.
Автоматизируй это
Хотел автоматизировать установку. В сети есть огромное количество рецептов для ansible, но всё какая-то кустарщина. Не стал пока связываться.
Кроме того как оказалось в ansible
есть уже и встроенный модуль http://docs.ansible.com/ansible/letsencrypt_module.html, но судя по описанию там какой-то шлак и нужен двойной запуск ansible
c какими-то ручными операциями между запусками, что как-то поубавило мой пыл.
Бэкапы
Рекомендуется делать бэкап папки /etc/letsencrypt
на сервере. Собственно там хранятся все ключи и настройки обновления. Папка генерируется certbot
-ом при его первом запуске. Думаю это важный момент.
Источники
Ну и конечно ссылки на бесценные источники информации, где можно почерпнуть наверно и более исчерпывающую информацию.
Комментарии