Как защитить Apache с помощью Let's Encrypt в Ubuntu 20.04 и 22.04

Как защитить Apache с помощью Let's Encrypt в Ubuntu 20.04 и 22.04

Защита веб-сервера Apache с Let's Encrypt — это просто. В нашей статье вы найдёте подробные инструкции для Ubuntu 20.04 и 22.04, а также узнаете, как автоматизировать обновление сертификатов и настроить современные алгоритмы шифрования. 

Это не просто инструкция по настройке HTTPS и обеспечению безопасности Apache с помощью Let's Encrypt. Вы узнаете, как избежать скрытых уязвимостей, выбрать современные алгоритмы шифрования и автоматизировать обновление сертификатов. Даже если вы впервые настраиваете SSL, после прочтения ваш сервер будет соответствовать требованиям безопасности 2025 года.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

Установка и настройка 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 logo

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 ActionFrom
-------- ----
... 
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, автоматически обновляет сертификаты и защищён от большинства известных атак.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях