- Home »

Как защитить Apache с помощью Let’s Encrypt на Ubuntu
Когда говорят о SSL-сертификатах, большинство сразу вспоминает те времена, когда за каждый сертификат приходилось платить приличные деньги. Но всё изменилось, когда появился Let’s Encrypt — некоммерческий удостоверяющий центр, который выдаёт SSL-сертификаты абсолютно бесплатно. Сегодня разберём, как быстро и без танцев с бубном настроить HTTPS для Apache на Ubuntu. Это не просто очередная инструкция — это практическое руководство, которое сэкономит вам время и нервы.
Как работает Let’s Encrypt и зачем это нужно?
Let’s Encrypt использует протокол ACME (Automatic Certificate Management Environment) для автоматической выдачи и обновления SSL-сертификатов. Процесс работает следующим образом:
- Проверка владения доменом — сервер Let’s Encrypt проверяет, что вы действительно контролируете домен
- Генерация сертификата — после успешной проверки выдаётся 90-дневный сертификат
- Автоматическое обновление — certbot настраивает cron-задачу для автоматического продления
Основные преимущества:
- Бесплатность — никаких скрытых платежей
- Автоматизация — настроил раз и забыл
- Доверие браузеров — сертификаты принимаются всеми современными браузерами
- Поддержка wildcard-сертификатов
Пошаговая настройка: от установки до запуска
Для начала убедитесь, что у вас есть работающий сервер Ubuntu с установленным Apache. Если нужен VPS для экспериментов, можете взять его здесь, а для production-нагрузок рассмотрите выделенный сервер.
Шаг 1: Подготовка системы
sudo apt update
sudo apt install apache2
sudo systemctl enable apache2
sudo systemctl start apache2
# Проверяем статус
sudo systemctl status apache2
Шаг 2: Установка Certbot
# Для Ubuntu 20.04 и новее
sudo apt install certbot python3-certbot-apache
# Для старых версий Ubuntu
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot python3-certbot-apache
Шаг 3: Настройка виртуального хоста
Создайте конфигурацию для вашего домена:
sudo nano /etc/apache2/sites-available/example.com.conf
# Содержимое файла:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>
# Создаём директорию для сайта
sudo mkdir -p /var/www/example.com
echo "<h1>Hello HTTPS!</h1>" | sudo tee /var/www/example.com/index.html
# Активируем сайт
sudo a2ensite example.com.conf
sudo systemctl reload apache2
Шаг 4: Получение SSL-сертификата
# Автоматическая настройка
sudo certbot --apache -d example.com -d www.example.com
# Или более детальная настройка
sudo certbot --apache \
--email your-email@example.com \
--agree-tos \
--no-eff-email \
-d example.com \
-d www.example.com
Практические кейсы и подводные камни
Сценарий | Проблема | Решение |
---|---|---|
Мультидоменный сайт | Нужен один сертификат для нескольких доменов | certbot --apache -d domain1.com -d domain2.com -d subdomain.domain1.com |
Wildcard-сертификат | Много поддоменов | certbot --manual --preferred-challenges dns -d "*.example.com" |
Firewall блокирует | Порт 80 недоступен | sudo ufw allow 'Apache Full' |
Ошибка валидации | DNS не резолвится | Проверить A-записи: dig example.com |
Автоматизация и мониторинг
Настройка автоматического обновления
# Проверяем настройку cron
sudo systemctl status certbot.timer
sudo systemctl enable certbot.timer
# Или настраиваем вручную
sudo crontab -e
# Добавляем строку:
0 12 * * * /usr/bin/certbot renew --quiet
Скрипт для мониторинга сертификатов
#!/bin/bash
# check_certs.sh
DOMAINS=("example.com" "www.example.com")
for domain in "${DOMAINS[@]}"; do
expiry=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
echo "Certificate for $domain expires: $expiry"
# Проверяем срок действия
if openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -checkend 604800; then
echo "Certificate for $domain is valid for more than 7 days"
else
echo "WARNING: Certificate for $domain expires soon!"
# Здесь можно добавить отправку уведомления
fi
done
Интеграция с другими инструментами
Ansible-плейбук для автоматизации
---
- name: Setup Let's Encrypt with Apache
hosts: webservers
become: yes
vars:
domains:
- example.com
- www.example.com
email: admin@example.com
tasks:
- name: Install certbot
apt:
name:
- certbot
- python3-certbot-apache
state: present
- name: Obtain SSL certificate
shell: |
certbot --apache --non-interactive --agree-tos \
--email {{ email }} \
{% for domain in domains %}-d {{ domain }} {% endfor %}
Docker-контейнер с автоматическим обновлением
# docker-compose.yml
version: '3.8'
services:
apache:
image: httpd:2.4
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/etc/letsencrypt
- ./html:/usr/local/apache2/htdocs
certbot:
image: certbot/certbot
volumes:
- ./certs:/etc/letsencrypt
- ./html:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email admin@example.com --agree-tos --no-eff-email -d example.com
Альтернативные решения и сравнение
Решение | Стоимость | Срок действия | Автоматизация | Wildcard |
---|---|---|---|---|
Let’s Encrypt | Бесплатно | 90 дней | Да | Да |
Cloudflare SSL | Бесплатно | 15 лет | Да | Да |
DigiCert | $200+/год | 1-3 года | Частично | Да |
Sectigo | $50+/год | 1-3 года | Нет | Да |
Расширенные возможности
Настройка OCSP Stapling
# Добавляем в конфигурацию Apache
sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf
# Добавляем внутрь <VirtualHost *:443>
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
# В основной конфигурации
echo "SSLStaplingCache shmcb:/var/run/ocsp(128000)" | sudo tee -a /etc/apache2/mods-available/ssl.conf
Настройка HSTS (HTTP Strict Transport Security)
# Включаем модуль headers
sudo a2enmod headers
# Добавляем в конфигурацию SSL-хоста
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Интересные факты и статистика
По данным официальной статистики Let’s Encrypt, на сегодняшний день выдано более 3 миллиардов сертификатов! Это составляет примерно 80% всех SSL-сертификатов в интернете.
- Экономия для индустрии — Let’s Encrypt сэкономил веб-индустрии более $1 миллиарда на SSL-сертификатах
- Время жизни — 90 дней выбраны намеренно для стимулирования автоматизации
- Поддержка HTTP/2 — все современные браузеры требуют HTTPS для HTTP/2
- SEO-бонус — Google учитывает HTTPS как фактор ранжирования
Troubleshooting: типичные проблемы
Проблема с rate limits
# Проверяем лимиты
curl -s "https://crt.sh/?q=example.com&output=json" | jq '.[].not_after' | sort | uniq -c
# Используем staging для тестов
certbot --apache --staging -d example.com
Конфликты с существующими сертификатами
# Список существующих сертификатов
sudo certbot certificates
# Удаление старого сертификата
sudo certbot delete --cert-name example.com
Заключение и рекомендации
Let’s Encrypt + Apache на Ubuntu — это надёжное и проверенное временем решение для защиты веб-сайтов. Основные преимущества:
- Простота внедрения — настраивается буквально за 10 минут
- Бесплатность — никаких скрытых платежей и подписок
- Автоматизация — настроил раз и забыл навсегда
- Безопасность — регулярные обновления и современные стандарты
Когда использовать:
- Для всех веб-проектов без исключения
- В development и staging окружениях
- Для небольших и средних проектов
- В microservices-архитектуре
Когда рассмотреть альтернативы:
- Для enterprise-проектов с особыми требованиями к SLA
- Когда нужна расширенная валидация (EV SSL)
- Для проектов с очень высокими требованиями к доступности
Помните: современный интернет — это HTTPS-интернет. Пользователи ожидают безопасности, поисковики поощряют её, а Let’s Encrypt делает её доступной для всех. Настройте SSL сегодня, и ваши пользователи скажут вам спасибо.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.