Gostengy для openssl windows

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.

Процессинг собственными руками

четверг, 12 июля 2012 г.

openssl, ГОСТ (gost) и мои кривые руки

Сразу забегая вперед расскажу, что с грехом пополам настроил.

Решил я проверить, а как будет работать nginx с шифрацией по ГОСТу.

Для алгоритмов ГОСТ существуют четыре шифрсьюта GOST2001-GOST89-GOST89;
GOST2001-NULL-GOST94; GOST94-GOST89-GOST89; GOST94-NULL-GOST94.
После 31 декабря 2007 года шифрсьюты GOST94-GOST89-GOST89 и GOST94-NULLGOST94 использоваться не должны.

Ну ладно. Качаем 3(!) дистрибьютива openssl в каждом из которых заявлена поддержка ГОСТа
1) openssl 0.9.8x — сам ошибся — он не поддерживает ГОСТ. Поддержка началась только с 1.0.0, до этого были неофициальные патчи от КриптоКом.
2) openssl 1.0.1с
http://slproweb.com/download/Win32OpenSSL-1_0_1c.exe 18 405 907
3) openssl 0.9.8e МагПро
http://www.cryptocom.ru/binary/MagPro_CryptoPack/Windows/cryptopack-trial.exe 1 751 049

А теперь протестируем поддержку ГОСТа:

C:\openssl\bin>openssl.exe ciphers

openssl 0.9.8e МагПро

DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-
SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5
:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5

openssl 1.0.1с

ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA
:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RS
A-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256
-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SH
A:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ECDH-RSA-
DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA25
6:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DHE-DSS-AES128-GCM-SHA256:DHE-R
SA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DHE-RSA-CAMELL
IA128-SHA:DHE-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES1
28-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDH
E-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC
-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5

Вот и верь после этого людям 🙁

Продолжение №2

Запускаю на тестовой машине (виртуальная машина под VirtualBox Windows XP SP2) и что же я вижу:

GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89 :DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-D
ES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD
5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SH
A:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5

Ok. ГОСТ есть на тестовой машине под openssl 0.9.8e МагПро , а тот же openssl 0.9.8e МагПро на Windows7 не предложил ГОСТы?
Будем разбираться.

Продолжение №3

Смотрим в ENV (команда set в командпромпте)
WinXP — все тихо
Win7 — есть странная переменная
OPENSSL_CONF=C:\OpenSSL\bin\openssl. cfg
обратите внимание на расширение!

openssl 0.9.8e МагПро высасывает конфигурацию по умолчанию из файла openssl. cnf
который должен лежать в директории c:\openssl\, а не c:\openssl\bin\

Читайте также:  Браузеры для mac os chrome

Вот в этом то собака и порылась.
Причиной тому послужило попеременная установка импортного openssl 1.0.1c и отечественного МагПро.
Будьте внимательно, что и куда суют инсталляторы!

Для того чтобы openssl 0.9.8e МагПро показал ГОСТы нужно чтобы было в конфиге

[ openssl_def ]
engines = engine_section
[ engine_section ]
gost=gost_section
[gost_section]
default_algorithms=ALL
engine_id=gost

после чего наблюдаем родные ГОСТы:

GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89: DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES
-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA
:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD
5:EXP-RC4-MD5

Как добавить поддержку ГОСТ 34.10 2012 в CentOS/Redhat 7

Похожие статьи

Как установить RabbitMQ в CentOS7

Как сделать дамп только нужных записей из базы данных

Генератор веб сценариев проверки для Zabbix

Именно с такой задачей я столкнулся несколько дней назад на работе. Требовалось организовать поддержку ГОСТовых алгоритмов шифрования в CentOS/Redhat 7, чтобы работать с сайтом госуслуг. Сразу оговорюсь, поддержка была добавлена в OpenSSL, curl и PHP 7.1 путем сборки из исходников.

Поддержка ГОСТ алгоритмов осуществляется с помощью модуля GOST Engine, добавляемого в OpenSSL.

Инструкция является сборной солянкой из найденного в интернете и адаптирована под CentOS 7, права на оригинальные инструкции, части которых были использованы принадлежат их авторам.

Исходные данные

Начнем с того, что у меня было:

  • 1 сервер на CentOS 7 (площадка разработки)
  • 3 сервера на Redhat 7 (боевые площадки)
  • OpenSSL 1.0.2k – последняя доступная версия в репозиториях Centos/Redhat 7
  • PHP 7.1.33 (FPM) из репозитория Remi (в режиме MultiVersion)
  • Подключены репозитории EPEL/Remi
  • На Redhat серверах ограничен доступ внешним ресурсам, поэтому часть того, что на CentOS 7 была скачана wget`ом, тут была загружена с помощью копирования скаченного архива на сервер.
  • В PHP была добавлена поддержка БД MySQL и PostgreSQL (MariaDB 10 и PostgreSQL 10 соответственно).

Общий план работ

  • Создание резервной копии директории /etc
  • Обновить ОС на сервере
  • Сборка OpenSSL 1.1.х
  • Сборка GOST Engine
  • Сборка Curl
  • Сборка PHP
  • Фиксация версий

Сборка OpenSSL

Для начала установим необходимые компоненты, а именно: подключим репозиторий EPEL (если не подключен), cmake3

Теперь удалим установленный OpenSSL, он мешает сборке, позже мы его вернем, для обратной совместимости. Предварительно сделайте резервные копии конфигов из /etc т.к. удалятся все зависимые пакеты (у меня удалился как минимум certbot).

Проверим, что OpenSSL удалился, попытавшись вызвать его:

В результате должны получить ошибку, что он не установлен.

Скачиваем OpenSSL 1.1.0g в любую удобную директорию , только с ним у меня корректно все заработало и собралось. Если доступ к внешним ресурсам ограничен, то загрузите архив на сервер любым доступным вам способом, имя архива должно быть openssl-1.1.0g.tar.gz

Распаковываем загруженный архив:

Переходив в директорию openssl-1.1.0g

Запускаем конфигурацию OpenSSL, по окончании всей сборки (последующие этапы) он будет установлен в /usr/local/ssl/

Теперь запускаем сборку и после ее успеха – установку:

Делаем симлинк на новый OpenSSL:

Теперь проверим доступность OpenSSL, он должен быть доступен в /usr/bin/openssl и вызываться обычной командой openssl:

В результате вы должны получить OpenSSL 1.1.0g

На этом сборка OpenSSL окончена, теперь добавим в него поддержку GOST шифрования.

Сборка GOST Engine

Перейдем в директорию, где будем осуществлять сборку:

Скачиваем архив с GOST Engine, к сожалению у меня не заработала последняя версия, поэтому загружаем архив, с которым все успешно собиралось. Если доступ к внешним ресурсам ограничен, то загрузите архив любым доступным вам способом и именем gost-engine.zip в эту же директорию.

Читайте также:  Kak ustanovit linux windows

Переходим в директорию распакованного архива

При сборке и работе могут дублироваться сообщения о том, что GOST Engine уже загружен, поэтому спрячем это сообщение сразу в исходниках:

Создадим директорию build, где будем осуществлять сборку и сразу перейдем в нее:

Сконфигурируем систему сборки:

И теперь соберем наш GOST Engine:

Выйдем в директорию bin выше уровнем

Скопируем утилиту gost12sum в директорию /usr/local/bin/

Выйдем еще выше уровнем

Скопируем собранный движок gost.so в директорию engines-1.1 openssl

Добавим конфигурацию для GOST Engine в файл конфигурации OpenSSL:

Теперь проверим, что движок GOST подключился:

В результате должен появиться список из доступных движков, где будет присутствовать gost:

Проверим список доступных шифров и найдем среди них интересующий нас GOST:

В результате вы должны получить следующий список:

Как видите, теперь OpenSSL умеет работать с ГОСТ шифрами. При генерации ключа нужный гост вызывается через -newkey gost2012_256

Сборка Curl

Перейдем в директорию, где будем выполнять сборку:

Теперь загрузим нужную версию Curl. У меня заработало только с 7.59.0. Если доступ к внешним ресурсам ограничен, то загрузите архив любым доступным вам способом с именем curl-7.59.0.tar.gz

Перейдем в распакованную директорию

Сконфигурируем Curl для работы с нужной версией OpenSSL

Теперь соберем и установим Curl:

Переименуем оригинальный (системный) curl в curl_real:

Сделаем симлинк на свежесобранный curl в /usr/bin/curl

Ну и проверим версию собранного curl:

В результате вы должны получить нечто подобное:

На этом и сборку Curl мы закончили.

Теперь соберем PHP

Сборка PHP

При сборке PHP в RedHat 7 столкнулся с тем, что не все devel компоненты есть в стандартных репозиториях (в том числе EPEL). Поэтому пришлось скачать их с помощью другой CentOS 7 системы и закинуть в Redhat 7 нужные rpm файлы.

Только для RHEL:

В любом доступной вам CentOS 7 системе установите yum-utils:

После чего скачайте rpm файлы нужных библиотек:

В результате вы получите набор rpm файлов, берите те, что оканчиваются на .x86_64.rpm и копируйте в RHEL систему любым доступным вам способом.

После чего установите эти rpm файлы:

yum localinstall *.x86_64.rpm

Общая инструкция:

Удалим devel компоненты zlib, они могут мешать сборке:

Перейдем в директорию, где будем собирать PHP

В зависимости от того, какая БД вам нужна (мне пришлось собирать на Dev сервере с поддержкой MySQL и PostgreSQL, а на Prod серверах только с PostgreSQL) – установите нужные пакеты:

MySQL:

PostgreSQL:

Удалим devel компоненты openssl, если они установлены:

Создадим директорию, где позже расположим конфигурационные файлы модулей PHP:

Загрузим PHP 7.1.33, именно эта версия у меня была установлена из Remi. Если доступ к внешним ресурсам ограничен, то загрузите архив любым доступным для вас способом в директорию /usr/src и именем php-7.1.33.tar.gz

Распакуем полученный архив

И перейдем в распакованную директорию:

Сделаем первичную конфигурацию:

Теперь в зависимости от поддержки нужных БД, сконфигурируем PHP. Если нужна поддержка обеих версий – добавьте разница одного варианта в другой, и не забудьте установить пакеты для обеих БД

Читайте также:  Docker run container linux

MySQL:

PostgreSQL:

Очищаем директорию сборки

Далее есть один нюанс, если доступ к внешним ресурсам у вас ограничен, то последующие шаги у вас не завершатся успехом т.к. PHP пытается скачать PEAR из внешних источников.

Чтобы эту проблему решить – скачаем и положим нужный файл, в нужное место.

Загрузите файл с именем install-pear-nozlib.phar

После чего загрузите его в директорию /usr/src/php-src-php-7.1.33/pear/ любым доступным вам способом.

Приступим непосредственно к сборке и установке:

Процесс довольно длительный, после окончания процесса, создадим симлинки на новую версию PHP

Приведу список команд без комментариев, но общий принцип таков, что если файл есть – переименовываем его с суффиксом _old

Файлы конфигурации (php.ini и php-fpm.conf) я брал из Remi

И подключим OpCache модуль:

Сами конфиги пулов у меня лежат по иному пути, а т.к. я скопировал старый php-fpm.conf – то и новый php-fpm запустит их оттуда же.

Теперь создадим Systemd сервис для нашего php-fpm, для этого создайте любым удобным для вас редактором файл /usr/lib/systemd/system/php-fpm.service

И заполните его следующим:

Перезагрузите список демонов:

Теперь можно останавливать старый FPM и запускать новый. Старый у меня был доступен под именем php71-php-fpm, а новый просто php-fpm:

И добавим/исключим в автозагрузку сервисы:

На этом основная часть закончена. Теперь не менее важный этап – установка Openssl (да, того самого, из репозитория) и блокировка обновлений.

Установим снова openssl, для обратной совместимости:

При установке openssl подменит наш симлинк, поэтому вернем всё к нашей версии:

И восстановим симлинк:

Теперь зафиксируем версии openssl и curl, чтобы они не начали обновляться. От PHP из Remi мы уже не зависим, поэтому не блокируем.

Установите модуль yum – versionlock

Важное замечание по OpenSSL

После пары дней работы заметил, что начал при работе с сервисами (использующие SSL/TLS) ошибку вроде:

Думал где-то в коде проблема, а оказалось в другом. OpenSSL хранит некоторое количество сертификатов (корневые) и при сборке из исходников они не подтягиваются. Т.к. у нас установлен openssl в любом случае (системный), то актуальный список сертификатов у нас есть, а значит его мы можем симлинками подкинуть в нашу версию openssl. Приведу несколько команд, без комментариев. Сутя такая, что удаляем пустые папки и на их место кидаем симлинки.

Заключение

Т.к. мне требовались конкретные версии PHP и собралось оно только на определенных версиях всех перечисленных выше компонентов – то привел инструкцию как оно точно собирается, не исключено, что и на других версиях оно соберется. Другие версии сам не пробовал т.к. требовалось запустить сервис клиента как можно скорее (как обычно у клиента всё в последний день).

Знаю, что это всё можно было оптимизировать, как-то систематизировать, но нужно было решить задачу в кратчайшие сроки, а найденные в интернете инструкции были слишком разрознены, либо сводились к использованию только в docker, либо только в Deb системах.

Инструкция в общем плане подходит и для более свежих версий PHP (с теми же версиями openssl/gost/curl), но придется повозиться с зависимостями и конфигурацией.

Итого имеем: Openssl 1.1.0g, Gost Engine, Curl 7.59.0, PHP 7.1.33

Оцените статью