Let's Encrypt: бесплатный HTTPS на сервере — как работает и как настроить

В этой статье разберём, что даёт сайту HTTPS, как устроен бесплатный сертификат от Let's Encrypt и протокол ACME, безопасен ли такой сертификат по сравнению с платными, и как поставить его на сервер на практике — через certbot для Nginx и Apache, с автоматическим продлением. Сначала теория (зачем и как это работает), затем полная инструкция по установке.

Зачем нужен HTTPS

HTTP передаёт данные открытым текстом: логины, пароли, содержимое страниц видны любому, кто находится между браузером и сервером (провайдер, публичный Wi-Fi, скомпрометированный роутер). HTTPS — это тот же HTTP, но поверх шифрованного канала TLS (раньше его называли SSL). Он решает три задачи:

  • Шифрование (конфиденциальность) — трафик нельзя прочитать по дороге;
  • Целостность — данные нельзя незаметно подменить (например, вставить рекламу или вредоносный скрипт в страницу);
  • Аутентификация — сертификат подтверждает, что вы общаетесь именно с этим доменом, а не с подставным сервером.

Практические причины, по которым HTTPS сегодня обязателен:

  • браузеры помечают HTTP-страницы как «Не защищено», а формы с паролями — предупреждением;
  • HTTPS — фактор ранжирования в поиске;
  • современные возможности браузера (HTTP/2, Service Workers, геолокация, камера) работают только по HTTPS;
  • многие API и платёжные системы отказываются работать с незащищённым origin.

Как работает TLS-сертификат в двух словах

У сервера есть пара ключей: приватный (хранится только на сервере и никогда никуда не передаётся) и публичный. Сертификат — это публичный ключ плюс имя домена, подписанные удостоверяющим центром (CA, Certificate Authority). Браузер доверяет ограниченному списку корневых CA. Когда вы заходите на сайт:

  1. сервер присылает свой сертификат;
  2. браузер проверяет, что сертификат выдан доверенным CA, не истёк и выписан именно на этот домен;
  3. стороны договариваются о сеансовом ключе и дальше обмениваются зашифрованными данными.

Let's Encrypt — это и есть один из таких удостоверяющих центров. Его корневые сертификаты встроены во все современные браузеры и ОС, поэтому выданные им сертификаты доверяются «из коробки».

Что такое Let's Encrypt и протокол ACME

Let's Encrypt — некоммерческий удостоверяющий центр от Internet Security Research Group (ISRG). Он выдаёт бесплатные сертификаты автоматически, через машинный протокол ACME (Automatic Certificate Management Environment). Ключевые особенности:

  • сертификаты бесплатны и выдаются за секунды;
  • срок действия — 90 дней (намеренно короткий, чтобы стимулировать автоматизацию и снизить ущерб при утечке ключа);
  • выдаётся сертификат уровня DV (Domain Validation) — подтверждается только владение доменом, без проверки организации.

Главное, что нужно понять про ACME: чтобы получить сертификат на домен, нужно доказать, что вы контролируете этот домен. Делается это через «вызов» (challenge). Два основных типа:

  • HTTP-01 — CA просит разместить файл с определённым содержимым по адресу http://домен/.well-known/acme-challenge/<токен>. Если файл доступен — владение подтверждено. Самый частый способ для одиночного сайта на сервере.
  • DNS-01 — CA просит добавить TXT-запись _acme-challenge.домен с заданным значением. Подходит, когда у сервера нет публичного 80-го порта, и обязателен для wildcard-сертификатов (*.example.com).

Весь процесс — генерация ключа, запрос, прохождение challenge, получение и установка сертификата — берёт на себя ACME-клиент. Самый распространённый — Certbot от EFF.

Безопасно ли это

Да. Криптографически бесплатный DV-сертификат Let's Encrypt ничем не отличается от платного DV-сертификата: то же шифрование, тот же замок в адресной строке, то же доверие браузеров. За «бесплатность» вы не платите безопасностью.

Что важно понимать про границы доверия:

  • DV-сертификат подтверждает только владение доменом, а не то, что за сайтом стоит реальная компания. Мошеннический сайт тоже может получить валидный сертификат — «замок» означает «соединение зашифровано», а не «сайту можно доверять».
  • Платные сертификаты уровня OV/EV дополнительно проверяют организацию. Это нужно банкам и крупному бизнесу для юридической ответственности CA, но на уровень шифрования не влияет.
  • Главный риск — утечка приватного ключа с сервера. Поэтому ключи лежат с правами 600 в /etc/letsencrypt/, а короткий срок жизни сертификата ограничивает окно ущерба.
  • У Let's Encrypt есть лимиты: до 50 сертификатов на зарегистрированный домен в неделю и до 5 дубликатов на один набор имён — в норме их не достичь, но при отладке в цикле легко упереться. Для экспериментов используйте --staging (см. ниже).

Что нужно до установки

  • домен (например, example.com), A/AAAA-запись которого указывает на IP вашего сервера — это обязательное условие для HTTP-01;
  • сервер на Linux с доступом по SSH и правами sudo;
  • открытые порты 80 (для проверки и редиректа) и 443 (HTTPS);
  • установленный веб-сервер — Nginx или Apache.

Сначала проверьте, что домен резолвится на ваш сервер:

dig +short example.com        # должен вернуть IP вашего сервера
# или
ping example.com

Установка Certbot

Рекомендуемый способ от EFF — через snap: так клиент всегда свежий и одинаковый на всех дистрибутивах.

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Либо из штатного репозитория (проще, но версия может быть старее):

# Ubuntu / Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx   # плагин под Nginx
# или python3-certbot-apache — под Apache

Получение сертификата для Nginx

Если установлен плагин --nginx, Certbot сам найдёт нужный server-блок, получит сертификат и пропишет пути в конфиг:

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

Клиент спросит e-mail (для уведомлений об истечении и важных новостей) и согласие с условиями, а затем предложит автоматически настроить редирект с HTTP на HTTPS — соглашайтесь. После этого Certbot допишет в конфиг строки вида:

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

Если предпочитаете править конфиг вручную, получите сертификат без изменения конфигурации режимом certonly:

sudo certbot certonly --nginx -d example.com -d www.example.com

Получение сертификата для Apache

sudo certbot --apache -d example.com -d www.example.com

Плагин сам подключит модуль mod_ssl, создаст <VirtualHost *:443> и настроит редирект. Проверить и перезагрузить конфигурацию:

sudo apachectl configtest
sudo systemctl reload apache2

Универсальный способ: webroot

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

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

Здесь -w — это document root, откуда веб-сервер отдаёт статику. Дальше пути к fullchain.pem и privkey.pem вы подключаете в конфиг сами.

Wildcard и DNS-01

Сертификат на *.example.com можно получить только через DNS-01 — придётся добавить TXT-запись. Вручную:

sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" -d example.com

Certbot покажет, какую TXT-запись _acme-challenge.example.com создать. После добавления записи (и её распространения по DNS) подтвердите — сертификат будет выдан. Для автоматизации существуют плагины под конкретных DNS-провайдеров (Cloudflare, Route 53 и др.), например certbot-dns-cloudflare, которым вы даёте API-токен, и продление проходит без ручных действий.

Проверка

Список выданных сертификатов и их срок:

sudo certbot certificates

Откройте сайт по https:// — в адресной строке должен появиться замок. Проверить цепочку и оценку конфигурации удобно онлайн-сервисом SSL Labs, или из терминала:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates -issuer

Автопродление — самое важное

Сертификат живёт 90 дней, поэтому ручное продление — плохая идея. Современный пакет Certbot сам ставит таймер (systemd timer или cron), который дважды в день проверяет сертификаты и продлевает те, что истекают в ближайшие 30 дней. Проверьте, что таймер активен:

systemctl list-timers | grep certbot
# и «сухой прогон» продления — ничего не меняет, только проверяет:
sudo certbot renew --dry-run

Если --dry-run прошёл без ошибок — продление работает, делать больше ничего не нужно. После успешного продления Certbot перезагружает веб-сервер через deploy-hook; при ручной настройке его можно задать явно:

sudo certbot renew --deploy-hook "systemctl reload nginx"

Тестовый режим (staging)

Пока отлаживаете настройку, гоняйте запросы по тестовому серверу Let's Encrypt — он не имеет жёстких лимитов, но выдаёт недоверенные сертификаты (в браузере будет предупреждение — это нормально для теста):

sudo certbot --nginx -d example.com --staging

Когда всё получается — повторите команду без --staging, чтобы получить «боевой» сертификат. Старый тестовый удалите: sudo certbot delete --cert-name example.com.

Типичные проблемы

  • Challenge failed / Timeout during connect — CA не достучался до 80-го порта. Проверьте, что домен указывает на сервер, порт 80 открыт в фаерволе (sudo ufw allow 80,443/tcp) и не занят другим процессом.
  • Too many certificates already issued — упёрлись в недельный лимит. Используйте --staging для отладки и дождитесь сброса лимита.
  • Сайт «смешанный» (mixed content) — страница по HTTPS подгружает ресурсы по http://. Браузер их блокирует. Замените ссылки на https:// или относительные пути.
  • NXDOMAIN / неверный IP — DNS ещё не обновился. Подождите распространения записей и перепроверьте через dig.

Итог

HTTPS сегодня — не опция, а базовое требование: он шифрует трафик, защищает от подмены и нужен браузерам, поиску и современным API. Let's Encrypt даёт криптографически полноценный сертификат бесплатно и автоматически через протокол ACME, а Certbot сводит всю установку к одной команде и сам настраивает продление. Практический минимум: направьте домен на сервер, откройте порты 80 и 443, выполните certbot --nginx (или --apache), проверьте certbot renew --dry-run — и дальше сертификат обновляется без вашего участия.