Основы 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Что происходит шаг за шагом
-
Проверка владения (HTTP-01 Challenge):
- Certbot создаёт секретный файл в /.well-known/acme-challenge/ на вашем сервере.
- Временно модифицирует конфиг Nginx, добавляя правило для этой локации (выше вашего
location /). - Сервер Let's Encrypt запрашивает http://my_domain.tld/.well-known/acme-challenge/XYZ.
- Nginx отдаёт файл, подтверждая владение.
-
Выпуск сертификата:
- Если проверка успешна, 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 (рекомендуется для безопасности).
-
Автоматическое продление:
- 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.
- "No matching server block": Убедитесь в правильном
- Альтернативы: Для продвинутых — Certbot в standalone режиме (без Nginx), но --nginx удобнее.
- Роль Certbot: Certbot автоматизирует процесс: проверяет владение доменом, запрашивает сертификат у Let's Encrypt и настраивает Nginx. Плагин