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

Самоподписанный (self-signed) сертификат — это простой и эффективный способ обеспечить HTTPS-соединение для вашего сервера Nginx, особенно в случаях, когда вы работаете без доменного имени (например, по IP-адресу), для внутренних сетей, тестирования или личного использования. Он не требует внешних удостоверяющих центров (CA), но браузеры покажут предупреждение о небезопасности, поскольку сертификат не проверен доверенным CA. Шифрование при этом работает полноценно.

Эта инструкция основана на стандартных практиках и подходит для большинства дистрибутивов Linux (например, Ubuntu/Debian, CentOS). Предполагается, что Nginx уже установлен и работает. Все команды выполняются с правами root (используйте sudo).

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

  • Nginx установлен и настроен (проверьте: nginx -v).
  • Доступ к серверу по SSH или консоли.
  • Если у вас несколько серверов или контейнеров (например, с Webmin), сертификат Nginx будет независим от их собственных сертификатов. Nginx будет обрабатывать SSL на внешнем уровне, а внутренний трафик может идти по HTTP.
  • Для доступа по IP: укажите внешний IP в поле Common Name (CN) при генерации, чтобы минимизировать предупреждения в браузере.
  • Если у вас домен, рассмотрите бесплатный сертификат от Let's Encrypt вместо self-signed (но это выходит за рамки инструкции).

Шаг 1: Создание директории для сертификатов

Создайте защищенную директорию для хранения сертификата и ключа. Это стандартное место для Nginx.

sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
  • mkdir -p: создает директорию, если она не существует.
  • chmod 700: обеспечивает доступ только владельцу (root), для безопасности.

Шаг 2: Генерация самоподписанного сертификата

Используйте утилиту openssl (обычно предустановлена; проверьте: openssl version). Это создаст ключ и сертификат в одном шаге.

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/selfsigned.key \
    -out /etc/nginx/ssl/selfsigned.crt
  • Параметры объяснения:
    • req -x509: создает самоподписанный сертификат.
    • -nodes: не шифрует ключ паролем (упрощает использование в Nginx).
    • -days 3650: срок действия 10 лет (можно изменить, например, на 365 для 1 года).
    • -newkey rsa:2048: генерирует новый RSA-ключ длиной 2048 бит (рекомендуемая длина для безопасности).
    • -keyout: путь к приватному ключу.
    • -out: путь к сертификату.

Во время выполнения вас спросят интерактивные вопросы (Subject fields):

  • Country Name (2 letter code): Например, RU (можно пропустить, нажав Enter).
  • State or Province Name: Например, Moscow.
  • Locality Name: Например, Moscow.
  • Organization Name: Например, My Company.
  • Organizational Unit Name: Например, IT.
  • Common Name (CN): Важно! Укажите ваш внешний IP-адрес (например, 203.0.113.50) или домен, если есть. Это должно совпадать с адресом, по которому доступен сервер, чтобы браузер не выдавал дополнительное предупреждение о несоответствии.
  • Email Address: Опционально.

Если нужно сгенерировать сертификат без вопросов (для автоматизации), добавьте -subj "/CN=your.ip.address".

Шаг 3: Установка прав доступа

Приватный ключ должен быть защищен, чтобы избежать утечек.

sudo chmod 600 /etc/nginx/ssl/selfsigned.key
  • chmod 600: только владелец (root) может читать/писать.

Шаг 4: Настройка конфигурации Nginx

Добавьте ссылки на сертификат в конфигурационный файл Nginx. Это можно сделать глобально (для всех серверов) или в конкретном server-блоке.

  1. Откройте или создайте конфиг-файл (например, /etc/nginx/conf.d/ssl.conf для глобальной настройки или в /etc/nginx/sites-available/default для конкретного сайта).

  2. Добавьте следующие строки вне server-блоков (для глобального использования) или внутри server-блока:

ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
  • Если сертификат для нескольких портов или серверов: используйте один сертификат для всех (универсальный подход).
  • В server-блоке добавьте listen с SSL:
server {
    listen 443 ssl;  # Или ваш порт, например 8443 ssl;
    server_name your.ip.address;  # Или _ для wildcard

    # Другие настройки, например location / { ... }

    ssl_certificate /etc/nginx/ssl/selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
}
  • Если вы проксируете трафик (например, на контейнеры с Webmin): используйте proxy_pass http://internal-ip:port; внутри location. SSL терминируется на Nginx, внутренний трафик — HTTP (безопасно в локальной сети).

Важно: Создайте сертификат до добавления этих строк, иначе Nginx выдаст ошибку при проверке.

Шаг 5: Проверка и перезагрузка Nginx

Проверьте конфигурацию на ошибки:

sudo nginx -t
  • Если ошибка "cannot load certificate": проверьте пути к файлам или создайте сертификат заново.

Перезагрузите Nginx:

sudo systemctl reload nginx
  • Или sudo nginx -s reload (если не используете systemd).

Шаг 6: Тестирование в браузере

  • Откройте https://your.ip.address:port (например, https://203.0.113.50:8443).
  • Браузер покажет предупреждение: "Соединение не защищено" (NET::ERR_CERT_AUTHORITY_INVALID).
    • Нажмите "Дополнительно" > "Перейти на сайт" (или аналог в вашем браузере).
    • Для постоянного доступа: добавьте исключение в настройках браузера (в Chrome: Settings > Privacy and security > Manage certificates > Import ваш .crt файл).
  • Если доступ по домену: предупреждение будет слабее, если CN совпадает.
  • Проверьте SSL: используйте curl -v https://your.ip.address:port или онлайн-инструменты вроде SSL Labs (но для self-signed тест покажет A-рейтинг с предупреждением о доверии).

Возможные проблемы и решения

  • Конфликт с другими сертификатами: Не возникает, если они в разных сервисах (например, Webmin использует свой miniserv.pem). Nginx обрабатывает свой сертификат независимо.
  • Предупреждение в браузере не уходит: Нормально для self-signed. Для полного устранения — получите доверенный сертификат (Let's Encrypt для доменов; для IP — ограниченная поддержка с коротким сроком).
  • Nginx не стартует: Проверьте логи (sudo journalctl -u nginx или /var/log/nginx/error.log). Ошибки часто в путях или правах.
  • Доступ по нескольким портам: Один сертификат работает для всех listen с ssl.
  • Обновление сертификата: Когда истечет срок, повторите Шаг 2–5.
  • Безопасность: Self-signed подходит для внутренних/личных сценариев. Для публичного доступа используйте Let's Encrypt.

Эта инструкция делает настройку универсальной: один сертификат для всего Nginx.