Създаване на SSL Сертификат за Nginx в Ubuntu 20.04

Всичко за дистрибуциите и ядрото.
Аватар
Nikolay
Site Admin
Мнения: 22
Регистриран на: Пон Май 03, 2021 3:34 pm

Създаване на SSL Сертификат за Nginx в Ubuntu 20.04

Мнение от Nikolay »

Тук няма да навлизам в подробности както в темата Създаване на SSL Сертификат за Apache в Ubuntu 20.04, защото повечето неща са сходни.

Създаваме двойка самоподписани ключове и сертификати с OpenSSL с една команда:

Код: Избери целия код

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Докато използваме OpenSSL, трябва да създадем и силна група Diffie-Hellman, която се използва при договаряне на Perfect Forward Secrecy с клиенти.
Можем да направим това, като напишем:

Код: Избери целия код

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Това ще отнеме известно време, но когато приключи, ще имате силна DH група, /etc/nginx/dhparam.pem, която можем да използваме в нашата конфигурация.

Създадохме нашите файлове с ключове и сертификати в /etc/ssl директорията. Сега просто трябва да модифицираме нашата конфигурация на Nginx, за да се възползваме от тях.

Ще направим няколко корекции в нашата конфигурация.
  1. Ще създадем конфигурационен фрагмент, съдържащ нашите SSL ключове и местоположения на сертификат.
  2. Ще създадем конфигурационен фрагмент, съдържащ силни SSL настройки, които могат да се използват с всякакви сертификати в бъдеще.
  3. Ще коригираме нашите сървърни блокове Nginx за обработка на SSL заявки и ще използваме двата фрагмента по-горе.
Този метод за конфигуриране на Nginx ще ни позволи да поддържаме чисти сървърни блокове и да поставяме общи конфигурационни сегменти в модули за многократна употреба.

Първо, нека създадем нов файл за конфигурация на Nginx в /etc/nginx/snippets директорията.

За да разграничим правилно целта на този файл, нека го наречем self-signed.conf:

Код: Избери целия код

sudo nano /etc/nginx/snippets/self-signed.conf
Трябва да зададем ssl_certificate директивата на нашия файл със сертификат и ssl_certificate_key на свързания ключ. В нашия случай това ще изглежда така:
/etc/nginx/snippets/self-signed.conf

Код: Избери целия код

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Когато добавите тези редове, запазете и затворете файла.

След това ще създадем друг файл, който ще определи някои SSL настройки. Това ще настрои Nginx със силен набор от SSL шифри и ще позволи някои разширени функции, които ще помогнат да запазим сигурността на нашия сървър.

Код: Избери целия код

sudo nano /etc/nginx/snippets/ssl-params.conf
Копирайте следното във вашия ssl-params.conf файл:
/etc/nginx/snippets/ssl-params.conf

Код: Избери целия код

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx = 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx = 1.5.9
ssl_stapling on; # Requires nginx = 1.3.7
ssl_stapling_verify on; # Requires nginx = 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
Запазете и затворете файла, когато приключите.

Ще приемем, че използвате потребителски конфигурационен файл на сървърния блок в /etc/nginx/sites-available директорията. Ще използваме /etc/nginx/sites-available/example.com за този пример. Заменете името на конфигурационния файл, ако е необходимо.
Преди да продължим по-нататък, нека архивираме текущия си конфигурационен файл:

Код: Избери целия код

sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak
Сега отворете конфигурационния файл, за да направите корекции:

Код: Избери целия код

sudo nano /etc/nginx/sites-available/example.com
Вътре вашият сървърен блок вероятно започва подобно на това:

Код: Избери целия код

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm index.nginx-debian.html;

    . . .
}
Ще модифицираме този съществуващ сървърен блок, за да обслужва SSL трафик на порт 443, след което ще създадем нов сървърен блок, който да отговаря на порт 80 и автоматично да пренасочваме трафика към порт 443.
Забележка: Ще използваме пренасочване 302, докато не се уверим, че всичко работи правилно. След това можем да променим това на постоянно 301 пренасочване.
/etc/nginx/sites-available/example.com

Код: Избери целия код

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm index.nginx-debian.html;

    . . .
}
След това поставете втори сървърен блок в конфигурационния файл след затварящата скоба ( }) на първия блок:

Код: Избери целия код

. . .
server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    return 302 https://$server_name$request_uri;
}
Запазете и затворете файла, когато приключите с редактирането му.

След като направихме промените можем да рестартираме Nginx, за да приложим новите си промени.

Код: Избери целия код

sudo nginx -t
Ако всичко е успешно, ще получите резултат, който изглежда така:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Забележете предупреждението в началото. Tази конкретна настройка извежда предупреждение, тъй като нашият самоподписан сертификат не може да използва SSL прикачване. Това се очаква и нашият сървър все още може да криптира коректно връзките.
Ако изходът ви съвпада с горното, вашият конфигурационен файл няма синтаксисни грешки. Можем безопасно да рестартираме Nginx, за да приложим промените си:

Код: Избери целия код

sudo systemctl restart nginx
Сега сме готови да тестваме нашия SSL сървър.

Отворете уеб браузъра си и въведете, https:// последвано от името на домейна или IP адреса на вашия сървър в адресната лента:
https://server_domain_or_IP
Тъй като създаденият от нас сертификат не е подписан от някой от надеждните сертифициращи органи на вашия браузър, вероятно ще видите страшно изглеждащо предупреждение.
Това е очаквано и нормално. Ние се интересуваме само от аспекта на криптиране на нашия сертификат, а не от проверката на автентичността на хоста от третата страна. Щракнете върху "ADVANCED“ и след това върху предоставената връзка, за да продължите към вашия хост така или иначе.
Трябва да бъдете отведени до вашия сайт. Ако погледнете в адресната лента на браузъра, ще видите ключалка с „/“ над нея. В този случай това просто означава, че сертификатът не може да бъде валидиран. Вашата връзка, обаче вече е криптирана.

Ако сте конфигурирали Nginx с два сървърни блока, като автоматично пренасочвате HTTP съдържание към HTTPS, можете също да проверите дали пренасочването функционира правилно.

Вече сте конфигурирали вашия Nginx сървър да използва силно криптиране за клиентски връзки. Това ще ви позволи да обслужвате заявките сигурно и ще попречи на външни страни да четат трафика ви.
Публикувай отговор