Защита веб-сервера Apache с Let's Encrypt — это просто. В нашей статье вы найдёте подробные инструкции для Ubuntu 20.04 и 22.04, а также узнаете, как автоматизировать обновление сертификатов и настроить современные алгоритмы шифрования.
Это не просто инструкция по настройке HTTPS и обеспечению безопасности Apache с помощью Let's Encrypt. Вы узнаете, как избежать скрытых уязвимостей, выбрать современные алгоритмы шифрования и автоматизировать обновление сертификатов. Даже если вы впервые настраиваете SSL, после прочтения ваш сервер будет соответствовать требованиям безопасности 2025 года.
Установка и настройка Certbot: первый шаг к защищённому сайту
Чтобы Apache начал работать по HTTPS, необходимо получить SSL-сертификат. Let's Encrypt предоставляет его бесплатно, но сертификат нужно обновлять каждые 90 дней, а делать это вручную — не лучшее решение.
Именно здесь на помощь приходит Certbot — инструмент, который автоматизирует получение и продление сертификатов. Рассказываем, как подготовить систему, установить и настроить Certbot.
Важно!
Все описанные ниже команды выполняются либо с sudo, либо из-под учётной записи root.
Подготовка системы
Любая настройка или установка ПО начинается с обновления пакетов. Команда, которая синхронизирует локальную базу данных пакетов с репозиториями Ubuntu и устанавливает последние обновления безопасности:
apt update && apt upgrade
Пропуск этого шага может привести к конфликтам версий. Например, старые зависимости Apache не позволят активировать модуль mod_ssl, критичный для работы HTTPS.
После обновлений установите Apache, если он ещё не установлен и настроен:
apt install apache2
Затем активируйте mod_ssl — без него веб-сервер не сможет обрабатывать зашифрованные соединения:
a2enmod ssl
systemctl restart apache2
Если модуль не включится, проверьте логи:
journalctl -u apache2
Частая ошибка на этом этапе связана с занятостью порта 443 другим приложением (например, Nginx или Docker-контейнером).
Установка Certbot с помощью Apt и Snap
Certbot можно установить с помощью Apt и Snap. Разработчики Let's Encrypt рекомендуют использовать Snap — это гарантирует актуальность версии и отсутствие конфликтов с системными пакетами.
Ubuntu 20.04
На Ubuntu 20.04 Certbot проще всего установить через стандартный репозиторий Apt (но готовьтесь к тому, что версия может быть устаревшей из-за возможных задержек в обновлениях):
apt install certbot python3-certbot-apache
Для актуальных функций потребуется добавить PPA-репозиторий:
add-apt-repository ppa:certbot/certbot
apt update
И только затем переходите к установке.
Ubuntu 22.04
Для Ubuntu 22.04 официальная документация рекомендует устанавливать Certbot через Snap. Сначала обновите Snap-сервис:
snap install core
snap refresh core
Если Snap не установлен, добавьте его командой:
apt install snapd
Затем установите сам Certbot:
snap install --classic certbot
Флаг --classic отключает изоляцию Snap-пакета, что необходимо для доступа к системным файлам Apache. После установки создайте символьную ссылку, чтобы Certbot был доступен из любой директории:
ln -s /snap/bin/certbot /usr/bin/certbot
Если возникнет ошибка «Permission denied», проверьте права на /usr/bin/ через ls -l /usr/bin/ | grep certbot и убедитесь, что у пользователя есть права на запись.
Пакет python3-certbot-apache из Apt на Ubuntu 22.04 тоже доступен, но менее предпочтителен.
Проверка доступности домена

