Основы SSL-сертификации

Взаимодействие Nginx и Certbot для получения и управления SSL-сертификатами


Certbot — это официальный клиент Let's Encrypt, который автоматизирует получение и установку SSL/TLS-сертификатов. Nginx — популярный веб-сервер, который может работать как реверс-прокси. Их интеграция позволяет легко перейти на HTTPS без ручной настройки.

1. Введение: Зачем нужен SSL и как Certbot взаимодействует с Nginx

SSL/TLS-сертификаты обеспечивают шифрование трафика между клиентом (браузером) и сервером, предотвращая перехват данных. Без HTTPS сайт считается небезопасным в браузерах, и поисковики (как Google) понижают его в выдаче.

  • Роль Certbot: Certbot автоматизирует процесс: проверяет владение доменом, запрашивает сертификат у Let's Encrypt и настраивает Nginx. Плагин --nginx специально интегрируется с конфигурацией Nginx, временно модифицируя её для проверки.
  • Преимущества интеграции:
    • Бесплатно и автоматически (сертификаты на 90 дней с автопродлением).
    • Минимальные изменения в конфиге.
    • Поддержка редиректа HTTP → HTTPS.

Аналогия: Certbot — как мастер-установщик, который проверяет, что домен ваш (через " challenge" — вызов), а затем "вклеивает" замки (сертификаты) в дверь вашего сервера (Nginx).

Предварительные требования:

  • Установленный Nginx (sudo apt install nginx на Ubuntu).
  • Установленный Certbot (sudo apt install certbot python3-certbot-nginx).
  • Домен с A-записью,指向 на IP сервера.
  • Открытый порт 80 в фаерволе (для проверки).

2. Минимальная настройка Nginx для Certbot

Для успешного получения сертификата Nginx должен слушать порт 80 и иметь блок server с правильным server_name. Certbot использует HTTP-01 challenge: он создаёт временный файл на сервере, и Let's Encrypt проверяет его доступность по HTTP.

Минималистичный конфиг для выпуска сертификата

Если ваш бэкенд (приложение) ещё не готов, используйте простой конфиг, независимый от прокси. Создайте файл в /etc/nginx/sites-available/my_domain.conf и активируйте симлинк в sites-enabled.

 
server {
    listen 80;
    server_name my_domain.tld;  # Замените на ваш домен

    location / {
        root /var/www/html;  # Пустая директория для статических файлов
    }
}
 
  • Почему это работает? Certbot ищет блок с server_name, совпадающим с доменом (-d my_domain.tld). Он временно добавит location /.well-known/acme-challenge/ для проверки, не трогая ваш location /.
  • Проверка конфига:
    • sudo nginx -t (проверить синтаксис).
    • sudo systemctl reload nginx (применить изменения).

Если у вас уже есть прокси-настройки (для приложения на порту 9090), они тоже подойдут, но убедитесь, что бэкенд запущен, иначе Nginx может не перезагрузиться.

Пример с прокси (если бэкенд готов):

 
server {
    listen 80;
    server_name my_domain.tld;
    keepalive_timeout 60;

    location / {
        proxy_pass http://localhost:9090;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache off;
        proxy_buffering off;
        proxy_read_timeout 100s;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
Нюанс: Если бэкенд не работает, Certbot может выдать ошибку при reload. В этом случае используйте минималистичный вариант выше.

3. Процесс получения сертификата с Certbot --nginx

Запустите команду:

 
sudo certbot --nginx -d my_domain.tld
 

Что происходит шаг за шагом

  1. Проверка владения (HTTP-01 Challenge):

    • Certbot создаёт секретный файл в /.well-known/acme-challenge/ на вашем сервере.
    • Временно модифицирует конфиг Nginx, добавляя правило для этой локации (выше вашего location /).
    • Сервер Let's Encrypt запрашивает http://my_domain.tld/.well-known/acme-challenge/XYZ.
    • Nginx отдаёт файл, подтверждая владение.
  2. Выпуск сертификата:

    • Если проверка успешна, Certbot получает сертификат и ключи (/etc/letsencrypt/live/my_domain.tld/).
    • Автоматически добавляет в конфиг:
      • listen 443 ssl;
      • Пути к сертификатам: ssl_certificate ...; ssl_certificate_key ...;
      • Опции: include /etc/letsencrypt/options-ssl-nginx.conf; и ssl_dhparam ...;
    • Предлагает настроить редирект с 80 на 443 (рекомендуется для безопасности).
  3. Автоматическое продление:

    • Certbot создаёт таймер (systemd) или crontab для ежедневной проверки.
    • Продление запускается, если осталось <30 дней.

После успеха Certbot выдаст "Congratulations!". Теперь сайт доступен по HTTPS.

Возможные проблемы:

  • DNS не пропагировался: Проверьте A-запись.
  • Порт 80 заблокирован: Откройте в UFW (sudo ufw allow 80).
  • Конфликт с бэкендом: Используйте минимальный конфиг.

4. Редактирование конфига после получения сертификата

После Certbot вы можете заменить временные настройки на реальные. Сохраните строки, помеченные # managed by Certbot — они нужны для продления.

Пример итогового конфига с прокси и SSL:

 
server {
    listen 80;
    server_name my_domain.tld;
    # Редирект на HTTPS (добавит Certbot, если выбрать)
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl; # managed by Certbot
    server_name my_domain.tld;
    keepalive_timeout 60;

    ssl_certificate /etc/letsencrypt/live/my_domain.tld/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/my_domain.tld/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://localhost:9090;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache off;
        proxy_buffering off;
        proxy_read_timeout 100s;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
 
  • Проверьте: sudo nginx -t и sudo systemctl reload nginx.
  • Совет: Разделите HTTP (редирект) и HTTPS в отдельные блоки для ясности.

5. Продление сертификата: Как Certbot работает с кастомным конфигом

Certbot не повредит ваш конфиг при продлении (через 90 дней). Он:

  • Временно добавляет правило для challenge.
  • Проверяет синтаксис (nginx -t).
  • Обновляет сертификаты и reload Nginx.
  • Убирает временные изменения.

Ваши прокси-настройки остаются нетронутыми, если нет ошибок синтаксиса.

Тестирование продления

Запустите симуляцию:

sudo certbot renew --dry-run

Если "all simulated renewals succeeded" — всё в порядке.

Автоматизация: Certbot сам настраивает таймер. Проверьте: sudo systemctl list-timers.

6. Лучшие практики и распространённые ошибки

  • Структура конфига: Держите SSL-строки от Certbot нетронутыми. Используйте отдельные файлы для сайтов (/etc/nginx/sites-available/).
  • Безопасность: Включите HSTS (add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;) после настройки.
  • Мониторинг: Установите уведомления о продлении (опция Certbot --post-hook для скриптов).
  • Ошибки:
    • "No matching server block": Убедитесь в правильном server_name.
    • Ошибка reload: Запустите бэкенд или используйте статический root.
    • Многодоменные сертификаты: Добавьте -d домен2.tld.
  • Альтернативы: Для продвинутых — Certbot в standalone режиме (без Nginx), но --nginx удобнее.
4
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.