Стаття також доступна російською (перейти до перегляду).

Вступ
- Передумови та підготовчі дії
- Формування структури каталогів та файлів
- Створення самопідписаного сертифікату
- Налаштування Nginx
- Створення користувацького сертифікату
- Створення сертифікату P12
- Налаштування браузера
- Видалення та відкликання сертифікатів
Доволі часто виникає потреба у встановленні обмеженого доступу користувачам до тих чи інших сторінок веб-ресурсу, що обумовлено питаннями безпеки при роботі із конфіденційною інформацією. Це можна вирішити шляхом налаштування авторизації посередництвом SSL/TLS сертифікатів на рівні веб-серверу. Такий підхід є дуже зручним для взаємодії з API . Продемонструємо працездатність вказаного підходу на практиці.
Передумови та підготовчі дії
Для реалізації вказаного підходу буде задіяний веб-сервер Nginx, ОС Ubuntu 22.04 та можливості центру сертифікації Let’s Encrypt, котрий надає для шифрування даних безкоштовні криптографічні сертифікати типу X.509. Пакет із плагінами налаштування та отримання сертифікатів Let’s Encrypt включений до офіційного репозиторію дистрибутиву Debian, що надає широкі можливості для його застосування у Linux-подібних системах.
Слід зазначити, що вказаний сервіс у своїй роботі застосовує кілька методів шифрування даних, котрі відрізняються між собою складністю та ступенем надійності. Як відомо, надійність шифрування N підвищується пропорційно експоненті:
N = 2x ,
де х – кількість бітів, котрим кодуються ключі.
Найменш надійним є RSA-метод. Найбільш надійними є методи шифрування, котрі засновані на еліптичних кривих, зокрема, це secp384r1. У цьому випадку ключ буде мати довжину у 384 біти, що співвідноситься із довжиною у 7680 біт при використанні методу RSA. Тобто, принципово за допомогою RSA можна отримати такий саме захист, як і при використанні методу еліптичних кривих, однак, за рахунок значного збільшення кількості кодуючих бітів. В результаті, при практичному використанні такого каналу неминучі затримки у передачі даних на рівні девайсів та інші «побічні ефекти». Саме тому для налаштування авторизації посередництвом SSL/TLS сертифікатів ми рекомендуємо застосовувати методи secp384r1 або secp512r1. У нашому випадку буде використаний метод secp384r1.
Перевіримо наявність та версії програмних компонентів, встановлених у нашій системі. Насамперед, перевіримо сервіс OpenSSL. Для цього наберемо в терміналі:
$ openssl version -a

Отже, встановлена версія OpenSSL 3.0.2, що нас цілком влаштовує.
Перевіримо статус служби веб-серверу Nginx:
$ systemctl status nginx

Як бачимо, сервер запущено, значить можна працювати.
Переглянемо наявні каталоги та файли у системі веб-серверу, це нам знадобиться у подальшому при внесенні змін у конфігураційні файли:
$ ls /etc/nginx/

Формування структури каталогів та файлів
Створимо структуру каталогів, у котрій будуть зберігатися конфігураційні файли, ключі та сертифікати:
$ mkdir /etc/nginx/site.ua $ cd /etc/nginx/site.ua
Де site.ua – директорія для нашого веб-ресурсу. Створимо в ній набір каталогів для зберігання сертифікатів різного призначення:

$ mkdir usr_certs $ mkdir certs $ mkdir new_certs

Створимо набір конфігураційних файлів:
$ touch index.txt $ touch main.conf $ touch ser_nom

Внесемо до файлу ser_nom початковий номер сертифікату, з котрого почнеться автоматичний відлік номерів для інших сертифікатів:
$ echo "01" > ser_nom

Обмежимо доступ до каталогу site.ua таким чином, щоб тільки його власник міг читати, записувати та запускати на виконання файли, котрі в ньому містяться:
$ chmod 700 ./

Створення самопідписаного сертифікату
Створимо свій довірений сертифікат на базі алгоритму шифрування типу еліптичні криві. Для цього спочатку відправимо запит на генерування ключа для нього із назвою main:
$ openssl ecparam -out /etc/nginx/site.ua/certs/main.key -name secp384r1 -genkey
Де secp384r1 – назва методу шифрування ключа (еліптичні криві).

Тепер сформуємо запит на створення нового сертифікату із назвою main.crt:
$ openssl req -new -x509 -days 500 -sha512 -key /etc/nginx/site.ua/certs/main.key -subj /O=Ukraine/emailAddress=alexandr7500g@gmail.com -out /etc/nginx/site.ua/certs/main.crt
Тут опція x509 – вказує на створення самопідписаного сертифікату; опція days встановлює строк його дії (500 днів); параметр O – фіксує назву нашої компанії (Ukraine); emailAddress – пошта компанії; out – вказівка на місце, де буде створений файл сертифікату.

Переконаємося в тому, що ключ та сертифікат були створені. Для цього наберемо в терміналі:
$ ls certs

Так, файли із назвами main.key та main.crt знаходяться на своєму місті.
Налаштування Nginx
Додамо до файлу налаштувань серверу Nginx для нашого сайту, значення декотрих важливих параметрів, стосовно верифікації агентів. Для цього викличемо редактор nano:
$ nano ../sites-enabled/site.ua
Вставимо до файлу наступні параметри із відповідними значеннями:
ssl_client_certificate – шлях до місцезнаходження головного сертифікату;
ssl_verify_client – дозвіл на верифікацію клієнта;
keepalive_timeout – максимальний допустимий час (с) для встановлення з'єднання.

