[[ Настройка SSL/TLS (https) в Nginx ]]

Nginx

Настройка 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 сертификат», такой вариант подойдет для серьёзного проекта.
  • Сертификат можно сделать самому, так называемый самоподписанный сертификат.


Самоподписанный сертификат

Этот вариант хорош в качестве обучающего примера.
При заходе на сайт с таким сертификатом - браузеры будут ругаться,
что соединение не безопасно и мошенники пытаются украсть ваши данные,
но на то он и самоподписанный, что только вы сами и можете ему доверять.

Самоподписанные сертификаты широко используются во внутренней инфраструктуре.

Создадим папку где будем генерировать сертификаты:

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 Почтовый адрес нет






Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
236​ +0 =
 
howto/nginx/nginx_ssl.txt · Последнее изменение: 2024/03/17 15:40 — lexa
Gentoo Linux Gentoo Linux Driven by DokuWiki