Let’s Encrypt: как я настроил SSL и забыл про сертификаты навсегда
Почему я боялся SSL
Честно: SSL казался мне чем-то сложным. Платные сертификаты, заполнение CSR, ожидание подтверждения — всё это отпугивало. Мой первый сайт висел на голом HTTP, и меня это не парило. Пока Chrome не начал показывать «Не защищено» прямо в адресной строке.
Гости заходили и видели красный значок. Конверсия? Какая конверсия, когда тебя помечают как опасного.
Let’s Encrypt изменил всё. Бесплатные сертификаты, автоматическое обновление, никакой бюрократии. За 5 минут ты получаешь HTTPS, и браузер тебе доверяет. Но обо всём по порядку.
Ставлю Certbot
Certbot — официальный клиент Let’s Encrypt. На Ubuntu ставится из репозитория. На моей Ubuntu 24.04 версия уже не совсем свежая, но для дела хватит:
sudo apt install certbot python3-certbot-nginx -y
Ключевой момент — python3-certbot-nginx. Это плагин, который сам правит конфиги nginx. Если пропустить этот пакет, придётся всё делать руками.
Дальше — получить сертификат. Команда тривиальная:
sudo certbot --nginx -d mysurik.ru -d www.mysurik.ru
Certbot проверяет, что домен действительно мой (через http-01 challenge), затем выпускает сертификат и сразу же подставляет его в nginx. Я просто обновил страницу — и сайт уже на HTTPS. Зелёный замочек в строке — я смотрел на него минуту, не веря, что это так просто.
Автообновление — магия
Сертификаты Let’s Encrypt живут 90 дней. Потом надо обновлять. Если забудешь — сайт перестанет открываться по HTTPS. Звучит страшно, но certbot сам ставит systemd-таймер, который проверяет сертификаты дважды в день и обновляет, если до истечения осталось меньше 30 дней.
Проверить статус таймера:
sudo systemctl status certbot.timer
Работает. Я сначала не поверил и решил проверить вручную — запустил сухое обновление:
sudo certbot renew --dry-run
Всё ок. Теперь я про сертификаты забыл. Честно, я даже не вспоминаю про них, пока не вижу где-нибудь кнопку «проверить SSL».
Что пошло не так
Первая проблема — www-редирект. Когда certbot подставил сертификат, он сконфигурировал nginx слушать 443 с mysurik.ru и www.mysurik.ru. Но редирект с HTTP на HTTPS остался недонастроенным. Пришлось вручную править server-блоки в /etc/nginx/sites-available/default.
Вторая проблема — я случайно удалил сертификат. Пытался почистить nginx-конфиги от мусора и грохнул папку с сертификатами. Пришлось перевыпускать. Certbot позволяет просто запустить ещё раз — он увидит, что сертификата нет, и выпустит новый.
Третья — на одном из поддоменов сертификат не обновился автоматически. Оказалось, nginx не перечитывал конфиги после обновления. Пришлось добавить в крон перезагрузку nginx после обновления сертификата. Certbot поддерживает хуки:
sudo certbot renew --post-hook "systemctl reload nginx"
В /etc/letsencrypt/cli.ini я прописал эту опцию, чтобы не забывать.
Wildcard-сертификат
Когда я завёл второй поддомен, захотелось wildcard — чтобы *.mysurik.ru был покрыт одним сертификатом. Let’s Encrypt его даёт, но через DNS-01 challenge. Пришлось подтверждать владение доменом через DNS-запись.
С Certbot это выглядит так:
sudo certbot certonly --manual --preferred-challenges dns -d *.mysurik.ru -d mysurik.ru
Certbot выдаёт TXT-запись, я захожу в панель управления DNS (у меня Cloudflare), добавляю её, жду пару минут и нажимаю Enter. Сертификат выпущен. Но обновлять вручную — боль. Пришлось автоматизировать через API Cloudflare, но это отдельная история.
Итог
Сейчас HTTPS стоит везде. Основной домен, три поддомена, даже почтовый сервер. Всё через Let’s Encrypt. Сертификаты обновляются сами, я только раз в месяц мельком проверяю, что таймер жив.
Let’s Encrypt — лучший подарок вебу от некоммерческих организаций. Бесплатно, надёжно, автоматически. Если ты до сих пор без HTTPS — исправляй. Это пять минут работы. Я серьёзно.