Для можливості автоматичного створення сертифікатів додамо необхідні параметри із відповідними значеннями до створеного нами раніше головного конфігураційного файлу main.conf. Для цього наберемо у терміналі:
$ nano main.conf
Додаємо у файл наступні рядки:
[ ca ]
default_ca = CA_CLIENT
[ CA_CLIENT ]
dir = /etc/nginx/site.ua/
certs = /etc/nginx/site.ua/certs
new_certs_dir = /etc/nginx/site.ua/new_certs
database = $dir/index.txt
serial = $dir/ser_nom
certificate = $dir/certs/main.crt
private_key = $dir/certs/main.key
default_days = 365
default_crl_days = 5
default_md = md5
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = supplied
commonName = supplied
emailAddress = supplied

Збережемо внесені зміни та вийдемо з редактору (ctrl+X).
Створення користувацького сертифікату
Для того, щоб певний користувач міг мати доступ до визначених сторінок нашого сайту, для нього повинен бути зареєстрований у системі закритий ключ, а також створені CSR та CRT сертифікати.
Спочатку створимо закритий ключ за допомогою відповідної команди:
$ openssl ecparam -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key -name secp384r1 -genkey

Тепер сформуємо запит на створення CSR сертифікату. Для цього введемо у терміналі:
$ openssl req -new -key /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key -subj /C=UA/ST=Kievregion/L=Kiev/OU=Alexander/CN=FreeHost/emailAddress=alexandr7500@meta.ua -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.csr

Переконаємося, що ключ та сертифікат були створені:
$ ls /etc/nginx/site.ua/usr_certs

Так воно і є – файли із іменами alexandr7500@meta.ua.key та alexandr7500@meta.ua.csr наявні у директорії usr_certs.
Тепер залишається створити користувацький CRT сертифікат за допомогою наступного запиту:
$ openssl ca -config /etc/nginx/site.ua/main.conf -in /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.csr -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.crt -batch

Отже, сертифікат було успішно створено.
Таким чином, системою були зареєстровані наступні значення параметрів користувача:
countryName :PRINTABLE:'UA' stateOrProvinceName :ASN.1 12:'Kievregion' localityName :ASN.1 12:'Kiev' organizationalUnitName :ASN.1 12:'Alexander' commonName :ASN.1 12:'FreeHost' emailAddress :IA5STRING:'alexandr7500@meta.ua'

Можна переконатися, що відомості системою були взяті із заповнених нами значень параметрів для користувацького CRT сертифікату.
Створення сертифікату P12
Тепер нам залишилося створити сертифікат типу P12, котрий буде надісланий нами безпосередньо віддаленому користувачу для його встановлення на пристрої, що використовується. Саме він буде використовуватися браузером при під'єднанні до серверу. Для цього наберемо в терміналі наступну команду:
$ openssl pkcs12 -export -in /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.crt -inkey /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.key -out /etc/nginx/site.ua/usr_certs/alexandr7500@meta.ua.p12 -passout pass:789Bbmbm!
Тепер можна завантажити файл із розширенням P12 на свій пристрій та передати його користувачу разом із паролем доступу.
Налаштування браузера
Для під'єднання до веб-серверу користувачу необхідно підключити сертифікат до браузера, котрий використовується на його пристрої. Для прикладу, використаємо браузер Mozilla Firefox для здійснення налаштувань.
Для цього обираємо наступні команди головного меню браузера: Наслаштування-Додаткові.

У вікні, що відкрилося, обираємо команду Перегляд сертификатів та потрапляємо до вікна Управління сертифікатами, як показано нижче..

Переходимо до закладки Ваші сертификати та у нижній частині вікна обираємо команду Імпортувати.

Обираємо свій сертифікат, вводимо пароль доступу та натискаємо кнопку ОК.
Після цього вже можна перейти на веб-ресурс, для котрого був виданий сертифікат, обрати його у випадаючому списку та підтвердити свій вибір. В результаті, ви повинні отримати сторінку запрошення від веб-серверу Nginx, що буде означати, що доступ до потрібного ресурсу відкритий.
Видалення та відкликання сертифікатів
Для коректного видалення вже сформованих сертифікатів необхідно:
- Очистити директорію, у котрій зберігаються вказані документи (usr_certs у нашому випадку);
- Видалити запис про користувача у файлі index.txt;
- Видалити останнє число із файлу ser_nom.
Також потрібно не забувати вчасно відкликати видані сертифікати, якщо вони користувачу вже непотрібні. Це убезпечить вас від зайвих проблем.
Дата-центр FREEhost.UA пропонує надійні VPS сервери для навчання та високонавантажених проектів. Цілодобова технічна підтримка, більше 25 шаблонів з найбільш затребуваним програмним забезпеченням для автоматичного створення сервера, щоденне резервне копіювання - це лише частина переваг, які Ви отримаєте використовуючи наші надійні сервери.
Подписывайтесь на наш телеграм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем-то ошиблись, или что-то пропустили?
Напишите об этом в комментариях на сайте и в телеграм-канале. Мы с удовольствием ответим и обсудим Ваши замечания и предложения.
|
Дата: 27.10.2023 Автор: Олександр Ровник
|
|

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus