OpenSSL: архитектура, приложения, ГОСТы, USB-токены

в 14:00, , рубрики: cms, openssl, pkcs10, pkcs7, SSL, TLS, информационная безопасность, рутокен, рутокен эцп, эцп, метки: , , , , , , , , ,

image

OpenSSL — мощный и современный криптографический пакет с открытым исходным кодом. В пакете реализованы различные криптографические алгоритмы, форматы и протоколы, что позволяет использовать OpenSSL для широкого круга прикладных задач.

OpenSSL является основным криптопровайдером — «поставщиком» криптографических функций — для приложений Open Source. VPN, электронная подпись, HTTPS, Удостоверяющий центр, защищенная почта и многое другое реализовано на базе OpenSSL и его приложений.

Архитектура OpenSSL позволяет расширять его возможности с помощью написания специальных библиотек — ENGINE. Именно таким способом в OpenSSL была добавлена поддержка российских криптографических алгоритмов ГОСТ, подключены USB-токены с аппаратной реализацией криптоалгоритмов.

Обзор возможностей и архитектуры OpenSSL, поддержки в нем ГОСТов и токенов под катом.

Функционал OpenSSL условно можно разделить на 2 уровня: низкоуровневые криптографические «примитивы» и высокоуровневые криптографические форматы, протоколы. В примитивах реализованы базовые криптографические алгоритмы (симметричные алгоритмы, хэш-функция, асимметричные алгоритмы). Форматы и протоколы построены на алгоритмах и позволяют решать прикладные задачи.

Пример: формат PKCS#7 использует электронную подпись по алгоритму ГОСТ Р 34.10-2001 и цифровые сертификаты формата X.509 и, при определенных условиях, позволяет обеспечить юридическую значимость электронной подписи.

На картинке представлены криптографические примитивы, реализованные в OpenSSL.

image

На этой картинке представлены наиболее важные криптографические форматы и протоколы, реализованные в OpenSSL.

image

В OpenSSL, начиная с версии 1.0.0, имеются ГОСТы. При этом в OpenSSL реализованы как криптграфические алгоритмы ГОСТ 28147-89, ГОСТ Р 34.11-94, ГОСТ Р 34.10-2001, так и RFC российских производителей СКЗИ, в которых описано использование ГОСТов в криптографических форматах и протоколах.

Поддержка ГОСТов в OpenSSL представлена на картинке.

image

Например, поддержка RFC 4357 обеспечивает совместимость с СКЗИ российских производителей по параметрам алгоритмов.

Кроме того, в RFC 4357 описана схема ключевого обмена VKO GOST 34.10-2001. Поддержка этой схемы в OpenSSL совместно с поддержкой RFC 4490 обеспечивает, например, совместимость по зашифрованным сообщениям CMS (зашифровано для «адресата»). Эта же схема используется в протоколе TLS/SSL, что совместно с поддержкой в OpenSSL draft-chudov-cryptopro-cptls обеспечивает совместимость по реализации протокола SSL/TSL.

Важным RFC является 4491, в котором описана укладка открытого ключа ГОСТ Р 34.10-2001 в сертификатах X.509, заявках на сертификаты PKCS#10.

Если сделать dump сертификата открытого ключа RSA, то сам ключ и его параметры будут храниться таким образом:

SEQUENCE {
197 13: SEQUENCE {
199 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
210 0: NULL
: }
212 271: BIT STRING, encapsulates {
217 266: SEQUENCE {
221 257: INTEGER
: 00 CE B1 C1 2E D3 4F 7C CD 25 CE 18 3E 4F C4 8C
: 6F 80 6A 73 C8 5B 51 F8 9B D2 DC BB 00 5C B1 A0
: FC 75 03 EE 81 F0 88 EE 23 52 E9 E6 15 33 8D AC
: 2D 09 C5 76 F9 2B 39 80 89 E4 97 4B 90 A5 A8 78
: F8 73 43 7B A4 61 B0 D8 58 CC E1 6C 66 7E 9C F3
: 09 5E 55 63 84 D5 A8 EF F3 B1 2E 30 68 B3 C4 3C
: D8 AC 6E 8D 99 5A 90 4E 34 DC 36 9A 8F 81 88 50
: B7 6D 96 42 09 F3 D7 95 83 0D 41 4B B0 6A 6B F8
: [ Another 129 bytes skipped ]
482 3: INTEGER 65537
: }
: }
: }

А открытый ключ ГОСТ Р 34-10.2001 и его параметры в полном согласии с RFC 4491 в сертификате лежат так:

