Другое

Настройка двух SSL-сертификатов на одном домене в Nginx

Полное руководство по одновременной настройке SSL-сертификатов Let's Encrypt и Минцифры на одном домене в Nginx без поддоменов. Пошаговая конфигурация и безопасность.

Как настроить использование двух SSL‑сертификатов (Let’s Encrypt и Минцифры) на одном домене без создания поддоменов?
Мой сайт проксируется через nginx, где используется сертификат Let’s Encrypt. Руководство требует внедрения также сертификата Минцифры.
Поделитесь опытом настройки конфигурации nginx для работы с обоими сертификатами одновременно?

Для использования двух SSL‑сертификатов (Let’s Encrypt и Минцифры) на одном домене без создания поддоменов необходимо настроить Nginx с использованием SNI (Server Name Indication) и правильно сконфигурировать серверные блоки. Это позволяет обслуживать разные сертификаты в зависимости от типа соединения или требований.


Содержание


Основные принципы конфигурации двух SSL‑сертификатов

Основная идея конфигурации двух SSL‑сертификатов на одном домене заключается в использовании разных портов или путей для обслуживания различных типов сертификатов. Для сертификата Минцифры часто используется отдельный порт или отдельный виртуальный хост.

Согласно исследованиям Brokenco, современный Nginx поддерживает динамическое распределение сертификатов с помощью переменной $ssl_server_name, которая соответствует имени сервера, запрошенного в части SNI TLS‑пакета.


Подготовка сертификатов Let’s Encrypt

Для начала убедимся, что сертификат Let’s Encrypt корректно настроен:

bash
# Установка certbot для управления сертификатами
sudo apt install certbot python3-certbot-nginx

# Получение сертификата для домена
sudo certbot certonly --nginx -d yourdomain.com -d www.yourdomain.com

По информации от Timeweb, файлы сертификата Let’s Encrypt будут сохранены в директории /etc/letsencrypt/live/yourdomain.com/ и содержат следующие файлы:

  • fullchain.pem – полный цепочка сертификатов
  • privkey.pem – приватный ключ
  • chain.pem – цепочка сертификатов
  • cert.pem – только сертификат

Интеграция сертификата Минцифры

Сертификат Минцифры (Министерство цифрового развития, связи и массовых коммуникаций РФ) обычно поставляется в виде набора файлов. Необходимо:

  1. Разместить файлы сертификата Минцифры в отдельной директории:
bash
sudo mkdir -p /etc/nginx/ssl/mincifry
sudo cp /path/to/mincifry.crt /etc/nginx/ssl/mincifry/
sudo cp /path/to/mincifry.key /etc/nginx/ssl/mincifry/
  1. Если требуется, добавить корневые сертификаты:
bash
sudo cp /path/to/ca.crt /etc/nginx/ssl/mincifry/

Как указывает Reg.ru, для работы с промежуточными сертификатами нужно создать файл ca.crt и скопировать в него содержимое корневого сертификата.


Конфигурация Nginx для работы с обоими сертификатами

Основной подход – использование разных портов для разных типов сертификатов. Конфигурация будет включать несколько серверных блоков:

nginx
# Серверный блок для Let's Encrypt (стандартный HTTPS)
server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;
    
    # Конфигурация Let's Encrypt SSL
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
    
    # Перенаправление HTTP на HTTPS
    return 301 https://$host$request_uri;
}

# Серверный блок для Минцифры (HTTPS на отдельном порту)
server {
    listen 8443 ssl;
    server_name yourdomain.com;
    
    # Конфигурация Минцифры SSL
    ssl_certificate /etc/nginx/ssl/mincifry/mincifry.crt;
    ssl_certificate_key /etc/nginx/ssl/mincifry/mincifry.key;
    
    # Если есть корневые сертификаты
    ssl_trusted_certificate /etc/nginx/ssl/mincifry/ca.crt;
    
    # Ваши настройки местоположений и проксирования
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Базовый HTTP сервер для перенаправления
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    
    # Перенаправление на HTTPS Let's Encrypt
    return 301 https://$host$request_uri;
}

Для работы с несколькими доменами на одном сервере, как описано в Liquid Web, можно использовать директиву server_name с регулярными выражениями для обработки разных доменов.


Автоматическое обновление сертификатов

Для Let’s Encrypt настройте автоматическое обновление:

bash
# Добавление cron‑задачи для автоматического обновления
sudo crontab -e

Добавьте строку:

bash
0 3 * * * /usr/bin/certbot renew --quiet --nginx && /bin/systemctl reload nginx

Как отмечает DigitalOcean, Let’s Encrypt сертификаты действительны 90 дней, поэтому регулярное обновление обязательно.


Проверка и тестирование конфигурации

После внесения изменений необходимо проверить конфигурацию:

bash
# Проверка синтаксиса конфигурации
sudo nginx -t

# Перезагрузка Nginx
sudo systemctl reload nginx

Для проверки SSL‑сертификатов можно использовать:

bash
# Проверка сертификата Let's Encrypt
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com

# Проверка сертификата Минцифры
openssl s_client -connect yourdomain.com:8443 -servername yourdomain.com

Как рекомендует winitpro.ru, всегда следует проверять конфигурацию nginx перед применением изменений.


Оптимизация безопасности

Для усиления безопасности SSL‑конфигурации добавьте следующие параметры:

nginx
# Общие настройки SSL для всех серверов
ssl_session_cache shared:SSL:128m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;

# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# SSL stapling для Let's Encrypt
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Согласно Server Fault, правильная настройка SSL stapling значительно улучшает производительность и безопасность соединений.


Источники

  1. Brokenco - Multiple Let’s Encrypt domains in a single Nginx server block
  2. Timeweb - Установка SSL‑сертификата на Nginx
  3. Reg.ru - Как настроить SSL‑сертификат на Nginx
  4. Liquid Web - Nginx Multiple Certificates
  5. DigitalOcean - Защита Nginx с помощью Let’s Encrypt в Ubuntu 20.04
  6. winitpro.ru - Настройка SSL сертификата Let’s Encrypt для Nginx
  7. Server Fault - Nginx, with multiple forwarded domains and a letsencrypt certificate

Заключение

  1. Основной подход – использование разных портов для обслуживания различных SSL‑сертификатов (443 для Let’s Encrypt, 8443 для Минцифры).
  2. Правильная организация файлов – сертификаты должны быть размещены в соответствующих директориях с правильными правами доступа.
  3. Автоматическое обновление – настройте cron‑задачи для регулярного обновления Let’s Encrypt сертификатов.
  4. Безопасность – реализуйте SSL stapling, HSTS и другие улучшения безопасности.
  5. Тестирование – регулярно проверяйте конфигурацию и работу обоих сертификатов.

При такой настройке ваш сайт будет обслуживаться одновременно с двумя SSL‑сертификатами без необходимости создания поддоменов, что полностью соответствует требованиям Минцифры при сохранении функциональности Let’s Encrypt.

Авторы
Проверено модерацией
Модерация