Самоподписанный сертификат для Nginx
-
Подробная инструкция по добавлению универсального самоподписанного сертификата в 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/sslmkdir -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.keychmod 600: только владелец (root) может читать/писать.
Шаг 4: Настройка конфигурации Nginx
Добавьте ссылки на сертификат в конфигурационный файл Nginx. Это можно сделать глобально (для всех серверов) или в конкретном server-блоке.
-
Откройте или создайте конфиг-файл (например,
/etc/nginx/conf.d/ssl.confдля глобальной настройки или в/etc/nginx/sites-available/defaultдля конкретного сайта). -
Добавьте следующие строки вне 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.
- Nginx установлен и настроен (проверьте: