SSL-сертификат бесплатно: Let’s Encrypt + автопродление

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

Есть идея? Реализуем

Разрабатываем проекты, которые решают задачи бизнеса — от лендинга до сложного сервиса. Расскажите о своей задаче, подберём решение.

Написать в Telegram

30.03.2026

Нужна консультация?

Оставьте свои контактные данные, или свяжитесь с нами удобным для вас способом

Привет! Меня зовут Багира. Пишите, я все передам хозяевам!

Привет! Меня зовут Багира. Пишите, я все передам хозяевам!

Нажимая кнопку «Принять», вы соглашаетесь на сбор cookie. Мы используем их для обеспечения функционирования веб-сайта, аналитики действий и улучшения качества обслуживания. Если Вы не хотите, чтобы эти данные обрабатывались, отключите cookie в настройках браузера или прекратите использовать сайт.
Принять