- Openssl gost для windows
- OpenSSL и ГОСТ
- Содержание
- Применимость
- Установка и настройка
- Формирование запроса на сертификат с поддержкой алгоритма ГОСТ (пример)
- Получение контрольной суммы используя алгоритмы ГОСТ
- Записки от Kirill.zak
- Помаленьку полезного и интересного
- OpenSSL и ГОСТ. Настройка
- Взаимодействие с ГИС ЖКХ с помощью stunnel и openssl по ГОСТу
- Подготовка
- Криптотуннель по ГОСТу
- Формирование XMLDSig
Openssl gost для windows
На текущий момент существует 2 варианта реализации ГОСТ алгоритмов, которые может использовать OpenSSL:
- Open source библиотека, которая раньше поставлялась вместе с OpenSSL, но начиная с версии OpenSSL 1.1, она была исключена из его состава, и оформилась в виде отдельного продукта https://github.com/gost-engine/engine .
Поддержка алгоритмов ГОСТ 2001 имеется во всех версиях библиотеки gost.dll. Однако поддержка алгоритмов ГОСТ 2012 реализована только в версиях, совместимых с OpenSSL >= 1.1.0.
Библиотека gost.dll должна использоваться только с соответствующей ей версией OpenSSL:
- для OpenSSL = 1.1.0: собирается самостоятельно из исходников (https://github.com/gost-engine/engine), поддерживает ГОСТ 2012
В релизах сервиса до сентября 2020 включительно, использовались библиотеки OpenSSL 1.0.2. Поэтому возможно использовать библиотеку gost.dll из самого интялятора OpenSSL, либо можно скачать соответствующую библиотеку с нашего сайта:
В штатной поставке текущего сервиса поставляются библиотеки OpenSSL версии 1.1.1. Поэтому необходимо самостоятельная сборка библиотеки gost.dll, либо можно воспользоваться версией собранной нами:
Необходимо использовать библиотеку соответствующую разрядности используемого приложения, которое будет использовать данную библиотеку. Например, если настраивается серверная сторона Сервиса, то выбирается в соответствии с его разрядностью, если настраивается клиентская сторона (приложение для удаленного доступа), то в соответствии с его разрядностью (на текущий момент только Win32).
КриптоПро библиотека для OpenSSL (gost_capi или gostengy для OpenSSL >= 1.1.0), работающая только при установленном КриптоПро CSP.
Аналогично, как и с библиотекой gost.dll, версия библиотеки зависит от используемой версии OpenSSL:
- для OpenSSL = 1.1.0: необходимо использовать библиотеку gostengy, поддерживает ГОСТ 2012
Скачать необходимые версии библиотеки можно на сайте КриптоПро .
Более подробное описание можно найти у них на форуме .
- Расположить необходимую библиотеку (нужной разрядности) поддержки алгоритмов ГОСТ рядом с исполняемыми файлами, которые будут ее использовать.
Создать файл конфигурации OpenSSL.
Пример для библиотеки gost.dll:
Пример для библиотеки gost_capi/gostengy от КриптоПро:
В указанных примерах файла конфигураций предполагается, что библиотека поддержки алгоритмов ГОСТ находится рядом с исполняемыми файлами. Но файл конфигурации может быть расположен в ином месте. В таком случае необходимо указать полный, а не относительный путь к библиотеке.
В случае использования существующего файла конфигурации, например поставляемого с самим OpenSSL, необходимо 1-ю строчку (openssl_conf = openssl_def) вставить в начало этого файла, а остальные строки в самый конец файла.
Указанный файл конфигурации является примером, и может быть изменен пользователем в зависимости от требуемых настроек.
Подобным образом возможно подключить любые другие расширения (engine) для OpenSSL.
Например, в случае если приватный ключ сертификата хранится на аппаратном носителе (USB токен, смарт карт) который не допускает их экспортирования в файл, но при этом предосталяет возможность их использования через свой интерфейс. Обычно в таких случаях криптопровайдер распространяет расширения для интеграции с OpenSSL.
В таких случаях, в процессе конфигурирования вместо указания пути к файлу (Параметры сетевых настроек, поле Закрытый ключ) необходимо указать через какое расширение можно обращаться к закрытому ключу:
OpenSSL и ГОСТ
Содержание
Применимость
- Приведённая ниже инструкция актуальна для RED X3|X4 и FRESH R8.1|R11. Реализация OpenSSL в этих дистрибутивах включает поддержку алгоритмов ГОСТ
- Наличие в ОС реализации алгоритма ГОСТ не означает автоматического наличия сертификата регулятора на эту реализацию. Проверка контроля встраивания не производилась, сертификат регулятора (ФСБ РФ) на эту реализацию отсутствует. Таким образом, применять эту реализацию можно только в целях осуществления проверок функционирования, либо в соответствии со статьей 1, пункт 2, подпункт 1 152-ФЗ
Установка и настройка
По-умолчанию поддержка ГОСТ отключена. Активизируем поддержку алгоритма в конфигурационном файле:
- Редактируем файл /etc/pki/tls/openssl.cnf Вначале файла, прямо первой строкой определим дополнительную секцию openssl_conf=openssl_def, например:
- Затем в конец этого же файла вносим описание алгоритма в конфигурационный файл, с учетом верного пути к библиотеке, например:
- Удостоверимся, что библиотека openssl корректно опознала добавленный алгоритм ГОСТ. Для этого выполним:
Ответ системы будет такой:
Формирование запроса на сертификат с поддержкой алгоритма ГОСТ (пример)
Получение контрольной суммы используя алгоритмы ГОСТ
Для получения хэш-функции согласно ГОСТ Р 34.11-2012.
Записки от Kirill.zak
Помаленьку полезного и интересного
OpenSSL и ГОСТ. Настройка
Все государственные структуры обязаны использовать в своих информационных системах только ГОСТ криптографические алгоритм. Поэтому, всем IT специалистам приходятся сталкиваться с криптографией по ГОСТ при разработке или сопровождению информационных систем, если в требованиях есть условие по взаимодействию с информационными системами государственных органов.
Одним из самым популярных кроссплатформенных инструментов для работы с криптографией является проект OpenSSL. Поддержка ГОСТ алгоритмов добавлена в OpenSSL версии 1.0.0. Начиная с этой версии, после правильной настройки, мы получим полноценную работу с ГОСТ алгоритмами в наших проектах, если они используют OpenSSl.
Для использования ГОСТ алгоритмов в OpenSSL необходимо установить последнюю версию:
После этого нужно настроить OpenSSL. Для этого необходимо в начало конфигурационного файла OpenSSL, который расположен по адресу /etc/ssl/openssl.cnf после
и в конец файла добавить:
- Параметр engine_id указывает на название движка. Устанавливаем значение gost
- Параметр dynamic_path указывает на путь до динамической библиотеки libgost
- Параметр default_algorithms указывает на использование движком всех алгоримов, которые есть в движке
- Параметр CRYPT_PARAMS опция только для библиотеки libgost. Позволяет пользователю выбирать наборы параметров симметричного алгоритма шифрования. Без этой опции не будет работать опция -gost89, что в свою очередь ведёт к тому, что при шифровании данных вместо GOST 28147-89 используется rc2-cbc.
Далее находим расположение библиотеки libgost.so
Если библиотека не расположена по путь, указанному в файле конфигурации с предыдущего шага (/usr/lib/ssl/engines/libgost.so), то создаём симлинк
- Внимательно проверяем путь и архитектуру библиотеки того места, откуда мы ставим симлинк!
Проверка правильности настройки можно командой
в ответ должны получить что-то в виде:
На этом всё, поддержка ГОСТ алгоритмов в OpenSSL включена! С чем, собственно, можно и поздравить!
Источник — документация проекта OpenSSL
Взаимодействие с ГИС ЖКХ с помощью stunnel и openssl по ГОСТу
Встала перед нами в полный рост задача наладить взаимодействие с ГИС ЖКХ. Согласно документации, предполагается использование небезызвестного отечественного ПО для шифрования туннеля и формирования ЭЦП по ГОСТу, но это не наш метод. Вооружившись гуглом и консолью, я и slavam реализовали необходимый функционал подручными средствами.
Всё необходимое ПО есть как на Linux, так и на Windows платформах, потому методику можно назвать мультиплатформенной.
Подготовка
Взаимодействие состоит из следующих частей:
- Установка по ГОСТу шифрованного туннеля до серверов ГИС ЖКХ.
- Формирование и отправка подписанного XML запроса.
- Получение и проверка ответа.
Для работы используется сервер CentOS 6, Python 2.7.11, OpenSSL + GOST engine, stunnel. Краткая инструкция установки openssl с поддержкой ГОСТ
Думаю, ничего сложного быть не должно и всё уже сотни раз описано. А в более свежих дистрибутивах модуль gost есть из коробки.
OpenSSL используется двояко: с ним собран stunnel, что-бы работал по ГОСТу; и утилита openssl вызывается из кода python-а для формирования и проверки подписей. Вызов openssl обусловлен тем, что не удалось из кода python-на задавать используемый крипто-модуль. Всё необходимое ПО есть как на Linux, так и на Windows платформах, потому методику можно назвать мультиплатформенной.
Для python-а сервера CentOS 6 нужно будет обновить библиотеку lxml, а для этого поставить несколько дополнительных пакетов:
Так же нам потребуются файлы сертификата и закрытого ключа в формате PKCS12 (.pem). Получить их из eToken-а можно с помощью утилит вроде P12FromGostCSP или вручную. Если сделать это по каким-либо причинам не получается, то есть вариант работы с ключом «Рутокен ЭЦП» напрямую. На сайте есть подробные инструкции, как обучить этому OpenSSL и stunnel. Таким образом, задача сводится к предыдущей. У меня под рукой такого ключа не оказалось, потому проверить не удалось.
Криптотуннель по ГОСТу
Туннель поднимается с помощью Stunnel, который работает в режиме прокси. Нужно только научить его использовать модуль gost. Но тут есть момент — чтобы модуль инициализировался правильно, нужно слегка исправить исходники. Проблема, как я понял, связана с порядком инициализации модуля и методов. Итак:
Правим файл src/options.c и в конце функции » NOEXPORT char *engine_init(void) » добавляем вызов SSL_library_init();.
Решение было найдено тут.
Собираем с подключением ранее собранного OpenSSL:
Файл конфигурации /etc/stunnel.conf:
Файлы сертификатов кладём в директорию /etc/crypto/. В общем случае, stunnel может работать под любым пользователем, но у нас пусть будет root.
Если вывод совсем не похож, то внимательно смотрим в лог файл /var/log/stunnel.log.
Формирование XMLDSig
Когда туннель до сервера ГИС ЖКХ настроен и работает, можно слать туда всякие запросы и получать нужные ответы. Запрос отправляется в виде XMLDSig, в котором содержится сам запрос, хеш этого запроса, хеш сертификата, сам сертификат, подпись хеша запроса с хешем сертификата и куча полей, всё это описывающих. Самое сложное как раз было раскрутить всю цепочку и получить XML, который успешно проходит проверку со стороны ГИС ЖКХ. Все подписываемые блоки берутся в каноническом виде, а получаемые подписи и хеш-суммы кодируются в BASE64.
Алгоритм формирования XMLDSig можно реализовать используя любой удобный язык программирования. Мы использовали python 2.7.11, демонстрационный код прилагается. Как пример, буду так же приводить консольный аналог.
0. Из сертификата достаются серийный номер и данные о выпустившем, генерируются необходимые id и запоминается текущее время.
1. С помощью любого soap клиента (например, suds на Python) формируется SOAP-запрос к серверу ГИС ЖКХ.
2. Берётся содержимое тега (точнее часть с Id и без первого и последнего символа перевода строки), канонизируется алгоритмом C14N (exclusive=True), считается от неё хеш-сумма по ГОСТу и выводится в виде BASE64. Получаем digest1 . Консольный аналог:
* openssl с поддержкой ГОСТ. Engine указан явно, но, настроив openssl.cnf, можно этого и не делать.
3. Берётся сертификат в x509, декодируется из BASE64, считается от него хеш-сумма и вывод кодируется в BASE64. Получаем digest2 .
4. Используя полученные данные, формируется содержимое тега (см. Шаблон), канонизируется алгоритмом C14N (exclusive=False) и от содержимого считается digest3 (BASE64).
5. Формируется блок , канонизируется алгоритмом C14N (exclusive=False), подписывается и кодируется в BASE64. Получается значение блока . Консольный аналог:
где SignedInfo.xml – уже канонизированный блок, без последнего перевода строки.
6. Все полученные значения вносятся в
Этот шаблон удалось сформировать расковыряв и проанализировав комплекс, который рекомендует использовать ГИС ЖКХ. Сам он находится в свободном доступе, но для работы требует СКЗИ КриптоПро CSP и СКЗИ Trusted Java 2.0.
7. Для того, чтобы проверить сформированную таким образом подпись, необходимо проделать все действия в обратном порядке. Консольный вариант проверки подписи:
где signature.sig – раскодированная из BASE64 подпись, а SignedInfo.xml проверяемый блок . целиком. Значения хеш-сумм просто сравниваются.
Демонстрационный код на python-е можно взять и использовать (на свой страх и риск) отсюда. Автор кода — Вячеслав (@slavam, RO). Подобный алгоритм можно реализовать средствами любого удобного языка, без необходимости покупки каких-либо дополнительных средств и компонентов. Вызов утилит OpenSSL из кода хоть и выглядит топорным, зато работает как на Linux так и на Windows платформе и позволяет отказаться от использования КриптоПро и дополнительных компонентов.
Система взаимодействия с ГИС ЖКХ у нас ещё на стадии создания, но получаемый XMLDSig проходит необходимые проверки.
Надеемся, эта статья облегчит кому-нибудь задачу по реализации подобного велосипеда.
UPD
В порядке взаимодействия с ГИС ЖКХ происходят изменения. С актуальными правилами можно ознакомится на сайте. Основные изменения:
- Теперь для работы с системой необходимо зарегистрировать ИС.
- Перед тем, как слать запросы, необходимо выполнить basic-авторизацию.
- Для работы с тестовым стендом, также нужно подать заявку.
Так же появились вполне приличные программные примеры, которые (если постараться) можно подружить и с OpenSSL.
UPD2
Чтобы завести OpenSSL под windows с поддержкой ГОСТ нужно:
1. Поставить OpenSSL от сюда, он уже с поддержкой GOST, в папке lib есть соответствующая библиотека: gost.lib .
2. В файле конфигурации явно указать его использование:
Чтобы точно определить, от куда OpenSSL читает конфигурацию, можно выставить переменную окружения: