Настройка SSL/TLS (https) в Nginx
Ubuntu 22.04
nginx/1.18.0
Чтобы защитить передаваемый трафик между клиентом и сервером - применяется протокол HTTPS, который использует механизмы SSL/TLS шифрования.
Так как Nginx часто выступает в роли фронтенда, то и шифрование возлагается на него (так называемый ssl offloading).
И конечно, прежде всего, нужны будут сертификаты.
Сертификаты
Для настройки Nginx'a понадобятся:
- файл сертификат, это текстовый файл с расширением .crt или .pem
- файл приватного ключа, это текстовый файл с расширением .key
Файл сертификата содержит в себе один или несколько сертификатов (так называемые intermediate certificate).
Тело сертификата заключено между тегами BEGIN CERTIFICATE и END CERTIFICATE:
.crt
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
Файл приватного ключа содержит в себе только один приватный ключ от вашего основного сертификата.
Тело ключа заключено между тегами BEGIN RSA PRIVATE KEY и END RSA PRIVATE KEY:
.key
-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
Где взять сертификат
- Сертификат можно приобрести, найти в Google по запросу «купить ssl сертификат», такой вариант подойдет для серьёзного проекта.
- Сертификат можно получить бесплатно, есть несколько популярных сервисов позволяющих получить бесплатный сертификат. См. Настройка сертификатов от Let’s Encrypt.
- Сертификат можно сделать самому, так называемый самоподписанный сертификат.
Самоподписанный сертификат
Этот вариант хорош в качестве обучающего примера.
При заходе на сайт с таким сертификатом - браузеры будут ругаться,
что соединение не безопасно и мошенники пытаются украсть ваши данные,
но на то он и самоподписанный, что только вы сами и можете ему доверять.
Самоподписанные сертификаты широко используются во внутренней инфраструктуре.
Создадим папку где будем генерировать сертификаты:
mkdir ~/certs cd ~/certs chmod 700 ~/certs
Создадим корневой сертификат:
openssl req -new -newkey rsa:2048 -x509 -nodes -days 9999 \ -subj /CN=rootCa/O=Test/C=RU/ \ -keyout rootCa.key -out rootCa.crt # Посмотреть содержимое openssl x509 -noout -text -in rootCa.crt
Корневой сертификат rootCa.crt - это специальный сертификат, которым будут подписываться другие сертификаты.
Корневые сертификаты от известных центров сертификации (CA), таких как Comodo, Geotrust, Symantec, Thawte, Trustwave
и т.п. уже установлены во всех популярных браузерах, поэтому браузеры доверяют их сертификатам.
Создадим приватный ключ для сертификата:
openssl genrsa -out site.key 2048
Приватный или закрытый ключ (private key) - если по простому, то это ключ к использованию сертификата.
Ключ должен присутствовать только на web-cервере и никому более этот файл не должен передаваться.
Заполучив этот ключ, злоумышленник сможет расшифровывать трафик, а так же использовать ваш сертификат.
Создадим запрос на выдачу сертификата для домена example.domain.com:
openssl req -new \ -subj /CN=example.domain.com/O=Test/C=RU/ \ -key site.key -out site.csr # Посмотреть содержимое openssl req -noout -text -in site.csr
Запрос на выпуск сертификата (Certificate Signing Request) - это файл, в котором есть вся необходимая информация для выпуска сертификата.
Создадим сертификат:
openssl x509 -req -days 365 \ -CA rootCa.crt -CAkey rootCa.key -CAcreateserial \ -in site.csr -out site.pem # Посмотреть содержимое openssl x509 -noout -text -in site.pem
Настройка Nginx
Создадим папку где будут храниться сертификаты:
sudo mkdir /etc/nginx/ssl sudo chown root:root /etc/nginx/ssl sudo chmod 700 /etc/nginx/ssl
Скопировать в эту папку сертификат и приватный ключ, установить права:
sudo cp ~/certs/site.pem /etc/nginx/ssl/ sudo cp ~/certs/site.key /etc/nginx/ssl/ sudo chown root:root /etc/nginx/ssl/site.pem sudo chown root:root /etc/nginx/ssl/site.key sudo chmod 644 /etc/nginx/ssl/site.pem sudo chmod 600 /etc/nginx/ssl/site.key
Пример конфигурации:
/etc/nginx/sites-enabled/example
server { listen *:80; listen *:443 ssl; server_name example.domain.com; root /var/www/html; index index.html index.htm index.nginx-debian.html; ### ssl ssl_certificate /etc/nginx/ssl/site.pem; ssl_certificate_key /etc/nginx/ssl/site.key; ### security ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # CVE-2014-3566 (POODLE), disable SSLv3 ssl_prefer_server_ciphers on; # CVE-2011-3389 (BEAST) ssl_ciphers HIGH:!aNULL:!eNULL:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA; location / { # принудительный переход клиента на https if ($scheme != "https") { return 301 https://$host$request_uri; } } }
Проверка конфигурации и перезагрузка:
sudo nginx -t && sudo systemctl reload nginx
Всё готово, проверить через браузер или командой:
curl -ik https://example.domain.com/
Опции создания SSL-сертификата
Разберем некоторые опции, которые использовались в команде openssl:
- -newkey rsa:2048 - указывается длинна ключа
- -days 365 - сколько дней будет действителен сертификат
- -subj - атрибуты или Subject сертификата
Имя | Полное имя | Описание | Обязательный параметр |
---|---|---|---|
CN | Common Name | Имя сертификата, доменное имя сайта | да |
C | Country | Двухсимвольный код страны | нет |
ST | State or Province Name | Название региона/области/края/республики | нет |
L | Locality Name | Название города/поселка | нет |
O | Organization Name | Название организации | нет |
OU | Organization Unit | Название отдела | нет |
emailAddress | E-mail address | Почтовый адрес | нет |
Обсуждение