• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Налаштування авторизації через SSL сертифікат на рівні Nginx

Вступ

Доволі часто виникає потреба у встановленні обмеженого доступу користувачам до тих чи інших сторінок веб-ресурсу, що обумовлено питаннями безпеки при роботі із конфіденційною інформацією. Це можна вирішити шляхом налаштування авторизації посередництвом 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

Отже, встановлена версія OpenSSL 3.0.2, що нас цілком влаштовує.

Перевіримо статус служби веб-серверу Nginx:

$ systemctl status nginx

Cтатус служби веб-серверу 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

Cтворення закритого ключа

Тепер сформуємо запит на створення 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

Створення 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

 Створення CRT сертифікату

Отже, сертифікат було успішно створено.

Таким чином, системою були зареєстровані наступні значення параметрів користувача:

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
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA