ПОДДЕРЖКА РОССИЙСКИХ КРИПТОАЛГОРИТМОВ В OpenSSL
Сотрудниками ООО «Криптоком» решена задача добавления российских
криптоалгоритмов в OpenSource-библиотеку OpenSSL.
Поддерживаются алгоритмы, описанные в RFC 4357:
- Электронная подпись ГОСТ Р 34.10-2001;
- Распределение ключей VKO 34.10-2001;
- Хэширование ГОСТ Р 34.11-94;
- Симметричное шифрование ГОСТ 28147-89;
- MAC (имитовставка) ГОСТ 28147-89;
Реализована работа с
защищенными сообщениями по RFC
4490, функциональность
PKI по RFC
4491 и
шифрсьюты TLS на базе российских алгоритмов в соответствии с
draft-chudov-cryptopro-cptls.
В настоящий момент существуют две реализации этой функциональности:
Разработан на базе OpenSSL 0.9.8e, включает в себя модифицированные версии
библиотек OpenSSL и модуль реализации российских алгоритмов на базе
сертифицированного криптоядра КриптоКом.
Сертифицированная коммерческая реализация более не поддерживает алгоритмы
на базе стандарта ГОСТ Р 34.10-94 в связи с истечением срока действия
стандарта.
Описание и исходные тексты модификаций ядра OpenSSL, понадобившихся для
реализации российских алгоритмов, можно найти
на отдельной странице. Там же приведены
исходные тексты примера реализации (несертифицированного) модуля,
предоставляющего российские криптоалгоритмы.
Бинарные пакеты библиотек OpenSSL из состава МагПро КриптоПакет и
несертифицированный пример реализации поддержки криптографических алгоритмов
доступны на странице ознакомительной версии
МагПро КриптоПакет. Там же можно получить бинарные пакеты некоторых широко
распространенных Open Source приложений, собранных с использованием МагПро
КриптоПакет.
В состав МагПро КриптоПакет входит следующая документация на русском
языке:
Поддержка ГОСТ в разрабатываемой версии OpenSSL 1.0.0
В следующей версии OpenSSL, 1.0.0, находящейся в данный момент в
процессе разработки, использование российских алгоритмов не
требует модификации библиотек OpenSSL. В состав дистрибутива OpenSSL
включен пример реализации модуля поддержки российских алгоритмов
(каталог engines/ccgost), разработанный специалистами фирмы Криптоком.
МагПро КриптоПакет и OpenSSL 1.0.0 совместимы между собой по
большей части высокоуровневых API (работа с TLS, работа с
PKCS7-сообщениями). К сожалению, совместимость по низкоуровневым API
создания ключевых пар, выработки подписи и MAC отсутствует, так как эта
функциональность в 1.0.0 реализована на базе новых API, появившихся
только в данной версии.
Для большей части приложений это не существенно, так как эти
приложения не занимаются самостоятельной генерацией ключей и заявок на
сертификаты (эти операции выполняются с помощью утилиты командной строки
openssl), и не используют собственных форматов подписанных документов.
При разработке приложений, которые используют эту функциональность,
мы рекомендуем ориентироваться на OpenSSL версии 1.0.0.
Исходные тексты актуального снапшота OpenSSL 1.0.0 можно получить
на ftp-сервере проекта
OpenSSL. Используйте файл openssl-SNAP-XXXXXXX.tar.gz с наиболее
близкой к текущей датой.
Описание использования российских алгоритмов приведено в файле
README.gost
в директории engines/ccgost.
Использование модифицированной OpenSSL в приложениях
В связи со значительными изменениями, которые пришлось внести в
базовые структуры данных OpenSSL для поддержки произвольных алгоритмов с
открытым ключом и поддержки динамического добавления ciphersuites,
модифицированная OpenSSL из состава МагПро КриптоПакет бинарно
несовместима с оригинальной версией. OpenSSL 1.0.0 также бинарно
несовместима с предыдущей версией.
Поэтому для их использования требуется пересборка всех приложений,
использующих OpenSSL. Мы рекомендуем не заменять системную OpenSSL на
нашу модифицированную, а установить модифицированную в другом месте
файловой системы, что позволяет пересобирать только те приложения,
в которых планируется использовать новые возможности
Опубликованный API OpenSSL нами сохранен практически полностью. Но так
как некоторые программы осуществляют доступ к недокументированным полям
структур данных OpenSSL, может потребоваться внесение изменений в
приложения. На данный момент нам известно только одно такое приложение -
mod_ssl для web-сервера Apache.
Для того чтобы приложение могло использовать возможности,
предоставляемые engine, как правило, достаточно чтобы приложение
считывало системный конфигурационный файл OpenSSL, либо поддерживало
подгрузку и конфигурирование engine своими средствами.
К сожалению, очень немногие приложения поддерживают чтение
конфигурационного файла OpenSSL, так как эта функциональность в
библиотеке появилась только в версии 0.9.7.
Мы публикуем подробное описание того, как
патчить приложения не работающие с ГОСТ после простой пересборки.
Ниже приведен список протестированных нами
приложений, ко многим из которых приводятся патчи.
Веб-сервер Apache использует очень сложный механизм работы с ключами, связанный
с тем, что сервер запускается из-под суперпользователя, а работает
из-под непривилегированного пользователя. Поэтому ограничиться
подгрузкой engine не удается. Требуется внести некоторые изменения в
процедуру загрузки ключей.
С другой стороны в последних версиях mod_ssl для Apache 1.3.x и
в Apache 2.2.x уже предусмотрены директивы конфигурации для работы c
Engine (SSLCryptoDevice).
ВНИМАНИЕ! Apache не читает стандартный конфигурационный файл
OpenSSL (openssl.cnf). Подгрузка engine выполняется средствами
конфигурационного файла самого Apache, при этом указывается не полный
путь к engine, а только идентификатор. Поэтому engine должна быть
размещена в умолчательном каталоге engines установленной OpenSSL, для
того чтобы её можно было загрузить в Apache.
- Apache 1.3/mod_ssl
Следующий патч (681б).
обеспечивает работу МагПро КриптоПакет
engine с Apache 1.3.x.
Этот патч предназначен для Apache 1.3.x с mod_ssl 2.8.24.
mod_ssl, входящий в состав Apache 2.0 не содержит необходимой
функциональности для работы с engines.
Сборку mod_ssl для Apache 1.3.x требуется выполнять с
--enable-rule=SSL_EXPERIMENTAL, так как без этой опции
команда SSLCryptoDevice, подключающая engine, недоступна.
- Apache 2.2.x
Следующий патч (561б) обеспечивает
работу МагПро КриптоПакет в Apache 2.2.x (тестирован с 2.2.3-2.2.9).
- Apache 2.2.x и OpenSSL 1.0.0
- Следующий патч
(2кб) обеспечивает работу алгоритмов ГОСТ с OpenSSL 1.0.0 и включенной в
её комплект gost engine.
В конфигурационном файле Apache (и для 2.2.3, и для 1.3.x) следует указать
SSLCryptoDevice gost
При использовании OpenSSL 0.9.8 с нашим ГОСТ один виртуальный сервер
может использовать либо только ГОСТ Р 34.10-94, либо только ГОСТ Р
34.10-2001, но не одновременно.
Параллельно c ключами ГОСТ можно для того же
виртуального сервера указать ключи и сертификаты RSA, что обеспечит
доступность данного сервера для клиентов, не поддерживающих российскую
криптографию. Необходимо также явным образом запретить все ciphersuites,
использующие DSA и явно разрешить ciphersuites с ГОСТ.
При использовании OpenSSL 1.0.0 можно одновременно использовать и DSA, и
RSA и ГОСТ ключи.
OpenSSH
На настоящий момент не существует расширения стандарта на протокол SSH,
позволяющего использовать российские алгоритмы. Поэтому OpenSSH,
собранный с модифицированной OpenSSL, не будет поддерживать российскую
криптографию.
Тем не менее, OpenSSH может быть собран с модифицированной OpenSSL и
полностью сохранит при этом старую функциональность.
OpenVPN
У OpenVPN существуют следующие
проблемы, требующие модификации исходного кода для использования
алгоритмов ГОСТ
- По умолчанию поддерживаются только CBC-шифры, в то время как для
ГОСТ стандарт предусматривает использование режимов CFB (гаммирование с
обратной связью) и CNT (гаммирование). Включить их поддержку можно, определив
символ препроцессора ALLOW_NON_CBC_CIPHERS.
- В функции openvpn_encrypt имеется assertion, проверяющий что при
финализации шифра размер последнего блока равен размеру вектора
инициализации. Это неверно для CFB шифров, у которых может быть непустой
вектор инициализации, но дополнительного куска шифртекста, который
возвращается только при финализации шифра, не бывает.
- Совершенно не учитывается возможность использования алгоритмов
контроля целостности, отличных от HMAC, в частности, таких, у которых
размер ключа и размер контрольной суммы не совпадает (что имеет место в
случае имитовставки ГОСТ).
Нами был разработан патч, который
исправляет вторую и третью проблему. Для исправления первой проблемы
нужно, чтобы переменная среды CFLAGS при запуске
configure содержала -DALLOW_NON_CBC_CIPHERS.
Для использования ГОСТ в openvpn собранной с данным патчем и OpenSSL с
поддержкой ГОСТ следует указать в конфигурационном файле (или в
командной строке)
`
engine gost
cipher gost
auth gost-mac
Данные опции можно использовать как в режиме с preshared ключами, так и
в режиме с tls-аутентификацией. В последнем случае следует добавить
tls-cipher GOST2001-GOST89-GOST89
Stunnel 4.x
Stunnel поддерживает возможность подгрузки engine через свой
конфигурационный файл. Поэтому модификация исходных текстов не
требуется. Но при сборке скрипту configure требуется указать опцию
--disable-rsa. Stunnel, собранный без этой опции поддерживает только
алгоритм RSA. С этой опцией поддерживаются все алгоритмы, поддерживаемые
нижележащей OpenSSL, в том числе и RSA.
ВНИМАНИЕ! Stunnel не считывает стандартный конфигурационный файл
OpenSSL. Поэтому engine должна быть размещена в умолчательном каталоге
engines установленной OpenSSL.
PostgreSQL
Начиная с PostgreSQL 8.3 в состав как сервера PostgreSQL, так и
клиентской библиотеки libpq включены наши патчи, позволяющие
использовать алгоритмы ГОСТ.
При использовании продукта МагПро КриптоПакет можно также
использовать для соединения с сервером PostgreSQL ключи, хранящиеся на
аппаратных носителях, поддерживаемых этим продуктом.
Для использования ciphersuites ГОСТ в PostgreSQL, cобранном с с OpenSSL 0.9.8 с нашим патчем
или с MагПро КриптоПакет 1.0, необходимо их явно указать в опции ssl_ciphers файла
postgresql.conf. Иначе возможны ошибки, связанные с попыткой
использовать DSA-ciphersuites с ключами ГОСТ.
Патч, опубликованный на нашей
странице, посвященной проекту PostgreSQL, содержит все необходимые
модификации кода, и может быть использован с PostgreSQL версии 8.1.x и
8.2.x.
Tcltls
Для библиотеки tls (1.5.0) для языка программирования Tcl
нами был реализован патч
(2.2K) позволяющий как
читать конфигурационный файл библиотеки OpenSSL, так и подгружать и
конфигурировать engine явным образом. Этот патч также доступен
в Request
tracker проекта tcltls
В приложениях, написанных с использованием этой библиотеки, достаточно
добавить вызов ::tls::config.
Прочие протестированные приложения
Кроме вышеперечисленных, нами были протестированны следующие приложения:
Во всех этих приложениях модификация кода сводится к добавлению вызова
OPENSSL_config(NULL)
Особенности взаимодействия с CryptoPRO CSP
Если требуется обеспечить совместимость приложений, использующих нашу
реализацию алгоритмов ГОСТ с приложениями, использующими для реализации
TLS CryptoPro CSP 3.0, следует учитывать следующие особенности:
- Следует использовать набор параметров gost2001:XA или gost94:A при создании серверных сертификатов.
- На клиентских машинах следует включить использование TLS 1.0 в
Internet Explorer. По умолчанию использование TLS 1.0 в Internet
Explorer выключено, а данные ciphersuites можно использовать только в
TLS 1.0. Поведение CryptoPRO CSP в серверном варианте, когда он получив
ClientHello с версией 3.0 (SSL 3.0) отвечает ServerHello с версией 3.1
(TLS 1.0) является грубым нарушением стандарта TLS 1.0 и нашим патчем не
поддерживается.