HTTPS давно перестал быть опцией — без него браузеры показывают предупреждение, а поисковики понижают позиции. Хорошая новость: SSL-сертификат можно получить бесплатно и настроить автопродление за 10 минут. Показываем весь процесс пошагово.
Почему HTTPS обязателен в 2026 году
— Chrome и Firefox помечают HTTP-сайты как «небезопасные»
— Google учитывает HTTPS как фактор ранжирования
— Без HTTPS не работают Service Workers, Geolocation API, HTTP/2
— Формы на HTTP-сайтах — прямая угроза безопасности пользователей
— Многие рекламные сети не работают с HTTP
Let’s Encrypt — что это
Let’s Encrypt — бесплатный центр сертификации, выпускающий DV-сертификаты (Domain Validated). Сертификат действует 90 дней и продлевается автоматически. За ним стоят Mozilla, Google, EFF и другие крупные организации.
Шаг 1: Установка Certbot
Certbot — официальный клиент Let’s Encrypt. Установка зависит от ОС:
# Ubuntu / Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS / AlmaLinux
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
# Через snap (универсальный вариант)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Шаг 2: Получение сертификата для Nginx
Убедитесь, что домен уже указывает на сервер (A‑запись в DNS) и Nginx запущен:
# Автоматическая настройка — Certbot сам изменит конфиг Nginx
sudo certbot --nginx -d example.com -d www.example.com
# Или только получить сертификат без изменения конфига
sudo certbot certonly --nginx -d example.com -d www.example.com
Certbot спросит email для уведомлений и примет лицензию. После успешного выпуска сертификаты окажутся в /etc/letsencrypt/live/example.com/.
Шаг 3: Настройка Nginx для HTTPS
Если вы выбрали certonly, настройте Nginx вручную:
# /etc/nginx/sites-available/example.com
# Редирект HTTP → HTTPS
server {
listen 80;
server_name example.com www.example.com;
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;
# Рекомендуемые параметры SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS — сообщаем браузеру всегда использовать HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# OCSP Stapling — ускоряет проверку сертификата
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 1.1.1.1 valid=300s;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
}
Проверяем конфигурацию и перезагружаем:
sudo nginx -t
sudo systemctl reload nginx
Шаг 4: Автопродление сертификата
Сертификат действует 90 дней. Certbot при установке обычно сам создаёт таймер systemd или cron-задачу. Проверяем:
# Проверить, есть ли таймер systemd
sudo systemctl list-timers | grep certbot
# Или проверить cron
cat /etc/cron.d/certbot
Если автопродление не настроено — добавьте вручную:
# Вариант 1: cron (проверка дважды в день)
echo "0 3,15 * * * root certbot renew --quiet --deploy-hook 'systemctl reload nginx'" | sudo tee /etc/cron.d/certbot-renew
# Вариант 2: systemd timer
# /etc/systemd/system/certbot-renew.timer
[Unit]
Description=Certbot renewal timer
[Timer]
OnCalendar=*-*-* 03,15:00:00
RandomizedDelaySec=3600
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/certbot-renew.service
[Unit]
Description=Certbot renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
# Активируем таймер
sudo systemctl enable --now certbot-renew.timer
Тестируем продление (без реального обновления):
sudo certbot renew --dry-run
Wildcard-сертификат (*.example.com)
Wildcard покрывает все поддомены одним сертификатом. Требует DNS-challenge — подтверждение через TXT-запись:
# Ручной режим — Certbot попросит добавить TXT-запись в DNS
sudo certbot certonly --manual --preferred-challenges dns \
-d "*.example.com" -d "example.com"
Для автоматизации wildcard-продления нужен DNS-плагин вашего провайдера:
# Пример для Cloudflare
sudo apt install python3-certbot-dns-cloudflare
# Создаём файл с API-токеном
sudo mkdir -p /etc/letsencrypt
cat <<EOF | sudo tee /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
EOF
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Получаем wildcard с автопродлением
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "*.example.com" -d "example.com"
Несколько доменов на одном сервере
Каждый домен получает свой сертификат:
sudo certbot --nginx -d site1.ru -d www.site1.ru
sudo certbot --nginx -d site2.ru -d www.site2.ru
sudo certbot --nginx -d shop.site3.ru
Certbot сам разложит сертификаты по папкам и пропишет пути в конфигах Nginx.
Проверка настройки SSL
После установки проверьте качество настройки:
- SSL Labs — подробный анализ, стремитесь к оценке A+
- Security Headers — проверка HTTP-заголовков безопасности
curl -I https://example.com— быстрая проверка из терминала
# Проверить дату истечения сертификата
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
# Проверить, какой сертификат отдаёт сервер
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer
Частые ошибки и их решения
| Ошибка | Причина | Решение |
|---|---|---|
| Challenge failed for domain | DNS не указывает на сервер | Проверьте A‑запись: dig +short example.com |
| Too many certificates | Лимит 50 сертификатов на домен в неделю | Используйте --staging для тестов |
| Port 80 is already in use | Другой процесс занял порт | sudo ss -tlnp | grep :80 |
| Mixed content warnings | Часть ресурсов загружается по HTTP | Замените http:// на https:// или // |
| ERR_SSL_PROTOCOL_ERROR | Nginx не перезагружен после установки | sudo systemctl reload nginx |
| Сертификат не продлился | Не настроен cron/timer | Проверьте certbot renew --dry-run |
Мониторинг срока действия
Добавьте простую проверку в cron — получайте уведомление за 7 дней до истечения:
#!/bin/bash
# /usr/local/bin/check-ssl-expiry.sh
DOMAIN="example.com"
DAYS_BEFORE=7
EXPIRY=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
if [ "$DAYS_LEFT" -lt "$DAYS_BEFORE" ]; then
curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
-d chat_id="${TG_CHAT_ID}" \
-d text="SSL for $DOMAIN expires in $DAYS_LEFT days!"
fi
Есть идея? Реализуем
Разрабатываем проекты, которые решают задачи бизнеса — от лендинга до сложного сервиса. Расскажите о своей задаче, подберём решение.