Let's Encrypt требует доказательства владения доменом. Certbot автоматически проведёт проверку через HTTP-запросы, для чего должны быть выполнены следующие условия:
- Домен привязан к IP-адресу сервера. Убедитесь, что A-записи в DNS ведут на правильный адрес. Сделать это можно через dig ваш_домен.ru +short. Также проверьте A-запись для домена с префиксом WWW.
- Порты 80 и 443 открыты. Брандмауэр Ubuntu (UFW) часто блокирует их по умолчанию. Разрешите трафик командой:
ufw allow 'Apache Full'
ufw reload
Если порты остаются закрытыми, просмотрите статус файрвола:
ufw status
В выводе должны быть строки:
To | Action | From |
-- | ------ | ---- |
... | ||
Apache Full | ALLOW | Anywhere |
... | ||
Apache Full (v6) | ALLOW | Anywhere (v6) |
ufw status
с разрешённым трафиком для ApacheИногда конфликтуют правила, добавленные вручную — в таком случае удалите их:
ufw delete [номер_правила]
Что делать, если Certbot не проходит проверку
Ошибка «Failed to connect to host for DVSNI challenge». Убедитесь, что Apache слушает порт 80:
ss -tulpn | grep ':80'
Если служба запущена, но порт не открыт, перезагрузите Apache:
systemctl restart apache2
Ошибка «DNS problem: NXDOMAIN looking up A». Проверьте DNS-записи через специальные сервисы, например DNS Checker. Возможно, изменения ещё не распространились — подождите 10-15 минут.
После успешной настройки можно переходить к генерации сертификата.
Получение SSL-сертификата и настройка Apache
Теперь, когда Certbot установлен и система подготовлена, можно переходить к главному — получению SSL-сертификата. Let's Encrypt выдаёт сертификаты бесплатно, но процесс их генерации требует строгой верификации домена. Certbot решает эту задачу парой команд, однако важно понимать, что происходит «под капотом» и как Certbot взаимодействует с Apache, чтобы вовремя заметить и исправить ошибки.
Генерация сертификата
Запустите команду:
certbot --apache
Certbot выполнит несколько действий автоматически:
- Просканирует виртуальные хосты Apache в /etc/apache2/sites-available/, чтобы определить, для каких доменов запрашивать сертификаты. Если у вас несколько доменов, появится интерактивное меню — укажите нужные через пробел.
- Проведёт проверку домена через протокол ACME. Для этого временно создаст файл в директории .well-known/acme-challenge/ вашего веб-корня и обратится к нему через HTTP. Если файл недоступен, сертификат не будет выдан.
- Сгенерирует сертификаты и сохранит их в /etc/letsencrypt/live/ваш_домен/. Здесь появятся файлы fullchain.pem (сертификат и цепочка доверия) и privkey.pem (приватный ключ).
- Настроит Apache на использование HTTPS. Certbot добавит в конфиг виртуального хоста блок <VirtualHost *:443> с параметрами SSLEngine on, SSLCertificateFile и SSLCertificateKeyFile, а также перенаправит HTTP-трафик на HTTPS через Redirect permanent / https://ваш_домен/.
В процессе вам нужно будет согласиться с условиями обслуживания и указать необходимую информацию:
- e-mail (нужен для получения уведомлений, поэтому указывайте актуальный адрес);
- дать согласие или отказаться от получения рассылки;
- указать домены, для которых нужно включить HTTPS; если вы активизируете HTTPS для всех доменов в списке, то оставьте поле пустым.
Ручная проверка конфигурации
После завершения работы Certbot обновит конфиг Apache.
Найдите его в директории:
/etc/apache2/sites-available/ваш_домен-le-ssl.conf
Проверьте:
- SSLCertificateFile должен указывать на fullchain.pem;
- SSLCertificateKeyFile — на privkey.pem;
- Директива Redirect — перенаправлять с HTTP на HTTPS.
Если перенаправление не настроено, добавьте в HTTP-виртуальный хост (файл ваш_домен.conf):
Redirect permanent / https://ваш_домен/
После внесения изменений перезагрузите Apache:
systemctl reload apache2
Если служба не запустится, проверьте синтаксис конфигов:
apache2ctl configtest
Частая ошибка — опечатка в путях к сертификатам.
Обновление Let’s Encrypt
Сертификаты Let's Encrypt действуют 90 дней, но вручную обновлять их не придётся. Certbot добавляет задачу в cron — скрипт выполняется дважды в день и обновляет сертификаты, срок действия которых заканчивается в течение 30 дней. Проверить работу планировщика можно командой, запускающей пробное обновление:
certbot renew --dry-run
Если вывод содержит сообщение «Congratulations, all simulated renewals succeeded», всё настроено верно. Для принудительного обновления выполните:
certbot renew --force-renewal
При установке через Snap используется systemd timer (certbot.timer), а не cron. Проверка Snap-установки:
systemctl list-timers | grep certbot
Важно: частые обновления (чаще 50 раз в неделю) могут привести к временной блокировке со стороны Let's Encrypt.
Как диагностировать ошибки при обновлении:
- «No renewals were attempted» — не найдены сертификаты для обновления. Убедитесь, что они были получены через certbot certificates.
- «Challenge failed for domain» — домен недоступен для проверки. Проверьте, открыты ли порты 80/443 и корректны ли DNS-записи.
- «Permission denied» в /etc/letsencrypt/ — Certbot требует прав на запись. Исправьте через команду:
chown -R root:root /etc/letsencrypt/
Проверка работоспособности HTTPS
Убедитесь, что сайт доступен по HTTPS:
- Откройте его в браузере — значок замка в адресной строке или «https» в начале URL подтвердит успех. Также вы можете кликнуть на «Сведения о сайте» и просмотреть информацию о действующем сертификате.
- Проверьте сертификат и срок его действия через консоль:
echo | openssl s_client -connect ваш_домен:443 2>/dev/null | openssl x509 -noout -dates
Теперь Apache защищён, но забота о безопасности на этом не заканчивается. В следующем разделе мы настроим современные шифры, включим HSTS и проверим конфигурацию через независимые сервисы.
Усиление безопасности Apache и SSL/TLS: от базовой защиты до профессиональных настроек
Даже с работающим HTTPS ваш сервер может оставаться уязвимым, если не оптимизировать параметры шифрования и не включить дополнительные механизмы защиты. Современные стандарты безопасности требуют не только актуальных сертификатов, но и правильной конфигурации криптографических алгоритмов. Разберёмся, как превратить базовую настройку в надёжный щит против атак.
Оптимизация параметров шифрования
Протоколы TLS 1.0 и 1.1 давно считаются небезопасными — они уязвимы для некоторых видов атак, например BEAST и POODLE. Let's Encrypt по умолчанию выдаёт сертификаты, совместимые с TLS 1.2 и 1.3, но Apache может разрешать устаревшие соединения. На Ubuntu 22.04 файл настроек SSL (/etc/apache2/mods-available/ssl.conf) уже может содержать более строгие параметры шифрования (например, TLS 1.0 и 1.1 часто отключены по умолчанию). Но на 20.04 эти настройки иногда приходится менять вручную. Чтобы сделать это, отредактируйте конфиги SSL:
nano /etc/apache2/mods-available/ssl.conf
Найдите блок SSLProtocol и замените его на:
SSLProtocol -all +TLSv1.2 +TLSv1.3
Это отключает все старые версии TLS, оставляя только актуальные. Далее настройте шифры — алгоритмы, которые определяют, как именно шифруются данные. Добавьте строку:
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder on
Где:
- ECDHE — обеспечивает Perfect Forward Secrecy: даже если злоумышленник получит приватный ключ, он не сможет расшифровать старые сессии;
- AES128-GCM — современный алгоритм шифрования с аутентификацией;
- SSLHonorCipherOrder принудительно выбирает самый безопасный шифр из поддерживаемых клиентом.
После изменений перезагрузите Apache через systemctl reload apache2. Если сайт перестал открываться, проверьте журналы ошибок:
tail -n 50 /var/log/apache2/error.log
Возможно, вы отключили алгоритмы, которые использует ваша аудитория (например, старые Android-устройства).
HTTP Strict Transport Security (HSTS) — защита от downgrade-атак
HSTS — это заголовок, который запрещает браузерам подключаться к сайту по HTTP, даже если пользователь явно введёт этот протокол. Добавьте его в конфиг SSL-хоста:
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Где:
- max-age=63072000 — срок действия политики (2 года в секундах);
- includeSubDomains — распространяет HSTS на все поддомены;
- preload — разрешает включение сайта в список HSTS Google (требует отдельной регистрации).
Обратите внимание, что после активации HSTS удалить сайт из кеша браузеров будет невозможно до истечения max-age. Начинайте с небольшого срока (например, max-age=300), и только после тестов увеличивайте его.
Проверка безопасности
Чтобы найти скрытые уязвимости, используйте эти инструменты:
- SSL Labs (ssllabs.com/ssltest) — проверяет поддерживаемые протоколы, шифры и наличие известных уязвимостей. Цель — достичь оценки «A+».
- Hardenize (hardenize.com) — анализирует не только SSL, но и другие аспекты безопасности (DNSSEC, заголовки CSP).
Консольные команды:
- Проверка поддерживаемых TLS-версий:
openssl s_client -connect ваш_домен:443 -tls1_2
- Просмотр заголовков ответа:
curl -I https://ваш_домен
Если тесты показывают уязвимости (например, SSLv3 или RC4), вернитесь к настройкам ssl.conf и убедитесь, что небезопасные алгоритмы отключены.
Резервное копирование
Один неверный символ в конфиге может положить весь сервер. Поэтому перед любыми изменениями создавайте резервные копии:
tar -czvf /backup/apache_ssl_$(date +%F).tar.gz /etc/apache2/ /etc/letsencrypt/
Эта команда запакует все конфиги Apache и сертификаты Let's Encrypt в архив с датой создания. Храните копии на отдельном сервере или в облаке — если атака повредит файлы, вы быстро восстановите работу.
Что делать, если...
- Сайт не открывается после настройки шифров. Вернитесь к старой версии ssl.conf, используя бекап, и проверьте, какие алгоритмы поддерживают ваши пользователи через SSL Labs.
- HSTS блокирует доступ к HTTP. Временно уменьшите значение max-age до 300 секунд и дождитесь истечения предыдущего срока.
- Let's Encrypt не обновляет сертификаты. Убедитесь, что задача в cron активна:
systemctl status cron
А также что нет ошибок в логах:
grep certbot /var/log/syslog
Заключение
Защита Apache с помощью Let's Encrypt — это не просто «замочек» в браузере, это фундамент доверия пользователей к вашему сайту и залог его безопасности. Вы прошли все этапы: от установки Certbot до тонкой настройки шифров и HSTS. Теперь ваш сервер использует актуальные протоколы TLS, автоматически обновляет сертификаты и защищён от большинства известных атак.
Читайте в блоге:
- Установка Java на Ubuntu 22.04 через Apt: полное руководство
- Настройка VPS на Debian 11: пошаговое руководство
- Как установить Joomla на VPS: от простого хостинга до полного контроля