Досвід застосування технології Рутокен для реєстрації та авторизації користувачів у системі (частина 1)

Добридень! Хочу поділитися своїм досвідом на цю тему.

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

У цьому прикладі використовується Рутокен ЕЦП 2.0.

Для роботи з цим Рутокеном необхідно встановити драйвер на windows.

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

З Рутокеном можна взаємодіяти у різний спосіб. Можна отримати доступ до нього із серверної частини програми, а можна одразу з клієнтської. У цьому прикладі буде розглянуто взаємодію з Рутокеном із клієнтської частини програми.

Клієнтська частина програми взаємодіє з рутокеном через рутокен плагін. Це програма, яка встановлюється окремо на кожен браузер. Для windows необхідно просто завантажити та встановити плагін, що знаходиться за цим посиланням.

Все, тепер ми можемо взаємодіяти з Рутокеном із клієнтської частини програми.

В даному прикладі розглянуто ідею реалізації алгоритму авторизації користувача в системі з використанням схеми chеllange-response.

Суть ідеї наступного:

  1. Клієнт надсилає запит на авторизацію на сервер.
  2. Сервер у відповідь на запит від клієнта надсилає випадковий рядок.
  3. Клієнт доповнює цей рядок випадковими 32 бітами.
  4. Клієнт підписує отриманий рядок своїм сертифікатом.
  5. Клієнт відправляє на сервер отримане закодоване повідомлення.
  6. Сервер перевіряє підпис, отримуючи вихідне незакодоване повідомлення.
  7. Сервер від'єднує останні 32 біти від отриманого незакодованого повідомлення.
  8. Сервер порівнює отриманий результат з тим повідомленням, яке надіслано при запиті на авторизацію.
  9. Якщо повідомлення однакові, то авторизація вважається успішною.

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

У цьому прикладі будемо використовувати асиметричні алгоритми шифрування. Для реалізації асиметричних алгоритмів необхідно мати ключову пару та сертифікат.

Ключова пара складається з двох частин: приватний ключ та публічний ключ. Приватний ключ, як випливає з його назви, має бути секретним. Ми використовуємо його для розшифровки інформації. Публічний ключ можна роздати будь-кому. Цей ключ використовується для шифрування даних. Таким чином, будь-який користувач може зашифрувати дані, використовуючи публічний ключ, але тільки власник приватного ключа може розшифрувати цю інформацію.

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

Щоб правильно підписати повідомлення сертифікатом, потрібно правильно його створити. Для цього на Рутокені спочатку створюється ключова пара, а потім до публічного ключа цієї ключової пари має прив'язуватись сертифікат. Сертифікат повинен мати саме той публічний ключ, який є на Рутокені, це важливо. Якщо ми просто створимо ключову пару та сертифікат одразу на клієнтській частині програми, то яким чином потім сервер зможе розшифрувати це зашифроване повідомлення? Адже він зовсім нічого не знає ні про ключову пару, ні про сертифікат.

Якщо глибше поринути у цю тему, можна знайти цікаву інформацію в інтернеті. Існують якісь центри, яким ми свідомо довіряємо. Ці сертифікати можуть видавати сертифікати користувачам, вони ці сертифікати встановлюють на свій сервер. Після цього, коли клієнт звертається до цього сервера, він бачить цей сертифікат, і бачить, що він був виданий центром, що засвідчує, а значить цьому серверу можна довіряти. Докладніше про те, як правильно все налаштувати, в інтернеті також повно інформації. Наприклад, можна почати з цього.

Якщо повернутись до нашого завдання, то рішення здається очевидним. Потрібно якимось чином зробити свій центр, що засвідчує. Але перед цим потрібно розібратися, а на підставі чого центр, що засвідчує, повинен видавати сертифікат користувачеві, адже він про нього нічого не знає. (Наприклад, його ім'я, прізвище і т.д.) Є така штука, яка називається запит на сертифікат. Докладніше про цей стандарт можна глянути, наприклад, на вікіпедії ru.wikipedia.org/wiki/PKCS
Ми будемо використовувати версію 1.7 – PKCS#10.

Опишемо алгоритм формування сертифіката на Рутокені (першоджерело — документація):

  1. На клієнті створюємо ключову пару та зберігаємо її на Рутокені. (Збереження відбувається автоматично)
  2. На клієнті створюємо запит на сертифікат.
  3. З клієнта надсилаємо цей запит на сервер.
  4. При отриманні запиту на сертифікат на сервері виписуємо сертифікат своїм центром, що засвідчує.
  5. Надсилаємо цей сертифікат на клієнт.
  6. На клієнті зберігаємо сертифікат Рутокен.
  7. Сертифікат повинен прив'язатись до тієї ключової пари, яка була створена на першому кроці.

Тепер стає зрозумілим, як сервер зможе розшифрувати підпис клієнта, адже він сам видав йому сертифікат.

У наступній частині ми докладно розглянемо, як налаштувати свій центр посвідчення на основі повноцінної криптографічної бібліотеки з відкритим вихідним кодом openSSL.

Джерело: habr.com

Додати коментар або відгук