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. Когда вы заходите на сайт:
- сервер присылает свой сертификат;
- браузер проверяет, что сертификат выдан доверенным CA, не истёк и выписан именно на этот домен;
- стороны договариваются о сеансовом ключе и дальше обмениваются зашифрованными данными.
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 — и
дальше сертификат обновляется без вашего участия.