Бесплатный SSL через Let's Encrypt: установка certbot за 10 минут
Бесплатный SSL через Let's Encrypt: установка certbot за 10 минут
Let's Encrypt — некоммерческий центр сертификации, выдающий бесплатные проверку SSL с автоматическим обновлением. С 2016 года они стали де-факто стандартом для малого и среднего бизнеса: настройка занимает 10 минут, обновление происходит само, а сертификат доверяют все современные браузеры. В статье — полный гайд по установке certbot на Ubuntu/Debian и CentOS, с примерами для nginx и Apache.
Что такое Let's Encrypt и ACME-протокол
Let's Encrypt использует протокол ACME (Automatic Certificate Management Environment) — стандартизированный API документацию для выдачи сертификатов. Клиент на вашем сервере доказывает, что владеет доменом (через HTTP-01, DNS-01 или TLS-ALPN-01 challenge), и получает сертификат на 90 дней. Certbot — официальный ACME-клиент, но есть и альтернативы: acme.sh, lego, caddy (встроенный).
Лимиты Let's Encrypt:
- 50 сертификатов в неделю на один зарегистрированный домен.
- 100 SAN в одном сертификате.
- 5 дублированных сертификатов в неделю.
- 300 новых заказов в 3 часа на аккаунт.
Установка 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+.
Выпуск сертификата для nginx (автоматический режим)
Самый простой способ — плагин nginx, который сам модифицирует конфиг:
sudo certbot --nginx -d example.com -d www.example.com
Certbot попросит email (для уведомлений о продлении), согласие с ToS и выдаст сертификат. Файлы будут в /etc/letsencrypt/live/example.com/. В ваш nginx-конфиг добавятся строки:
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. Откройте https://example.com — должен быть зелёный замок.
Ручной режим через webroot
Если вы не хотите, чтобы certbot трогал nginx-конфиг (например, используете свой шаблон или 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. Нужно, чтобы порт был свободен — останавливайте nginx/apache.
DNS-01 для wildcard
Wildcard-сертификаты выдаются только через DNS-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. Подробнее о разнице — wildcard vs SAN.
Автоматическое обновление
Certbot создаёт systemd-таймер, который запускает certbot renew два раза в сутки. Проверить:
sudo systemctl status certbot.timer
# либо cron-задачу:
cat /etc/cron.d/certbot
Ручная симуляция обновления (без изменений):
sudo certbot renew --dry-run
Реальное обновление сертификат не трогает, если до истечения больше 30 дней. Добавьте хук для перезагрузки nginx:
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Типичные ошибки и решения
- «DNS problem: NXDOMAIN» — домен не резолвится. Проверьте A/AAAA-записи.
- «Failed authorization: Invalid response from http://...» — блокируется порт 80 или неправильно настроен webroot.
- «too many certificates already issued» — превышен лимит 50/неделю. Используйте staging-окружение для тестов:
--test-cert. - «unable to get local issuer certificate» — неполная цепочка, см. incomplete chain.
- Android < 7.1.1 не доверяет ISRG Root X1 — используйте
--preferred-chain "ISRG Root X1"только если все клиенты современные; для старых нужна cross-signed цепочка.
Мониторинг и алерты
Certbot автоматизирует обновление, но крон может сломаться (диск, DNS). Подключите внешний мониторинг сайтов: Enterno.io Monitors проверяет срок действия каждые 5 минут и шлёт алерт за 14/7/3 дня до истечения в Telegram, Email или Slack. Это гарантия, что забытое обновление не приведёт к NET::ERR_CERT_DATE_INVALID.
Часто задаваемые вопросы
Let's Encrypt подходит для коммерческих сайтов?
Да. Let's Encrypt используют Cloudflare, WordPress.com, Mozilla, Netflix и миллионы сайтов. Единственное ограничение — нет EV-сертификатов с зелёной плашкой названия компании.
Почему 90 дней, а не год?
Короткий срок уменьшает риск компрометации: украденный ключ будет полезен максимум 3 месяца. Плюс это заставляет автоматизировать процесс.
Как выпустить сертификат за NAT или без публичного IP?
Используйте DNS-01 challenge — он не требует доступа по HTTP. Сервер вообще не обязан быть публичным.
Можно ли использовать Let's Encrypt на Windows Server?
Да, есть альтернативный клиент win-acme — полноценный ACME-клиент для IIS.
Заключение
Let's Encrypt + certbot — самый быстрый способ получить валидный SSL: 10 минут, бесплатно, с автообновлением. После установки проверьте конфигурацию через SSL Checker enterno.io и настройте Monitors на slack/telegram алерты о сроке действия. Следующий шаг — включить HSTS и ужесточить cipher suites.
ACME протокол — RFC 8555. Документация certbot — certbot.eff.org. Let's Encrypt docs — letsencrypt.org/docs.
Проверьте ваш сайт прямо сейчас
Проверить →