Let’s Encrypt выдаёт бесплатные SSL/TLS-сертификаты, которые шифруют трафик между вашим Apache-сервером и посетителями. Без сертификата браузеры показывают предупреждение «Не защищено», а поисковые системы понижают рейтинг сайта. Certbot — это официальный клиент Let’s Encrypt, который автоматически получает сертификат, настраивает Apache и обновляет его. Главные сложности для новичка: перед запуском Certbot нужно убедиться, что домен смотрит на сервер, открыты порты 80 и 443, и у Apache уже есть виртуальный хост для этого домена. Также после установки важно настроить дополнительные заголовки безопасности и включить HTTP/2.
💡 В этом руководстве вы настроите HTTPS для вашего сайта на Apache с помощью Let’s Encrypt. Мы установим Certbot, получим сертификат с автоматической настройкой редиректа, HSTS и OCSP Stapling, проверим автоматическое обновление и усилим конфигурацию SSL (TLS 1.3, HTTP/2, дополнительные заголовки).
В этой статье вы узнаете:
- Какие требования должны быть выполнены до запуска Certbot (домен, DNS, порты)
- Как установить Certbot и плагин для Apache
- Как получить сертификат одной командой с настройкой HTTPS-редиректа и ECDSA-ключом
- Как получить Wildcard-сертификат для всех поддоменов через DNS-валидацию
- Как проверить, что сертификат установлен и работает
- Как работает автоматическое обновление сертификатов через systemd-таймер
- Как усилить конфигурацию Apache: HTTP/2, HSTS, дополнительные заголовки безопасности
- Как решить типичные проблемы: валидация домена, ошибки модуля, mixed content
Для кого: владельцы сайтов на Apache, администраторы серверов, а также все, кто хочет настроить бесплатный HTTPS на Debian 11, 12 или 13.
1. 🔧 Предварительные требования
Перед настройкой убедитесь, что выполнены следующие условия. Если что-то пропустить — Certbot выдаст ошибку.
- Установленный и работающий Apache. Если Apache ещё не установлен, у нас есть руководство по установке Apache на Debian.
- Зарегистрированное доменное имя, которое указывает на ваш сервер. Должна быть настроена A-запись (или AAAA для IPv6), указывающая на публичный IP-адрес вашего сервера.
- Открытые порты 80 (HTTP) и 443 (HTTPS) в фаерволе. Let’s Encrypt использует HTTP-01 валидацию через порт 80. Если порты закрыты — сертификат не выдастся.
- Настроенный виртуальный хост в Apache для вашего домена (файл в
/etc/apache2/sites-available/с включённым симлинком вsites-enabled). Certbot будет опираться на него. - Права sudo для выполнения команд.
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
Что делает: sudo выполняет команду от имени суперпользователя, whoami показывает имя текущего пользователя.
Зачем: Эта команда проверяет, есть ли у вас права sudo. Без них вы не сможете устанавливать пакеты.
✅ Если выводит root — всё в порядке, можете продолжать.
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
1.1 Обновление системы
Перед установкой всегда обновляйте список пакетов:
sudo apt update && sudo apt upgrade -y
Что делает:
sudo— права суперпользователяapt update— обновляет список доступных пакетов&&— выполняет следующую команду только если предыдущая успешнаapt upgrade -y— обновляет все установленные пакеты
Зачем: Certbot и его зависимости должны устанавливаться в актуальную систему.
1.2 Открытие портов в UFW (если используется)
Если вы используете UFW, откройте порты 80 и 443 до запуска Certbot.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Если вы подключаетесь к серверу по SSH, убедитесь, что SSH также разрешён, иначе потеряете доступ.
sudo ufw allow ssh
Проверка, что UFW активен и порты открыты:
sudo ufw status
2. 📦 Установка Certbot и плагина для Apache
Certbot — это официальный клиент Let’s Encrypt. Плагин python3-certbot-apache позволяет Certbot автоматически изменять конфигурацию Apache (добавлять SSL-директивы, настраивать редирект).
sudo apt install certbot python3-certbot-apache -y
Что делает: Устанавливает Certbot и его Apache-плагин из официальных репозиториев Debian.
Какие версии Certbot в разных Debian:
| Версия Debian | Версия Certbot |
|---|---|
| Debian 13 (Trixie) | 4.x |
| Debian 12 (Bookworm) | 2.x |
| Debian 11 (Bullseye) | 1.x |
Проверка установки:
certbot --version
3. 🔐 Получение сертификата и настройка HTTPS
Самый простой способ — запустить Certbot с флагами, которые сразу настроят HTTPS-редирект, HSTS и OCSP Stapling. Используйте флаг --key-type ecdsa для получения более быстрого и компактного ECDSA-ключа (одинаково работает на всех версиях Debian).
Замените в команде:
admin@example.comна ваш реальный email (туда будут приходить уведомления о продлении сертификата)yourdomain.comна ваш реальный домен
sudo certbot --apache --agree-tos --redirect --key-type ecdsa --hsts --staple-ocsp --email admin@example.com -d yourdomain.com
Что делает каждый флаг:
| Флаг | Что делает |
|---|---|
--apache | Использует Apache-плагин для автоматического изменения конфигурации |
--agree-tos | Соглашается с условиями использования Let’s Encrypt |
--redirect | Настраивает постоянный 301 редирект с HTTP на HTTPS |
--key-type ecdsa | Запрашивает ECDSA-ключ (быстрее и компактнее RSA) |
--hsts | Добавляет заголовок Strict-Transport-Security |
--staple-ocsp | Включает OCSP Stapling (ускоряет проверку статуса сертификата) |
--email | Email для уведомлений о продлении и проблемах |
-d | Домен (или несколько доменов) для сертификата |
Если вам нужен сертификат сразу для нескольких доменов (например, example.com и www.example.com):
sudo certbot --apache --agree-tos --redirect --key-type ecdsa --hsts --staple-ocsp --email admin@example.com -d example.com -d www.example.com
✅ Ожидаемый вывод в терминале (сокращённо):
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/yourdomain.com/privkey.pem
This certificate expires on 2026-03-02.
These files will be updated when the certificate renews.
3.1 Интерактивный режим (если не хотите указывать все флаги)
Можно запустить Certbot без флагов, и он задаст вопросы:
sudo certbot --apache
Вас спросят:
- Email (обязательно)
- Согласие с условиями (введите
A) - Нужно ли делиться email с EFF (обычно
N) - Для каких доменов из конфигурации Apache выдать сертификат (введите номер или номера через запятую)
- Нужен ли редирект HTTP → HTTPS (выберите
2— редирект, это безопасно)
3.2 Wildcard-сертификаты (для всех поддоменов)
Если вам нужен сертификат для всех поддоменов (например, *.yourdomain.com), вы не можете использовать HTTP-валидацию. Нужно использовать DNS-валидацию.
sudo certbot certonly --manual --preferred-challenges=dns --key-type ecdsa --email admin@example.com --agree-tos -d yourdomain.com -d '*.yourdomain.com'
Certbot покажет вам TXT-запись, которую нужно добавить в DNS вашего домена. Например:
Please deploy a DNS TXT record under the name:
_acme-challenge.yourdomain.com
with the following value:
aBcDeFgHiJkLmNoPqRsTuVwXyZ123456789
Что делать:
- Добавьте эту TXT-запись в DNS-панели вашего регистратора домена
- Дождитесь распространения (обычно 1-5 минут, можно проверить командой
dig TXT _acme-challenge.yourdomain.com) - Нажмите
Enterв терминале
После успешной валидации Certbot сохранит сертификат, но не настроит Apache автоматически. Вам нужно будет вручную добавить в конфигурацию виртуального хоста пути к сертификату:
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
⚠️ Важно: Wildcard-сертификаты не обновляются автоматически. Вам придётся повторять эту процедуру каждые 90 дней вручную, либо настроить DNS-плагин для Certbot (например, python3-certbot-dns-cloudflare для Cloudflare, python3-certbot-dns-route53 для AWS Route53). Поищите плагин для вашего DNS-провайдера:
apt search python3-certbot-dns
4. ✅ Проверка установленного сертификата
Через Certbot
sudo certbot certificates
✅ Ожидаемый вывод в терминале:
Found the following certs:
Certificate Name: yourdomain.com
Domains: yourdomain.com
Expiry Date: 2026-03-02 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/yourdomain.com/privkey.pem
Key Type: ECDSA
Через браузер
Откройте ваш сайт по HTTPS (например, https://yourdomain.com). В адресной строке должен появиться замочек (значок безопасности). Нажмите на него — увидите информацию о сертификате.
Через OpenSSL (проверка цепочки сертификатов)
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
В выводе найдите строку Verify return code: 0 (ok) — она означает, что цепочка сертификатов корректна и ваш сервер доверенный.
5. 🔄 Автоматическое обновление сертификатов
Сертификаты Let’s Encrypt действуют 90 дней. Certbot настраивает автоматическое обновление через systemd-таймер.
5.1 Проверка, что таймер активен
systemctl is-enabled certbot.timer
systemctl is-active certbot.timer
✅ Ожидаемый вывод: enabled и active.
Более подробный статус:
sudo systemctl status certbot.timer
✅ Ожидаемый вывод в терминале (сокращённо):
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled)
Active: active (waiting)
Что важно: Таймер запускается дважды в сутки (в районе полуночи и полудня, с рандомной задержкой). Certbot проверяет, не истекает ли сертификат в ближайшие 30 дней. Если истекает — обновляет.
5.2 Ручная проверка обновления (тестовый прогон)
sudo certbot renew --dry-run
✅ Ожидаемый вывод в конце:
Congratulations, all simulated renewals succeeded
Если вы видите эту строку — автоматическое обновление будет работать.
6. 🚀 Усиление конфигурации Apache (опционально)
Certbot уже настраивает базовую безопасность. Но для максимальной оценки A+ на SSL Labs нужно добавить HTTP/2, дополнительные заголовки безопасности и современные шифры.
6.1 Включение необходимых модулей Apache
sudo a2enmod ssl socache_shmcb rewrite headers http2
sudo systemctl reload apache2
Что делает: Включает модули: SSL, кэш для OCSP, перезапись URL, заголовки, HTTP/2.
6.2 Редактирование SSL-конфигурации Apache
Certbot создаёт отдельный файл конфигурации для HTTPS, обычно с суффиксом -le-ssl.conf. Например:
sudo nano /etc/apache2/sites-available/yourdomain.com-le-ssl.conf
6.3 Добавление заголовков безопасности
Внутри секции <VirtualHost *:443> добавьте следующие строки:
# HTTP/2
Protocols h2 http/1.1
# HSTS (Strict-Transport-Security)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
# Дополнительные заголовки безопасности
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Что делает каждый заголовок:
| Заголовок | Значение | Зачем |
|---|---|---|
Strict-Transport-Security | max-age=63072000; includeSubDomains; preload | Браузеры запоминают это правило на 2 года и в течение этого времени подключаются к сайту только по HTTPS |
X-Content-Type-Options | nosniff | Запрещает браузеру угадывать MIME-тип |
X-Frame-Options | SAMEORIGIN | Защита от clickjacking (встраивание в iframe) |
Referrer-Policy | strict-origin-when-cross-origin | Контролирует передачу Referer |
6.4 Современные протоколы и шифры (опционально)
Добавьте в ту же секцию <VirtualHost *:443>:
# Протоколы: только TLS 1.2 и 1.3
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Современные шифры (Mozilla Intermediate)
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
SSLSessionTickets off
# OCSP Stapling (у Certbot уже включено, но добавим кэш)
SSLUseStapling On
SSLStaplingCache "shmcb:/var/run/apache2/ssl_stapling(32768)"
💡 Примечание про SSLStaplingCache: Директива SSLStaplingCache должна быть в глобальной конфигурации (вне <VirtualHost>). Если её нет, добавьте в /etc/apache2/mods-enabled/ssl.conf или в начало файла виртуального хоста (перед <VirtualHost>).
6.5 Редирект HTTP → HTTPS (в файле конфигурации для порта 80)
Убедитесь, что в файле /etc/apache2/sites-available/yourdomain.com.conf (для порта 80) есть редирект:
<VirtualHost *:80>
ServerName yourdomain.com
Redirect permanent / https://yourdomain.com/
</VirtualHost>
Или, если нужно исключить .well-known для Certbot:
<VirtualHost *:80>
ServerName yourdomain.com
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
6.6 Проверка и перезагрузка Apache
sudo apachectl configtest
✅ Ожидаемый вывод: Syntax OK
sudo systemctl reload apache2
7. ⚠️ Решение типичных проблем
7.1 Ошибка: Challenge failed для домена (невалидация)
Симптом: Certbot выдаёт ошибку валидации домена.
Причина: Let’s Encrypt не может получить доступ к временному файлу через HTTP. Чаще всего проблема в DNS или фаерволе.
Пошаговое решение:
Шаг 1: Проверьте, что DNS A-запись вашего домена указывает на ваш сервер:
getent hosts yourdomain.com
✅ Ожидаемый вывод: IP-адрес вашего сервера.
Шаг 2: Проверьте, что Apache слушает порт 80:
sudo ss -tlnp | grep ':80'
Шаг 3: Проверьте UFW:
sudo ufw status | grep -E '80|Apache'
Если порты закрыты — откройте:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
7.2 Ошибка: Apache не запускается после настройки SSL
Симптом: sudo systemctl reload apache2 не работает, apachectl configtest показывает ошибку, например:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included
Причина: Не включён модуль ssl.
Решение:
sudo a2enmod ssl
sudo systemctl reload apache2
7.3 Смешанный контент (Mixed Content) после перехода на HTTPS
Симптом: Страница открывается по HTTPS, но браузер показывает предупреждение, что некоторые ресурсы (изображения, скрипты) загружаются по HTTP.
Причина: В коде страницы ссылки на ресурсы прописаны как http://, а не как https:// или относительные.
Решение: Обновите все внутренние ссылки на HTTPS или относительные (/image.jpg). Для WordPress можно использовать плагин «Really Simple SSL».
7.4 Ошибка: Rate Limit (слишком много сертификатов)
Симптом: Certbot выдаёт:
Error creating new order :: too many certificates already issued for exact set of domains
Причина: Let’s Encrypt ограничивает количество сертификатов для одного домена (обычно 50 в неделю).
Пошаговое решение:
Шаг 1: Используйте тестовое окружение (staging) для экспериментов:
sudo certbot --apache --staging -d yourdomain.com
Шаг 2: Если нужно срочно — подождите неделю, лимит сбросится.
7.5 Ошибка: Wildcard-сертификат не обновляется автоматически
Симптом: Certbot не обновляет Wildcard-сертификат.
Причина: Wildcard-сертификаты требуют DNS-валидации, которая не может быть автоматической без специального плагина.
Решение: Установите DNS-плагин для вашего провайдера (например, python3-certbot-dns-cloudflare для Cloudflare) или обновляйте сертификат вручную каждые 90 дней.
8. ❌ Удаление Certbot и сертификатов
Если вы хотите полностью удалить Certbot и Let’s Encrypt сертификаты.
8.1 Удаление сертификата (без отзыва)
sudo certbot delete --cert-name yourdomain.com
8.2 Удаление пакетов Certbot
sudo systemctl disable --now certbot.timer
sudo apt remove --purge certbot python3-certbot-apache -y
sudo apt autoremove -y
8.3 Удаление конфигурационных файлов Let’s Encrypt
⚠️ Осторожно: Удаляет все сертификаты и настройки Certbot.
sudo rm -rf /etc/letsencrypt /var/lib/letsencrypt /var/log/letsencrypt
8.4 Возврат конфигурации Apache
Вам нужно вручную отредактировать файлы виртуальных хостов в /etc/apache2/sites-available/:
- Удалить строки с
SSLCertificateFile,SSLCertificateKeyFile,Redirect, заголовки безопасности.
Затем проверить и перезагрузить Apache:
sudo apachectl configtest
sudo systemctl reload apache2
9. 📝 Чек-лист: всё готово к работе
- [ ] Домен смотрит на ваш сервер (проверка:
getent hosts yourdomain.com) - [ ] Порты 80 и 443 открыты в фаерволе
- [ ] Apache установлен и есть виртуальный хост для вашего домена
- [ ] Certbot и плагин установлены (
certbot --version) - [ ] Сертификат получен (
sudo certbot certificatesпоказываетKey Type: ECDSA) - [ ] Сайт открывается по HTTPS, в браузере зелёный замочек
- [ ]
openssl s_client -connect yourdomain.com:443показываетVerify return code: 0 (ok) - [ ] Таймер обновления активен (
systemctl is-enabled certbot.timer→enabled) - [ ] Тестовый прогон обновления прошёл (
sudo certbot renew --dry-run) - [ ] HTTP/2 включён и заголовки безопасности добавлены
Заключение
Вы настроили HTTPS для вашего сайта на Apache с помощью Let’s Encrypt. Теперь все данные между посетителями и сервером шифруются. Certbot автоматически обновит сертификат через systemd-таймер, и вам не нужно об этом вспоминать. Главные моменты, которые нужно помнить: перед запуском Certbot домен уже должен смотреть на сервер, а порты 80 и 443 — быть открытыми. Для ускорения работы используйте ECDSA-ключи (флаг --key-type ecdsa). Если вам нужен сертификат для всех поддоменов — используйте DNS-валидацию (раздел 3.2). Если вы хотите усилить конфигурацию, раздел 6 показывает, как добавить HTTP/2, HSTS и другие заголовки безопасности.
Что дальше:
- Настройте автоматическую отправку логов и мониторинг (например, через Fail2Ban)
- Добавьте дополнительные заголовки безопасности (
X-Frame-Options,X-Content-Type-Options) - Проверьте оценку вашего сайта на SSL Labs
- Если у вас Nginx вместо Apache, используйте наше руководство для Nginx
Связанные статьи: