База знаний (цифровой суверенитет)
  • Основы SSL-сертификации

    Сети - теория и практика
    1 2 7

    A
    1,168
    0

    Содержание

  • A
    1,168
    0

    Взаимодействие 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 удобнее.