Руководство по Certbot и Let's Encrypt — настройка HTTPS

Let’s Encrypt — это автоматический и открытый центр сертификации (CA), управляемый Internet Security Research Group (ISRG) и изначально основанный при участии Electronic Frontier Foundation (EFF), Mozilla Foundation и других. Он выдаёт бесплатные SSL/TLS сертификаты, которые чаще всего используются для защиты соединений через HTTPS. Let’s Encrypt применяет протокол ACME (Automatic Certificate Management Environment) для выпуска, отзыва и обновления сертификатов. Certbot — свободная утилита с открытым исходным кодом, широко используемая для работы с сертификатами Let’s Encrypt. Certbot доступен для большинства UNIX-подобных систем, включая GNU/Linux, FreeBSD, OpenBSD и macOS. Это руководство даёт нейтральное по платформе введение в использование certbot.
Важно: Certbot развивается; поведение в старых или будущих версиях может отличаться.
Кому это руководство
- Сисадминам, которые должны включить HTTPS для сайтов.
- Разработчикам веб-приложений и DevOps-инженерам.
- Владеющим доменом пользователям, желающим автоматизировать SSL.
Требования
- Зарегистрированное доменное имя с A-записью, указывающей на IPv4-адрес сервера. В примерах используется www.example.com.
- Доступ к привилегированной оболочке (root или sudo).
Основные понятия
Режимы работы
Использование certbot для включения HTTPS разделяется на два шага: аутентификация и установка. Первый шаг — решить challenge и сохранить сертификат и связанные файлы. Шаг установки — настроить и закрепить конфигурацию веб-сервера. Certbot может автоматически выполнить оба шага через команду run. Подкоманды certonly и install соответствуют аутентификации и установке.
Certbot также поддерживает обновление и отзыв сертификатов.
Challenge
Чтобы получить сертификат, ACME-сервер Let’s Encrypt выдаёт challenge для проверки владения доменом. Наиболее распространённый — HTTP-01. Он требует ответа по HTTP на порт 80. DNS-01 — альтернативный challenge, использующий TXT-запись в DNS и необходимый для wildcard-сертификатов. Обратите внимание: wildcard-сертификаты нельзя получить через HTTP-01.
Кратко о типах challenge:
- HTTP-01: проверка через HTTP на порт 80. Прост в настройке при наличии веб-сервера.
- DNS-01: проверка через DNS TXT. Необходим для *.example.com.
- TLS-ALPN-01: проверка через TLS альпн (менее распространён, для специальных сценариев).
Плагины
Certbot использует плагины для аутентификации и установки сертификатов. Плагины webroot и standalone выполняют только аутентификацию. Плагины apache и nginx умеют автоматически получить и установить сертификат, правя конфиги веб-сервера. Для DNS-01 есть набор vendor-специфичных DNS-плагинов, которые дают автоматизацию при наличии API у DNS-провайдера. Webroot и standalone встроены; многие другие плагины устанавливаются отдельно.
Установка Certbot
Большинство дистрибутивов Linux поставляют certbot в официальных репозиториях. Ниже — инструкции для популярных платформ.
Debian и Ubuntu:
apt update
apt install -y certbotCentOS 7:
yum install -y certbotFedora и CentOS 8:
dnf install -y certbotArch Linux:
pacman -Sy certbotFreeBSD:
pkg install py36-certbotOpenBSD 6.0 и новее:
pkg_add certbotmacOS (Homebrew):
brew install letsencryptЕсли пакета нет для платформы, можно использовать официальный скрипт-обёртку certbot-auto (проверьте актуальность и поддерживаемость перед применением).
Использование Certbot
Просмотр сертификатов
Команда показывает сертификаты, которыми управляет certbot на сервере:
certbot certificatesВы увидите пути к файлам, дату окончания срока действия и имя сертификата.
Получение сертификата для ручной конфигурации
Есть два основных варианта для получения сертификата, если вы хотите настроить веб-сервер вручную:
- Webroot: certbot размещает challenge-файлы в корне сайта.
- Standalone: certbot запускает временный HTTP-сервер, слушающий порт 80.
Будьте последовательны: для удобства обновлений используйте тот же плагин, что и при выпуске.
Использование существующего веб-сервера (webroot)
Перед запуском убедитесь, что веб-сервер работает и слушает порт 80.
certbot certonly --webrootВас попросят указать домены и путь к webroot (по умолчанию /var/www/html/ на многих системах). Можно передать параметры в командной строке:
certbot certonly --webroot --webroot-path /var/www/html --agree-tos -m [email protected] -d www.example.comИспользование standalone
Для standalone убедитесь, что порт 80 свободен. Проверить можно так:
ss -lntp 'sport = 80'Если процесс занимает порт, остановите его. Затем запустите:
certbot certonly --standaloneПосле выдачи сертификата настройте веб-сервер вручную. Файлы будут в /etc/letsencrypt/live/your_domain.
Автоматическая установка HTTPS (интерактивно)
Certbot умеет автоматизировать полную установку HTTPS с помощью плагинов для Apache и Nginx. Установите соответствующий плагин и выполните certbot run –PLUGIN_NAME. Пример для Apache на Debian 10:
apt install -y python-certbot-apache
certbot run --apacheCertbot попытается распарсить конфигурацию веб-сервера, предложит выбрать домены и спросит про перенаправление HTTP на HTTPS. Рекомендуется включать перенаправление для новых сайтов.
Пример интерактивного выбора домена:
Which names would you like to activate HTTPS for?
1: www.example.com
Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 1Пример вопроса о редиректе:
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access.
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2После успешного завершения certbot сообщает о включении HTTPS.
Продление сертификатов
Сертификаты Let’s Encrypt действуют 90 дней. Certbot обновляет их автоматически, но важно понять нюансы.
Ручное продление
Команда renew проверит все сертификаты и обновит те, у которых срок действия менее 30 дней:
certbot renewЕсли при выдаче использовался standalone, для продления нужно освободить порт 80. Это удобно решить хуками:
certbot renew --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service"Автоматическое продление
Многие дистрибутивы включают автоматическое продление через systemd-timers или cron. Проверьте запущенные таймеры:
systemctl list-timersИ наличие cron-заданий:
ls /etc/cron*Если использовался webroot, автоматическое продление обычно проходит без дополнительных действий. Для standalone нужно либо настроить хуки, либо использовать иной плагин для автоматизации.
Важно: проверьте логи обновления и почту root — certbot отправляет уведомления при ошибках.
Отзыв сертификатов
Команда для отзыва сертификата по имени или по пути:
certbot revoke --cert-name cert_name
certbot revoke --cert-path /path/to/cert.pemНапример:
certbot revoke --cert-name www.example.netПосле отзыва certbot спросит, удалять ли файлы сертификата. Если не удалять, сертификат можно будет случайно обновить на следующем цикле.
Опции revoke:
- –delete-after-revoke
- –no-delete-after-revoke
- –reason [unspecified,keycompromise,affiliationchanged,superseded,cessationofoperation]
Wildcard-сертификаты
Wildcard-сертификаты (*) покрывают все поддомены на одном уровне. Для получения wildcard требуется DNS-01 challenge и доступ к управлению DNS.
Пример запроса wildcard вручную:
certbot certonly --manual --preferred-challenges dns-01 -d *.example.netCertbot покажет значение для TXT-записи _acme-challenge.example.net. Создайте TXT-запись в DNS и дождитесь распространения, затем нажмите Enter. После успешной проверки файлы будут сохранены в /etc/letsencrypt/live/example.com/.
Для автопроцесса используйте DNS-плагины провайдера (если у провайдера есть API): они автоматизируют создание TXT-записей.
Важно: некоторые провайдеры DNS имеют долгий TTL и замедляют проверку. Планируйте ожидание при первом выпуске.
Практические сценарии и примеры
Пример конфигурации Nginx (ручная установка)
Типичная минимальная конфигурация для использования сертификатов из /etc/letsencrypt/live/example.com:
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html index.php;
}После обновления сертификата перезапуск Nginx не обязателен, если используется symlink в /etc/letsencrypt/live. Но некоторые приложения требуют перезагрузки — проверьте поведение.
Пример конфигурации Apache (ручная установка)
Пример vhost для Apache:
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html
RewriteEngine on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
ServerName www.example.com
ServerAlias example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
DocumentRoot /var/www/html
Если вы используете Apache-плагин certbot, он создаст аналогичный ssl-vhost автоматически.
Безопасность и жесткая конфигурация
- Храните приватные ключи в системе с ограниченным доступом (root только).
- Используйте минимально необходимые права на каталоги /etc/letsencrypt и их содержимое.
- Включите HTTP Strict Transport Security (HSTS) осторожно: сначала убедитесь, что HTTPS работает на всех хостах.
- Отключите устаревшие протоколы (SSLv3, TLS 1.0, TLS 1.1).
- Настройте современный набор шифров; отдавайте предпочтение TLS 1.3 там, где доступно.
- Регулярно проверяйте конфигурацию через SSL Labs или аналогичные инструменты.
Пример заголовков безопасности для Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header Referrer-Policy no-referrer-when-downgrade;Важно: HSTS с includeSubDomains и preload необратимы для доменов в публичных списках — применяйте с осторожностью.
Отладка и распространённые ошибки
- Проверка порта 80: если standalone не может привязать порт, проверьте, запущен ли уже веб-сервер.
- Ошибка валидации HTTP-01: убедитесь, что challenge-файл доступен по http://your-domain/.well-known/acme-challenge/
- DNS-01 ошибки: проверьте, что TXT-запись создана под правильным именем (_acme-challenge) и что запись уже пропагировала.
- Проблемы с правами: certbot должен иметь доступ на запись в webroot и чтение/запись в /etc/letsencrypt.
- Синтаксические ошибки в веб-сервере мешают автоматическому конфигурированию плагинами.
Диагностика:
- Просмотрите логи certbot: обычно /var/log/letsencrypt/letsencrypt.log
- Используйте curl для проверки доступности challenge-файла:
curl -v http://www.example.com/.well-known/acme-challenge/- Проверяйте DNS через dig или host:
dig TXT _acme-challenge.example.com +shortКогда Certbot не подходит
- Если у вас нет доступа к серверу или к DNS-привилегиям, certbot не поможет.
- Для нестандартных HTTP-портов HTTP-01 не работает — нужен DNS-01 или иной CA.
- В средах со строгой политикой безопасности без возможности открытия порта 80 потребуется координация с сетевой командой.
Альтернативные подходы
- Использовать commercial CA с длительным сроком действия.
- Автоматизировать через ACME-клиенты других проектов (acme.sh, lego) — они могут поддерживать дополнительные провайдеры DNS или языки.
- Использовать CDN с автоматическим TLS (Cloudflare, Fastly) и настроить origin TLS.
Чек-листы по ролям
Сисадмин — быстрый чек-лист:
- Убедиться, что домен указывает на сервер.
- Проверить доступность порта 80.
- Установить certbot и нужные плагины.
- Выпустить тестовый сертификат (staging перед production).
- Настроить автоматическое продление и хуки.
- Настроить мониторинг/оповещения на ошибки обновления.
DevOps — задачи в CI/CD:
- Автоматизировать deployment certbot для тестовой среды.
- Хранить секреты API провайдера DNS в vault.
- Проверять конфигурацию веб-сервера перед выпуском сертификата.
Разработчик приложения:
- Проверить, что ссылки на ресурсы (mixed content) используют HTTPS.
- Убедиться в корректной работе HSTS и редиректов.
Модель принятия решения (мермейд-диаграмма)
flowchart TD
A[Нужно включить HTTPS?] --> B{Есть доступ к DNS API?}
B -- Да --> C[Использовать DNS-01 с автоматизацией]
B -- Нет --> D{Можно ли открыть порт 80?}
D -- Да --> E[Использовать HTTP-01 'webroot или standalone']
D -- Нет --> F[Нужна координация с провайдером/инфраструктурой]
C --> G[Настроить автоматическое обновление]
E --> G
F --> H[Рассмотреть CDN или коммерческий CA]Критерии приёмки
- Сайт доступен по HTTPS без предупреждений в браузере.
- Сертификат выдан для нужного домена и включает нужные SAN.
- Перенаправление с HTTP на HTTPS работает корректно.
- Автоматическое продление настроено и протестировано (dry-run).
Мини-методология для внедрения HTTPS (шаги)
- Проверить, что домен указывает на сервер и доступен по HTTP.
- Установить certbot и выбрать плагин (webroot, standalone или DNS).
- Выпустить тестовый сертификат в staging среде.
- Выпустить production-сертификат и проверить работу сайта.
- Настроить автоматическое продление и оповещения.
- Внедрить заголовки безопасности и провести внешнюю проверку.
Совместимость и советы по миграции
- При переходе с самоподписанных сертификатов удалите старые конфигурации, чтобы избежать конфликта путей.
- Если у вас несколько серверов, используйте один источник истины для ключей или автоматизируйте распространение через Ansible/Chef.
- Для контейнеризированных приложений рассматривайте sidecar или ingress-контроллер (например, cert-manager в Kubernetes).
Глоссарий (1 строка)
- ACME: протокол для автоматизированного управления сертификатами.
- Webroot: метод HTTP-01, где challenge-файлы кладут в корень сайта.
- Standalone: плагин certbot, который запускает временный HTTP-сервер.
- DNS-01: challenge, основанный на проверке TXT-записи.
Ресурсы
- Official Certbot Github repository
- Automatic Certificate Management Environment (ACME) RFC 8555
- EFF Certbot Documentation
- Certbot(1) Man Page
Важно: тестируйте сначала в staging-среде Let’s Encrypt, чтобы избежать лимитов и ошибок при разработке.
Краткое резюме
Certbot — надёжный инструмент для автоматизации получения и обновления сертификатов Let’s Encrypt. Выберите подходящий плагин в зависимости от доступа к серверу и DNS, настройте автоматическое продление и следуйте рекомендациям по безопасности. Если требуются wildcard-сертификаты, используйте DNS-01 и автоматизацию через DNS-плагины.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента