Перейти к содержимому

Сертификат Let's Encrypt: certbot

SSL и HTTPS3 мин чтения

Как получить бесплатный сертификат Let's Encrypt для nginx или Apache на своём сервере, проверить продление, добавить домен, выпустить wildcard и разобраться с частыми ошибками.

Содержание

Let's Encrypt выдаёт сертификаты бесплатно, а certbot получает их и продлевает сам. Здесь — для облачного сервера. На хостинге с cPanel сертификаты выпускаются без вашего участия: SSL-сертификаты в cPanel.

Перед началом

  • Домен направлен на сервер: A-запись — IP-адрес сервера. Если у домена есть AAAA-запись, она тоже должна вести на этот сервер, иначе проверка пойдёт по IPv6 на другой адрес и провалится.
  • Сайт открывается по http://, порт 80 открыт в межсетевом экране — Как открыть порт.

Проверить записи: dig +short example.ru A и dig +short example.ru AAAA.

Установка

sudo apt install certbot python3-certbot-nginx      # Ubuntu, Debian
sudo dnf install epel-release                         # AlmaLinux
sudo dnf install certbot python3-certbot-nginx

Для Apache вместо python3-certbot-nginx поставьте python3-certbot-apache.

Получить сертификат

sudo certbot --nginx -d example.ru -d www.example.ru

certbot спросит почту и согласие с условиями, проверит домен, получит сертификат и сам допишет настройки HTTPS в nginx. Для Apache — --apache. Каждое имя, которое должно открываться по HTTPS, перечислите через -d: www — отдельное имя.

Если настройки веб-сервера вы ведёте сами и certbot в них лезть не должен — получите только сертификат:

sudo certbot certonly --webroot -w /var/www/example.ru -d example.ru -d www.example.ru

Файлы появятся в /etc/letsencrypt/live/example.ru/: fullchain.pem — сертификат с цепочкой, privkey.pem — ключ. В nginx:

ssl_certificate     /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;

Продление

Сертификат действует 90 дней, certbot продлевает его сам примерно за месяц до конца. Let's Encrypt постепенно сокращает срок: с 10 февраля 2027 года — 64 дня, с 16 февраля 2028-го — 45. Если продление работает, делать ничего не нужно.

В Ubuntu и Debian продление включено сразу, в AlmaLinux включите его:

sudo systemctl enable --now certbot-renew.timer

Проверьте, что продление сработает, — команда ничего не меняет:

sudo certbot renew --dry-run

Чтобы веб-сервер подхватывал новый сертификат при certonly, добавьте перезагрузку настроек после продления:

printf '#!/bin/sh\nsystemctl reload nginx\n' | sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
Важно Писем об окончании срока Let's Encrypt больше не присылает. Если продление сломается, вы узнаете об этом от посетителей. Раз в пару месяцев проверяйте sudo certbot certificates — там видна дата окончания.

Добавить или убрать домен

sudo certbot certificates                                         # какие сертификаты есть
sudo certbot --nginx --cert-name example.ru -d example.ru -d www.example.ru -d shop.example.ru
sudo certbot delete --cert-name old.example.ru                    # удалить сертификат

С --cert-name certbot заменит список имён в существующем сертификате тем, что перечислен в -d — пишите все нужные имена, не только новое.

Wildcard: *.example.ru

Сертификат на все поддомены сразу Let's Encrypt выдаёт только с проверкой через DNS: нужно добавить TXT-запись _acme-challenge в зону домена.

sudo certbot certonly --manual --preferred-challenges dns -d 'example.ru' -d '*.example.ru'

certbot покажет значение записи и подождёт, пока вы её добавите. Так сертификат сам не продлится — повторять придётся вручную. Для автоматического продления нужен модуль certbot для вашего DNS-провайдера, работающий через его API. Если wildcard не обязателен, проще перечислить поддомены через -d.

Частые ошибки

  • Timeout during connect — Let's Encrypt не достучался до сервера по порту 80: закрыт межсетевым экраном или домен ведёт не туда.
  • unauthorized или Invalid response с кодом 404 — проверка дошла, но не до этого сайта: другой сервер по AAAA-записи, другой server_name в nginx или переадресация, которая уводит проверочный адрес.
  • too many certificates already issued — исчерпан лимит: одинаковый набор имён можно получить не больше 5 раз в неделю. Подождите и не выпускайте сертификат заново на каждую попытку — для экспериментов есть ключ --dry-run.
  • CAA record — у домена есть запись CAA, которая не разрешает Let's Encrypt. Добавьте в неё letsencrypt.org или удалите запись.

Сайт открылся по HTTPS, но браузер ругается на смешанное содержимое — Смешанный контент на HTTPS. Переадресация с http на https — Переадресация на HTTPS.

Не нашли ответ? Напишите в поддержку — подскажем.