Как получить TLS-сертификат для веб-сервера?

«Как получить TLS-сертификат для веб-сервера?» — вопрос из категории Безопасность, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике получение TLS-сертификата — это автоматизированный процесс, интегрированный в CI/CD или инфраструктуру как код (IaC). Основные подходы:

1. Автоматизированное получение через Let's Encrypt (стандарт для DevOps):

  • Использование Certbot в скриптах или контейнерах:
    # Пример для автоматического получения и обновления
    certbot certonly --nginx --non-interactive --agree-tos --email admin@example.com -d example.com -d www.example.com
  • Интеграция с Docker и оркестраторами: Часто используется образ certbot/certbot в sidecar-контейнере рядом с веб-сервером (например, Nginx) для автоматического обновления.
  • Использование ACME-клиентов в инфраструктуре: Для Kubernetes популярны решения вроде cert-manager, который автоматически запрашивает и обновляет сертификаты из Let's Encrypt и применяет их как Kubernetes Secrets.

2. Генерация CSR и работа с платными центрами сертификации (CA):

  • Автоматизация генерации CSR:
    # Генерация ключа и CSR одной командой для автоматизации
    openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/private/example.key -out /etc/ssl/certs/example.csr -subj "/C=RU/ST=Moscow/L=Moscow/O=Example Corp/CN=example.com"
  • В DevOps-контексте CSR и полученные сертификаты управляются как секреты (например, в HashiCorp Vault, AWS Secrets Manager) и разворачиваются через инструменты вроде Ansible, Terraform или конфигурации серверов (Puppet, Chef).

3. Настройка веб-сервера (Nginx пример через IaC):

# Пример конфигурации в Ansible-шаблоне или Dockerfile
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # Дополнительные настройки безопасности (HSTS, современные шифры)
}

Ключевые DevOps-практики:

  • Автоматическое обновление: Настройка cron-задачи или systemd-таймера для certbot renew --quiet --post-hook "systemctl reload nginx".
  • Верификация через DNS: Для wildcard-сертификатов (*.example.com) используется DNS-01 challenge, который можно автоматизировать через API DNS-провайдера (Cloudflare, Route53).
  • Мониторинг срока действия: Интеграция проверки срока действия сертификата в системы мониторинга (Prometheus, Nagios) через скрипты, использующие openssl x509 -enddate.