Встановлення самопідписаного SSL-сертифіката на Nginx

Поширте інформацію:

TLS (Transport Security Layer) і його попередник SSL (Secure Socket Layer) — це веб-протоколи, що використовуються як обгортка для трафіку, що забезпечує його шифрування і захист.

Ця технологія надає такі можливості.

  1. Трафік пересилається між сервером і клієнтом безпечно, з низькою імовірністю перехоплення і прочитання повідомлень сторонніми учасниками.

  2. Система сертифікатів також дає користувачам впевненість, з яким саме сервером вони з’єднуються.

Протоколи використовують асиметричні алгоритми шифрування, тобто криптосистеми з відкритим ключем. Публічні (відкриті) ключі в цих протоколах називаються сертифікатами, під словом “ключ” розуміється приватний (закритий) ключ, якщо не сказано іншого.

Розглянемо, як встановити так званий самопідписаний сертифікат для використання з веб-сервером nginx. Самопідписані сертифікати не можуть підтвердити користувачеві справжність сервера, тобто надають лише першу можливість з повищого переліку. Для реалізації другої можливості необхідні ключ та сертифікат, випущені всесвітньо відомими центрами сертифікації.

Вважаємо, що веб-сервер nginx вже встановлений і налаштований.

1. Створюємо SSL-сертифікат.

Для створення сертифікатів використовується бібліотека OpenSSL.

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

Пояснення другої команди

  • openssl – це базовий інструмент командного рядка для створення OpenSSL сертифікатів, ключів, інших файлів та керування ними

  • req – ця підкоманда вказує, що ми хочемо використовувати запит на підпис сертифікату (certificate signing request – CRS) стандарту X.509. X.509 – це стандарт для відкритого ключа, якого дотримуються SSL і TLS для керування своїми ключами та сертифікатами. Ми хочемо створити новий сертифікат X.509, тому вказуємо цю підкоманду

  • -x509 – це модифікатор попередньої підкоманди, який вказує програмі, що ми хочемо створити самопідписаний сертифікат, замість того, шоб згенерувати запит на підпис сертифікату, як робиться зазвичай

  • -nodes – вказуємо OpenSSL пропустити захист сертифіката за допомогою ключової фрази (пароля). Ми хочемо, щоб Nginx міг читати наш файл при запуску сервера без втручання користувача. Захист ключовою фразою перешкоджатиме цьому, оскільки щоразу буде вимагати введення ключової фрази в інтерактивному режимі

  • -days 365 – встановлюємо термін дії сертифікату 365 днів

  • -newkey rsa:2048 – вказуємо, що ми хочемо згенерувати новий сертифікат одночасно з новим ключем. Ми не створили ключ, необхідний для підпису сертифіката, попередньо, тому мусимо створити його разом зі сертифікатом. Частина rsa:2048 вказує створити ключ за алгоритмом RSA довжиною 2048 біт

  • -keyout – вказує, в якому файлі ми хочемо записати ключ (повний шлях)

  • -out – вказує, де ми хочемо розмістити сертифікат (повний шлях)

Отже, ця команда створить обидва файли – ключ і сертифікат. Програма виведе кілька запитань про наш сервер, на які треба буде відповісти. Найважливіший рядок – це Common Name (e.g. server FQDN or YOUR name). Там треба написати доменне ім’я нашого сайту. Якщо ви не маєте домена, можете натомість написати IP-адресу.

Діалог виглядає приблизно так:

Country Name (2 letter code) [AU]:UA
State or Province Name (full name) [Some-State]:Kyiv
Locality Name (eg, city) []:Kyiv City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Happy Coders, Inc.
Organizational Unit Name (eg, section) []:Sales Department
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:admin@your_domain.com

Обидва файли будуть збережені у каталозі /etc/nginx/ssl

2. Налаштування Nginx для використання SSL

Тепер треба змінити налаштування сервера в конфігураційних файлах nginx, щоб задіяти сертифікат. Нехай блок конфігурації сервера виглядає таким чином:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name your_domain.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Щоб дозволити шифроване з’єднання з сайтом, потрібно додати 3 рядки: вказати слухати 443 порт і прописати шлях до сертифіката і шлях до ключа:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        listen 443 ssl;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name your_domain.com;

        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location / {
                try_files $uri $uri/ =404;
        }
}

Зберігаємо конфігураційний файл, наказуємо nginx оновити конфігурацію:

$ sudo kill -HUP $( cat /var/run/nginx.pid )

Не забуваємо дозволити з’єднання на 443 порт в iptables

$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

3. Перевіряємо

Набравши в адресному рядку браузера адресу сайту з протоколом https

https://your_domain.com

Бачимо приблизно таке попередження:

nginx_ssl_warning

Клацнувши “Все одно перейти” і підтвердивши виняток для сайту, можемо користуватися шифрованим з’єднанням:

ssl_info

Як бачимо, браузер не може підтвердити ідентичність сервера, оскільки сертифікат недовірений. Проте з’єднання з сервером шифрується, тобто ми досягли мети.

4. Висновок

Ми налаштували сервер Nginx так, що він може приймати як HTTP так і HTTPS запити. Це допомагає з’єднуватися з сервером безпечно, сильно зменшивши ризик перехоплення наших даних сторонніми особами.

Проте, якщо ви плануєте використовувати SSL-сертифікат для сайту в публічному досвіді, вам необхідний сертифікат, випущений довіреними центрами сертифікації. Такий сертифікат можна придбати, а можна отримати безоплатно, про що я розповім у наступній статті.

Написано на основі матеріалу з Digital Ocean.

Один коментар до “Встановлення самопідписаного SSL-сертифіката на Nginx

  1. Сповіщення: Як отримати справжній SSL-сертифікат для свого сайту безкоштовно – Нотатки PHP розробника

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.