Настройка Nginx на порту 443 с самоподписанным SSL-сертификатом
Когда сервер работает по HTTP (порт 80), данные передаются незашифрованными, что делает их уязвимыми. HTTPS (порт 443) использует SSL/TLS для шифрования соединения, повышая безопасность.
Самоподписанный сертификат удобен в тестовых средах или для внутренних сервисов, когда нет необходимости в сертификате от центра сертификации (CA).
Если Nginx установлен, но сайт не открывается по HTTPS, вероятно, сервер не настроен на работу с SSL. В таких случаях нужно сгенерировать сертификат и обновить конфигурацию Nginx.
Генерация самоподписанного SSL-сертификата
Выполните команду для создания ключа и сертификата:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Параметры команды:
- -x509 — создание самоподписанного сертификата
- -nodes — приватный ключ не будет зашифрован (Nginx не потребует пароль при каждом запуске)
- -days 365 — срок действия сертификата (1 год)
- -newkey rsa:2048 — генерация нового RSA-ключа (2048 бит)
- -keyout — путь к приватному ключу
- -out — путь к сертификату
Во время выполнения команды OpenSSL запросит у вас несколько параметров:
- Country Name (2-letter code) — двухбуквенный код страны ISO 3166-1 alpha-2 (например, RU)
- Common Name (e.g., server FQDN or YOUR name) — доменное имя сервера (если нет домена, можно указать IP)
Если вам нужен файл с DH-параметрами, создайте его командой
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Настройка Nginx для работы с SSL
Открываем конфигурацию сайта (обычно /etc/nginx/sites-available/default
):
sudo nano /etc/nginx/sites-available/default
Добавляем или редактируем блоки:
server {
listen 443 ssl;
server_name your_domain_or_ip;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
location / {
root /var/www/html;
index index.html;
}
}
server {
listen 80;
server_name your_domain_or_ip;
return 301 https://$host$request_uri;
}
Что делают эти настройки:
- Сервер на порту 443 использует SSL и загружает сертификат
- Сервер на порту 80 автоматически перенаправляет HTTP-запросы на HTTPS
Сохраняем изменения и проверяем конфигурацию:
sudo nginx -t
Если ошибок нет, перезапускаем Nginx:
sudo systemctl restart nginx
Проверка работы HTTPS
Откройте браузер и перейдите по адресу https://{ваш_домен_или_IP}. Если все настроено правильно, сайт загрузится. Браузер может предупредить, что сертификат недоверенный — это нормально для самоподписанных сертификатов.
Если сайт не открывается:
- Проверьте конфигурацию Nginx (
sudo nginx -t
) - Убедитесь, что порт 443 открыт (
sudo netstat -tulnp | grep nginx
) - Перезапустите Nginx (
sudo systemctl restart nginx
)
Теперь ваш сервер поддерживает HTTPS. Если вам нужен сертификат без предупреждений в браузере, используйте бесплатные сертификаты от Let's Encrypt.