- OpenSSL и ГОСТ
- Содержание
- Применимость
- Установка и настройка
- Формирование запроса на сертификат с поддержкой алгоритма ГОСТ (пример)
- Получение контрольной суммы используя алгоритмы ГОСТ
- Процессинг собственными руками
- четверг, 12 июля 2012 г.
- openssl, ГОСТ (gost) и мои кривые руки
- openssl 0.9.8e МагПро
- openssl 1.0.1с
- Продолжение №2
- Продолжение №3
- Как добавить поддержку ГОСТ 34.10 2012 в CentOS/Redhat 7
- Похожие статьи
- Как установить RabbitMQ в CentOS7
- Как сделать дамп только нужных записей из базы данных
- Генератор веб сценариев проверки для Zabbix
- Исходные данные
- Общий план работ
- Сборка OpenSSL
- Сборка GOST Engine
- Сборка Curl
- Сборка PHP
- Важное замечание по 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.
Процессинг собственными руками
четверг, 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\
Вот в этом то собака и порылась.
Причиной тому послужило попеременная установка импортного 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 в эту же директорию.
Переходим в директорию распакованного архива
При сборке и работе могут дублироваться сообщения о том, что 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. Если нужна поддержка обеих версий – добавьте разница одного варианта в другой, и не забудьте установить пакеты для обеих БД
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