Бесплатный SSL от Let's Encrypt для Nginx и Apache через Certbot
Выпуск сертификата одной командой, автопродление, несколько доменов, режим certonly и разбор ошибок проверки: таймаут, NXDOMAIN, 404, лимиты.

Без сертификата браузер показывает «Не защищено», а часть функций сайта (геолокация, Service Worker, HTTP/2) вообще не работает. Let’s Encrypt выдаёт сертификаты бесплатно, Certbot их получает, подключает к веб-серверу и продлевает сам.
Что нужно заранее
- Домен с A-записью на IP сервера. Проверка:
getent hosts example.comдолжен вернуть адрес вашего сервера. - Сайт уже открывается по
http://example.comна Nginx или Apache. - Открытый порт 80: именно через него Let’s Encrypt проверяет, что домен ваш. Если стоит брандмауэр, откройте 80 и 443.
Если у домена есть AAAA-запись, Let’s Encrypt проверит сначала по IPv6. Когда AAAA ведёт на другой сервер или IPv6 на сервере не настроен, проверка провалится. Укажите IPv6 этого сервера (на tanaka.host он выдаётся каждому VPS) или удалите запись.
1. Установка Certbot
Nginx:
apt update && apt install -y certbot python3-certbot-nginx
Apache:
apt update && apt install -y certbot python3-certbot-apache
2. Выпуск сертификата
Одна команда получает сертификат, прописывает его в конфиг и включает редирект с HTTP на HTTPS. Через -d перечисляются все имена, с www и без:
certbot --nginx -d example.com -d www.example.com
Для Apache — certbot --apache ....
При первом запуске Certbot спросит почту (туда придут письма, если продление сломается), согласие с условиями (Y) и предложение подписаться на рассылку EFF (можно N). В конце: Successfully deployed certificate.
В конфиг сайта Certbot дописал строки с пометкой # managed by Certbot. В Nginx — прямо в файл в sites-available, в Apache — отдельный файл *-le-ssl.conf.
3. Проверка
certbot certificates
В строке Expiry Date — дата окончания и число дней в скобках, ниже пути к файлам.
4. Автопродление
Сертификаты выдаются на 90 дней. Руками продлевать не нужно: пакет ставит таймер systemd, который проверяет сертификаты дважды в день и продлевает за 30 дней до конца.
certbot renew --dry-run
systemctl list-timers | grep certbot
Первая команда должна закончиться словами all simulated renewals succeeded.
Несколько доменов
Для каждого сайта — отдельный запуск certbot --nginx -d .... Добавить имя к уже существующему сертификату — перечислить старые и новое с флагом --expand:
certbot --nginx --expand -d example.com -d www.example.com -d shop.example.com
Лимиты Let’s Encrypt: не больше 5 выпусков для одного набора имён за 7 дней и не больше 5 неудачных проверок одного домена в час. Если что-то не работает, сначала найдите причину, а не повторяйте команду.
Только получить сертификат
Если конфиг веб-сервера хочется править самому, или сертификат нужен для другой программы (почтовый сервер, панель), используйте certonly:
certbot certonly --nginx -d example.com # проверка через Nginx, конфиг не трогается
certbot certonly --webroot -w /var/www/example.com -d example.com # через папку сайта
certbot certonly --standalone -d example.com # без веб-сервера, займёт порт 80
Файлы лежат в /etc/letsencrypt/live/example.com/: fullchain.pem — сертификат с цепочкой, privkey.pem — закрытый ключ. Ключ никому не передавайте.
Ошибки
Timeout during connect (likely firewall problem). Порт 80 закрыт. Откройте в брандмауэре и проверьте, что веб-сервер его слушает: ss -tlnp | grep ':80 '.
DNS problem: NXDOMAIN looking up A. У домена нет A-записи. Добавьте у регистратора, подождите несколько минут и проверьте getent hosts example.com.
unauthorized: Invalid response ... 404. Домен указывает на другой сервер: старая A-запись, или AAAA ведёт не туда. При --webroot проверьте, что путь в -w совпадает с root сайта.
Could not automatically find a matching server block. Сертификат получен, но Certbot не нашёл server_name с этим доменом в конфиге Nginx. Впишите домен в server_name, nginx -t, reload, затем certbot install --cert-name example.com.
too many certificates / too many failed authorizations. Упёрлись в лимиты. Подождите час (неудачные проверки) или неделю (повторные выпуски). Отлаживайте с --dry-run: тестовые выпуски в лимиты не считаются.
Сертификат истёк и не продлился. Запустите certbot renew вручную и прочитайте ошибку. Лог: /var/log/letsencrypt/letsencrypt.log.
Нужен *.example.com. Wildcard-сертификаты выдаются только через DNS-проверку (плагин под вашего DNS-провайдера или ручной TXT). Если поддоменов немного, проще перечислить их через -d.