Загрузка...
Загрузка...
Пошаговое руководство по установке бесплатных SSL-сертификатов Let's Encrypt на Apache и Nginx. Certbot, автообновление, wildcard. Практический гайд для веб-мастеров.
Всё о SSL/TLS сертификатах: типы, получение, настройка, обновление. Let's Encrypt, Wildcard, EV-сертификаты. Практическое руководство для веб-разработчиков.
SEOПошаговая настройка редиректа HTTP на HTTPS для Apache, Nginx и WordPress. Готовые примеры конфигурации и проверка корректности.
DevOpsПолная настройка SSL/TLS в Nginx: установка Certbot, server block, HSTS, OCSP stapling, cipher suites, редирект HTTP на HTTPS.
БезопасностьСравнение типов SSL-сертификатов: DV, OV, EV, Wildcard, Multi-Domain. Как выбрать подходящий сертификат для вашего проекта. Стоимость, сроки выдачи, особенности.
Поделитесь с коллегами или изучите другие материалы блога
Let's Encrypt за несколько лет изменил ландшафт веба: бесплатные SSL-сертификаты, автоматическое обновление, поддержка wildcard — всё это доступно без затрат. В 2026 году нет причин оставлять сайт на HTTP. В этом руководстве разберём установку сертификатов на Apache и Nginx с помощью Certbot, настройку автообновления и решение типичных проблем.
Перед началом убедитесь, что домен указывает на ваш сервер (A-запись настроена) и порты 80 и 443 открыты. Проверить текущее состояние SSL можно с помощью инструмента проверки SSL. Для долгосрочного мониторинга срока действия сертификата используйте SSL Monitor.
Let's Encrypt — некоммерческий центр сертификации (CA), запущенный в 2015 году при поддержке Mozilla, Cisco, Google и других. Цель — сделать HTTPS доступным для всех. За годы работы выпущены миллиарды сертификатов. Срок действия — 90 дней (ранее 60), что стимулирует автоматизацию обновления.
| Параметр | Значение |
|---|---|
| Стоимость | Бесплатно |
| Срок действия | 90 дней |
| Тип проверки | DV (Domain Validation) |
| Wildcard | Да (через DNS challenge) |
| Лимит сертификатов | 50 на домен в неделю |
| Лимит дубликатов | 5 в неделю |
Let's Encrypt использует протокол ACME (Automated Certificate Management Environment) для автоматизации выдачи. Certbot — самый популярный клиент ACME, поддерживающий HTTP-01 и DNS-01 challenge для верификации домена.
# Обновление пакетов
sudo apt update
# Установка Certbot и плагина для Nginx или Apache
# Для Nginx:
sudo apt install certbot python3-certbot-nginx -y
# Для Apache:
sudo apt install certbot python3-certbot-apache -y
# Только Certbot (без плагинов, для ручной настройки):
sudo apt install certbot -y
# Установка EPEL (если не установлен)
sudo dnf install epel-release -y
# Certbot для Nginx
sudo dnf install certbot python3-certbot-nginx -y
# Certbot для Apache
sudo dnf install certbot python3-certbot-apache -y
certbot --version
# certbot 2.x.x
Certbot может сам настроить Nginx: добавить блок location для ACME challenge и настроить SSL.
# Один домен
sudo certbot --nginx -d example.com
# Несколько доменов (один сертификат)
sudo certbot --nginx -d example.com -d www.example.com
# Интерактивный режим: email для уведомлений, согласие с ToS
Certbot запросит:
Если вы предпочитаете полный контроль, настройте Nginx вручную и используйте certbot certonly.
Шаг 1. Временный сервер для ACME challenge:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
location /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}
location / {
return 301 https://$host$request_uri;
}
}
Шаг 2. Создайте директорию и получите сертификат:
sudo mkdir -p /var/www/html/.well-known/acme-challenge
sudo chown -R www-data:www-data /var/www/html
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
Шаг 3. Добавьте SSL-блок в Nginx:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Рекомендуемые настройки SSL (см. раздел ниже)
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/html;
index index.html;
# ... остальная конфигурация
}
Шаг 4. Перезагрузите Nginx:
sudo nginx -t
sudo systemctl reload nginx
# Редирект HTTP → HTTPS
server {
listen 80;
server_name example.com www.example.com;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
sudo certbot --apache -d example.com -d www.example.com
Certbot автоматически:
Шаг 1. Включите модули SSL и rewrite:
sudo a2enmod ssl rewrite
sudo systemctl restart apache2
Шаг 2. Получите сертификат:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
Шаг 3. Создайте виртуальный хост для HTTPS:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Шаг 4. Редирект HTTP → HTTPS:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
Шаг 5. Перезапустите Apache:
sudo apache2ctl configtest
sudo systemctl restart apache2
Для поддоменов вида *.example.com нужна DNS-верификация: Let's Encrypt проверяет, что вы контролируете домен, через TXT-запись.
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d "*.example.com"
Certbot выведет инструкцию:
Please deploy a DNS TXT record under the name _acme-challenge.example.com with the following value:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Before continuing, verify the record is deployed.
Действия:
_acme-challenge.example.com с указанным значениемdig TXT _acme-challenge.example.com)Для автоматического обновления wildcard используйте плагины:
Пример для Cloudflare:
sudo apt install python3-certbot-dns-cloudflare -y
Создайте файл с API-токеном:
# /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
chmod 600 /etc/letsencrypt/cloudflare.ini
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com -d "*.example.com"
Certbot создаёт systemd timer для автоматического обновления. Проверьте статус:
sudo systemctl status certbot.timer
sudo systemctl list-timers | grep certbot
Обновление запускается дважды в день. Certbot обновляет сертификаты за 30 дней до истечения.
# Сухой прогон (без реального обновления)
sudo certbot renew --dry-run
# Реальное обновление
sudo certbot renew
Certbot по умолчанию перезагружает Apache/Nginx после обновления. Для кастомных скриптов используйте хуки:
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Если systemd недоступен:
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
Certbot создаёт файл options-ssl-nginx.conf (или options-ssl-apache.conf) с рекомендуемыми настройками. Основные параметры:
Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
Apache:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
Добавляет заголовок Strict-Transport-Security для принудительного HTTPS в браузере:
Nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Проверить заголовки безопасности можно через инструмент Security Headers.
Certbot не нашёл подходящий виртуальный хост. Убедитесь, что в конфигурации указан правильный server_name (Nginx) или ServerName (Apache) для вашего домена.
Проверьте, что веб-сервер слушает порт 80 и firewall не блокирует его:
sudo ss -tlnp | grep :80
sudo ufw status
Домен не резолвится. Проверьте A-запись:
dig example.com +short
Let's Encrypt ограничивает: 50 сертификатов на домен в неделю, 5 дубликатов в неделю. При превышении нужно подождать. Используйте --dry-run для тестов, чтобы не тратить лимит.
Проверьте логи:
sudo journalctl -u certbot.timer
sudo certbot renew --dry-run -v
Убедитесь, что порт 80 доступен снаружи (для HTTP-01 challenge).
/etc/letsencrypt/
├── live/example.com/
│ ├── cert.pem # Сертификат сервера
│ ├── chain.pem # Цепочка промежуточных сертификатов
│ ├── fullchain.pem # cert.pem + chain.pem (используйте этот)
│ └── privkey.pem # Приватный ключ
├── archive/ # Архив старых версий
├── renewal/ # Конфигурация обновления
└── renewal-hooks/ # Скрипты при обновлении
В конфигурации веб-сервера используйте fullchain.pem и privkey.pem.
После установки проверьте:
Дополнительные материалы: полное руководство по SSL-сертификатам и типы SSL-сертификатов.
Let's Encrypt с Certbot позволяет получить и поддерживать бесплатный SSL за считанные минуты. Автоматическое обновление избавляет от рутины. Для большинства сайтов DV-сертификата достаточно; wildcard нужен только при большом количестве поддоменов. Следуйте шагам выше — и ваш сайт будет работать по HTTPS без лишних затрат.