SEQUENCE {
269 28: SEQUENCE {
271 6: OBJECT IDENTIFIER GOST R 34.10-2001 (1 2 643 2 2 19)
279 18: SEQUENCE {
281 7: OBJECT IDENTIFIER
: id-GostR3410-2001-CryptoPro-A-ParamSet (1 2 643 2 2 35 1)
290 7: OBJECT IDENTIFIER
: id-GostR3411-94-CryptoProParamSet (1 2 643 2 2 30 1)
: }
: }
299 67: BIT STRING, encapsulates {
302 64: OCTET STRING
: DF D4 AE F2 9F 84 A2 72 4E 31 7B 5F D3 91 4E 50
: B8 E6 D1 D6 7B 88 54 B3 0A A8 FB EC 7D 79 DB 5C
: E0 29 F2 91 83 57 28 7B 43 18 39 A6 A9 92 A5 FE
: 47 E7 A1 6E 01 23 BF 4E F0 CB B8 0F 9D 27 CA 9F
: }
: }

Основное различие состоит в том, что параметры окрытого ключа ГОСТ Р 34.10-2001 задаются идентификатором (OID). Соответствие этого OID конкретным параметрам эллиптической кривой можно найти в RFC 4357.

Приложения

На картинке показаны некоторые приложения и фреймворки, которые используют OpenSSL в качестве «криптографического ядра».

image

Среди них такие популярные и набирающие популярность как:

  • web-сервер Apache (mod_ssl)
  • OpenVPN (SSL VPN)
  • база данных PostgreSQL
  • масштабируемый удостоверяющий центр с web-интерфейсом OpenCA
  • фреймворк QT
  • браузер QTWeb
  • LDAP-каталог OpenLDAP

С помощью OpenSSL и использующих его приложенией можно решить различные задачи, связанные с защитой информации, например:

  • организовать VPN
  • развернуть как корпоративный, так и распределенный PKI
  • обеспечить защиту с помощью SSL/TLS различных прикладных протоколов (HTTP, RDP, SMTP/POP3/IMAP и т.п.)
  • внедрить электронную подпись (с помощью настольных приложений, в браузере)

Разработчику OpenSSL предоставляет мощный SDK, который позволяет разрабатывать приложения с использованием OpenSSL на многих языках и платформах:

  • C/C++
  • JAVA wrapper
  • PHP, perl, python wrappers
  • .NET wrapper

OpenSSL, как и многие популярные приложения Open Source, собирается под большое количество операционных систем и архитектур. Например, имеется OpenSSL под ОС Android, под архитектуру ARM.

Архитектура

OpenSSL состоит из трех главных модулей:

  • Библиотеки libeay32, в которой реализованы криптографические алгоритмы и ряд форматов и протоколов
  • Библиотеки ssleay32, в которой реализован протокол SSL/TLS
  • Командно-строчной утилиты openssl, обладающей очень большим количеством кейсов

В OpenSSL можно добавить свою собственную реализацию криптографических алгоритмов и изменить работу функций-упаковщиков форматов. Для этого следует написать библиотеку, реализующую спецификацию ENGINE — плагина к OpenSSL. Именно таким образом в OpenSSL добавлена поддержка ГОСТов
(engine GOST). Сейчас engine GOST входит в апстрим OpenSSL.

image

Через механизм ENGINE в OpenSSL была добавлена поддержка USB-токенов, с аппаратной реализацией алгоритма RSA «на борту». Для этой цели в рамках проекта OpenSC был разработан
engine_PKCS11. Engine_PKCS11, используя стандартную библиотеку PKCS#11 токена, позволяет «переключать» OpenSSL на аппаратную реализацию криптографических алгоритмов «на борту» токена.

Схема подключения токенов к OpenSSL представлена на рисунке. Следует отметить, что библиотека libp11 представляет собой «надстройку» над библиотекой PKCS#11 произвольного USB-токена и тоже является Open Source.

image

Для поддержки в OpenSSL аппаратной реализации ГОСТов «на борту» USB-токена Рутокен ЭЦП была доработана библиотека libp11 и написан ENGINE pkcs11_gost, сам OpenSSL не модифицировался. Полученный «плагин» к OpenSSL позволяет переключать OpenSSL на аппаратную реализацию российских криптоалгоритмов на «борту» Рутокен ЭЦП.

На данный момент ENGINE pkcs11_gost позволяет на «борту» Рутокен ЭЦП производить следующие операции:

  • генерировать ключ ГОСТ Р 34.10-2001
  • подписывать данные по ГОСТ Р 34.10-2001
  • вырабатывать ключ согласования по схеме VKO GOST 34.10-2001 (RFC 4357)
  • формировать последовательность случайных данных произвольной длины

При использовании ENGINE pkcs11_gost, например, при формировании электронной подписи через интерфейс OpenSSL в формате PKCS#7 выработка подписи по ГОСТ Р 34.10-2001 производится на «борту» Рутокен ЭЦП, а упаковка формата PKCS#7 в соответствии с RFC российских производителей программно, в engine GOST.

Ключ так же является «неизвлекаемым» при формировании заявки PKCS#10 на сертификат, при проведении клиентской аутентификации в рамках протокола TLS и т.п.

Более подробное описание ENGINE pkcs11_gost можно найти по ссылке http://forum.rutoken.ru/topic/1639/. Там же можно скачать ее для платформ win32, linux x86, linux x64 и посмотреть программные примеры использования OpenSSL c Рутокен ЭЦП.

Автор: VicTun

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js