Коротко: Let's Encrypt — некоммерческий центр сертификации, выдающий SSL-сертификаты бесплатно: certbot по протоколу ACME сам подтверждает владение доменом, ставит и продлевает сертификат без человека. Ниже — как получить бесплатный SSL-сертификат за 10 минут, выпустить wildcard, настроить автопродление и обойти типовые ошибки.

Что такое Let's Encrypt и почему SSL-сертификат бесплатный
Let's Encrypt — проект некоммерческой Internet Security Research Group (ISRG) на взносы Mozilla, EFF, Cisco и других. Цель — полностью шифрованный веб, поэтому сертификат выдают бесплатно любому владельцу домена, без документов и менеджеров. Это DV-сертификат: подтверждает владение доменом, а не юрлицо — разница с OV и EV в статье о типах SSL-сертификатов; шифрование то же, что у платных.
Лимиты (актуальный список — на letsencrypt.org):
- 50 сертификатов в неделю на домен.
- 100 SAN-имён в сертификате.
- 5 дублей одного набора имён в неделю.
- 300 новых заказов за 3 часа на аккаунт.
Как работает ACME: почему выпуск автоматический
ACME (Automatic Certificate Management Environment, RFC 8555) — протокол общения клиента с центром сертификации: аккаунт, запрос сертификата и доказательство владения доменом одной из проверок:
- HTTP-01 — CA запрашивает файл по
http://домен/.well-known/acme-challenge/<токен>. Нужны публичный IP и открытый порт 80; wildcard так не выпустить. - DNS-01 — клиент публикует TXT-запись
_acme-challenge.домен. Публичный IP не нужен; единственный способ для wildcard. - TLS-ALPN-01 — проверка в TLS-хендшейке на порту 443; используют прокси и балансировщики с закрытым портом 80.

Идея ACME — человек в выпуске не участвует. Если ради продления нужно идти в кабинет и скачивать архив руками, процесс построен неправильно и однажды сломается.
Установка certbot
Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx
# или для Apache:
sudo apt install certbot python3-certbot-apache
CentOS/RHEL/AlmaLinux:
sudo dnf install certbot python3-certbot-nginx
Через snap (универсально):
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Проверка: certbot --version — 2.0+.
Как получить бесплатный SSL-сертификат для nginx
Проще всего — плагин nginx, он сам правит конфиг:
sudo certbot --nginx -d example.com -d www.example.com
Certbot спросит email, согласие с условиями и выдаст сертификат. Файлы — в /etc/letsencrypt/live/example.com/, в конфиг добавятся строки:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
Проверка: sudo nginx -t && sudo systemctl reload nginx — сайт откроется с замком. Для Apache: sudo certbot --apache -d example.com.
Ручной режим через webroot
Если certbot не должен трогать конфиг (свой шаблон, Ansible), возьмите только сертификат:
sudo certbot certonly --webroot -w /var/www/html \
-d example.com -d www.example.com
Nginx должен отдавать /.well-known/acme-challenge/ из /var/www/html:
location /.well-known/acme-challenge/ {
root /var/www/html;
}
Дальше пропишите пути в SSL-конфиге и перезагрузите nginx.
Standalone-режим (без веб-сервера)
Если веб-сервер ещё не настроен:
sudo systemctl stop nginx
sudo certbot certonly --standalone -d example.com
sudo systemctl start nginx
Certbot временно поднимет свой сервер на порту 80 — он должен быть свободен.
Wildcard-сертификат для поддоменов
Wildcard-сертификат *.example.com закрывает все поддомены первого уровня без перевыпуска под каждый новый. Выдаётся только через DNS-01: нужен контроль над DNS-зоной, HTTP-01 здесь не работает.

Пример с Cloudflare:
# Установить плагин
sudo snap install certbot-dns-cloudflare
# Создать файл с API-токеном
sudo tee /etc/letsencrypt/cloudflare.ini <<EOF
dns_cloudflare_api_token = YOUR_TOKEN
EOF
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Выпустить wildcard
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "*.example.com" -d example.com
Такие же плагины есть для Route 53, DigitalOcean, Google Cloud DNS. Без API остаётся --manual --preferred-challenges dns, но тогда и продление ручное. Когда wildcard оправдан — в статье о wildcard-сертификатах.
Альтернативные ACME-клиенты
Certbot — не единственный клиент:
| Клиент | Что это | Когда выбирать |
|---|---|---|
| certbot | Официальный клиент EFF, плагины nginx/Apache и DNS | Классический VPS; максимум документации |
| acme.sh | Shell-клиент без зависимостей, 150+ DNS-провайдеров | Контейнеры, роутеры, хостинг без root |
| Caddy | Веб-сервер со встроенным ACME | Новые проекты: HTTPS «из коробки» |
| Traefik | Reverse-proxy для Docker/Kubernetes с ACME | Docker-стек и микросервисы |
Как продлить SSL-сертификат и почему 90 дней
Сертификат живёт 90 дней: украденный ключ полезен максимум квартал, а короткий срок принуждает к автоматизации. Certbot продлевает сам — таймер systemd или cron запускает certbot renew дважды в сутки; реальное обновление — за 30 дней до истечения.

sudo systemctl status certbot.timer
# либо cron:
cat /etc/cron.d/certbot
Прогон вхолостую (staging, лимиты не тратятся):
sudo certbot renew --dry-run
Deploy-хук, чтобы nginx подхватил новый сертификат:
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Просроченный сертификат — самая частая причина «сайт не работает»: таймер тихо умирает после переезда или заполнения диска, ошибку первыми видят посетители.
Подстрахуйтесь: проверьте домен в SSL-чекере, поставьте напоминание и включите мониторинг срока действия. Срок уже вышел — план в статье про просроченный сертификат.
Типовые ошибки выпуска
- «DNS problem: NXDOMAIN» — домен не резолвится: проверьте A/AAAA и опечатки в
-d. - «Invalid response from http://...» — порт 80 закрыт или неверный webroot:
/.well-known/acme-challenge/должен отдаваться наружу. - «too many certificates already issued» — лимит 50/неделю; тестируйте со
--test-cert. - «...for exact set of domains» — лимит 5 дублей в неделю; переиспользуйте выпущенный (
certbot certificates). - «CAA record prevents issuance» —
dig example.com CAA: запись должна разрешатьletsencrypt.orgили отсутствовать. - DNS ещё не обновился — дождитесь TTL; для DNS-01 есть
--dns-<плагин>-propagation-seconds. - «unable to get local issuer certificate» — неполная цепочка; разбор в статье про ошибку проверки сертификата.
- Android < 7.1.1 не доверяет ISRG Root X1 — старым устройствам нужна cross-signed цепочка.
Работает ли Let's Encrypt в России
Работает: ограничений по географии нет, сертификаты для .ru/.рф и российских IP выпускаются и продлеваются штатно. Для госсистем есть альтернатива — НУЦ Минцифры: корень предустановлен в российских браузерах, в остальные добавляется вручную. Коммерческому сайту практичнее Let's Encrypt: доверие всех браузеров без действий пользователя.
Часто задаваемые вопросы
Подходит ли Let's Encrypt для коммерческих сайтов?
Да: его используют Cloudflare, WordPress.com, Mozilla. Ограничение одно — нет OV/EV с проверкой юрлица.
Почему 90 дней, а не год?
Короткий срок снижает ущерб от кражи ключа и вынуждает автоматизацию продления.
Как выпустить сертификат за NAT или без публичного IP?
Через DNS-01 — входящий HTTP не нужен, сервер может вообще не смотреть в интернет.
Работает ли Let's Encrypt на Windows Server?
Да, для IIS есть win-acme: тот же ACME, автовыпуск и продление.
Как проверить, что сертификат установлен правильно?
Проверьте домен внешним инструментом — см. как проверить SSL-сертификат.
Чеклист: от выпуска до автопродления
- Домен резолвится (A/AAAA), порт 80 открыт.
certbot --versionпоказывает 2.0+.- Сертификат выпущен (
certbot --nginx/certonly --webroot); для поддоменов — wildcard через DNS-01. nginx -tпроходит, https открывается чисто.sudo certbot renew --dry-runбез ошибок.systemctl status certbot.timer— таймер активен.- Deploy-хук перезагружает nginx после продления.
- Мониторинг срока настроен, домен проверен в SSL-чекере.
Заключение
Let's Encrypt + certbot — самый быстрый путь к валидному SSL: 10 минут, бесплатно, автопродление. Прогоните renew --dry-run, проверьте таймер, добавьте контроль срока — и о сертификате можно забыть.
Документация: certbot.eff.org и letsencrypt.org/docs.