OpenSSL — мощный и современный криптографический пакет с открытым исходным кодом. В пакете реализованы различные криптографические алгоритмы, форматы и протоколы, что позволяет использовать OpenSSL для широкого круга прикладных задач.
OpenSSL является основным криптопровайдером — «поставщиком» криптографических функций — для приложений Open Source. VPN, электронная подпись, HTTPS, Удостоверяющий центр, защищенная почта и многое другое реализовано на базе OpenSSL и его приложений.
Архитектура OpenSSL позволяет расширять его возможности с помощью написания специальных библиотек — ENGINE. Именно таким способом в OpenSSL была добавлена поддержка российских криптографических алгоритмов ГОСТ, подключены USB-токены с аппаратной реализацией криптоалгоритмов.
Обзор возможностей и архитектуры OpenSSL, поддержки в нем ГОСТов и токенов под катом.
Функционал OpenSSL условно можно разделить на 2 уровня: низкоуровневые криптографические «примитивы» и высокоуровневые криптографические форматы, протоколы. В примитивах реализованы базовые криптографические алгоритмы (симметричные алгоритмы, хэш-функция, асимметричные алгоритмы). Форматы и протоколы построены на алгоритмах и позволяют решать прикладные задачи.
Пример: формат PKCS#7 использует электронную подпись по алгоритму ГОСТ Р 34.10-2001 и цифровые сертификаты формата X.509 и, при определенных условиях, позволяет обеспечить юридическую значимость электронной подписи.
На картинке представлены криптографические примитивы, реализованные в OpenSSL.
На этой картинке представлены наиболее важные криптографические форматы и протоколы, реализованные в OpenSSL.
В OpenSSL, начиная с версии 1.0.0, имеются ГОСТы. При этом в OpenSSL реализованы как криптграфические алгоритмы ГОСТ 28147-89, ГОСТ Р 34.11-94, ГОСТ Р 34.10-2001, так и RFC российских производителей СКЗИ, в которых описано использование ГОСТов в криптографических форматах и протоколах.
Поддержка ГОСТов в OpenSSL представлена на картинке.
Например, поддержка 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 в качестве «криптографического ядра».
Среди них такие популярные и набирающие популярность как:
- 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.
Через механизм ENGINE в OpenSSL была добавлена поддержка USB-токенов, с аппаратной реализацией алгоритма RSA «на борту». Для этой цели в рамках проекта OpenSC был разработан
engine_PKCS11. Engine_PKCS11, используя стандартную библиотеку PKCS#11 токена, позволяет «переключать» OpenSSL на аппаратную реализацию криптографических алгоритмов «на борту» токена.
Схема подключения токенов к OpenSSL представлена на рисунке. Следует отметить, что библиотека libp11 представляет собой «надстройку» над библиотекой PKCS#11 произвольного USB-токена и тоже является Open Source.
Для поддержки в 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