- Openssl gost 2012 windows
- OpenSSL и ГОСТ
- Содержание
- Применимость
- Установка и настройка
- Формирование запроса на сертификат с поддержкой алгоритма ГОСТ (пример)
- Получение контрольной суммы используя алгоритмы ГОСТ
- Openssl gost 2012 windows
- Openssl gost 2012 windows
- Шифрование TLS-трафика по алгоритмам ГОСТ-2012 c Stunnel
- Подготовительный шаг
- Простой способ (работает под Windows и Linux)
- Через командную строку
- Конфигурирование Stunnel
Openssl gost 2012 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.
Openssl gost 2012 windows
ВНИМАНИЕ! Используйте OpenSSL версии 1.1.0 или новее
Загрузите модуль интеграции (rtengine) в составе Комплекта разработчика Рутокен с нашего сайта .
Загрузите и установите библиотеку PKCS#11 с нашего сайта .
Установить OpenSSL 1.1.0 или новее.
Модифицируем конфигурационный файл OpenSSL (для Linux: / usr/lib/ssl/openssl.cnf , в Windows файл находится в директории установки OpenSSL). Добавляем следующую информацию в начало файла:
openssl_conf = openssl_def
и в конец файла:
[ openssl_def ]
engines = engine_section
[ engine_section ]
rtengine = gost_section
[ gost_section ]
dynamic_path = /path/to/librtengine.so
MODULE_PATH = /path/to/librtpkcs11ecp.so
RAND_TOKEN = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP
default_algorithms = CIPHERS, DIGEST, PKEY, RAND
dynamic_path — путь до библиотеки rtengine .
MODULE_PATH — путь до библиотеки lib rtpkcs11ecp .
RAND_TOKEN — идентификатор токена откуда будет браться энтропия (в формате pkcs11 uri .)
Возможные компоненты идентификатора:
manufacturer: ID производителя токена;
model: модель токена;
serial: серийный номер токена;
token: метка токена (поле «label»).
Работа с rtengine без токена
Для того, чтобы шифровать и выписывать ГОСТ сертификаты с помощью rtengine без подключенного Рутокена необходимо:
- Убрать из конфигурационного файла секцию RAND_TOKEN, чтобы энтропия не бралась с Рутокена.
- Убрать опцию RAND из default_algorithms .
Для систем на базе Windows все аналогично.
5. Создайте переменную среды OPENSSL_CONF , записав туда путь до конфигурационного файла.
Для Linux, например, выполните, запустив bash :
Openssl gost 2012 windows
Docker image with OpenSSL 1.1.1, GOST engine and cURL
This image was built to have ability to connect to servers with GOST SSL certificates. In addition, it helps to encrypt, decrypt, hash messages with GOST algorithms.
Since version 1.1.1 OpenSSL does not contain GOST-engine anymore, but it can be compiled and used separately. This image does this work.
Output of openssl ciphers supports:
There are some issues with OpenSSL 1.1.1 and GOST-engine (GOST ciphers are not in list), so versions are fixed in default docker’s build args.
You can pull my docker container: docker pull gosha20777/openssl-gost:dev . if you want to build a docker image yourself or build it into your host mashine, see the instructions below.
Build form sh script
The image has been built and pushed into https://hub.docker.com/repository/docker/gosha20777/openssl-gost. In examples below I use image rnix/openssl-gost from Docker Hub, but you can build this image for you own and use your tag.
As usual, you can run commands directly from host or you can use ‘interactive mode’ with -i . Pull the image and run a container with mounted current dir in interactive mode:
Run command with mounted current dir without interactive mode:
If you use Windows, pwd is incorrect. Use absolute path instead, for example:
In the container you run commands.
To show certificate of host with GOST
To send a file to host with POST and save the response into new file
To generate new key and certificate with Signature Algorithm: GOST R 34.11-94 with GOST R 34.10-2001
To sign file with electronic signature by GOST using public certificate (-signer cert.pem), private key (-inkey key.pem), with opaque signing (-nodetach), DER as output format without including certificate and attributes (-nocerts -noattr):
To extract data (verify) from signed file (DER-format) using public certificate (-certfile cert.pem) issued by CA (-CAfile cert.pem) (the same because cert.pem is self-signed):
Certification authority (CA)
In Russia, it is common to issue GOST-certificates signed by CA which are not worldwide trusted. In this case you get error. For example, curl: (60) SSL certificate problem: unable to get local issuer certificate . To solve this problem you have two options: 1) do not verify CA (not recommended), 2) find and use CA.
To ignore security error use -k with curl and -noverify with openssl. For example curl https://gost.examples.com -k or openssl cms -verify -noverify .
Find and download CA-certificate file. For example, CryptoPRO CA. It is PKCS7, but you need PEM. Run command to extract all certificates from p7b and write them as a chain of certificates in one file:
When you have CA-file you can:
- Install it in default CA certificate store
- Specify it in every openssl or curl command
To install it in default CA certificate store use commands:
To specify it in curl:
To specify it in openssl with verifying signature:
Usage in other Dockerfiles
Compiled libraries can be used in other Dockerfiles with multi-stage approach. Basic template is in any-gost directory. Working example with PHP is in php-fpm-gost directory.
There some notices:
- OpenSSL and cURL are build in custom directory /usr/local/ssl and usr/local/curl which contain bin , include , lib .
- Before compiling the main Dockerfile folders /usr/local/ssl and usr/local/curl should be copied into new image.
- During building packages openssl and curl can be installed and overwrite new /usr/bin/openssl and /usr/bin/curl .
- Specify paths of libraries in configuring scripts to new locations.
Шифрование TLS-трафика по алгоритмам ГОСТ-2012 c Stunnel
В этой статье я хочу показать, как настроить Stunnel на использование российских криптографических алгоритмов в протоколе TLS. В качестве бонуса покажу, как шифровать TLS-канал, используя алгоритмы ГОСТ, реализованные в криптоядре Рутокен ЭЦП 2.0.
Но для начала давайте вообще разберёмся для чего нужен Stunnel. В двух словах — это программа, на которую можно переложить всю логику шифрования трафика между сервером и клиентом. Делается это следующем образом: допустим у вас есть клиент и сервер, которые общаются между собой без использования шифрования, аутентификации и проверки целостности. Вы могли бы переписать клиент и сервер так, чтобы все исходящие и входящие сообщения передавались между собой с учётом всех этих моментов, но для чего такие сложности, если можно это просто переложить на плечи другому приложения? Для решения такой задачи как раз подойдёт Stunnel.
Вам нужно просто настроить клиент таким образом, чтобы весь свой трафик он передавал на клиентский Stunnel, в свою очередь, он устанавливает безопасное соединение с сервером, отправляя данные на серверный Stunnel. Stunnel на сервере расшифровывает пришедший трафик и перенаправляет данные на вход серверу. Вышесказанное проще осознать глядя на эту диаграмму
Стоит заметить, что на сервере не обязательно должен стоять именно Stunnel, для работы с криптографическими алгоритмами. Здорово, что есть готовые демонстрационные стенды, которые поддерживают российскую криптографию, список которых есть в презентации с РусКрипто’2019.
Нам нужны стабильно работающие серверы, осуществляющие двухстороннюю аутентификацию.
Мы выбрали серверы КриптоПро как наиболее надёжные с полной реализацией стандарта ГОСТ TLS. Спасибо им за это 🙂
Звучит достаточно просто, давайте попробуем организовать этот процесс.
Подготовительный шаг
- OpenSSL
- Stunnel
- rtengine
- Доступ к тестовым серверам КриптоПро, для проверки соединения по TLS
OpenSSL для Windows можно взять отсюда, а для пользователей линукса — из репозиториев или собрать самому, скачав свежую версию отсюда. Также его можно взять из Rutoken SDK, из директории openssl\openssl-tool-1.1, этот архив нам будет полезен и дальше, т.к. в нём находится интересующий нас rtengine. Stunnel можно найти здесь. Для работы необходима версия >= 5.56.
Скачать rtengine можно из Rutoken SDK, он лежит в директории openssl\rtengine\bin. Закинуть его нужно туда, где хранятся все движки openssl. Узнать путь до них можно с помощью
Но просто переместить движок в нужную папку — мало, нужно ещё сконфигурировать сам openssl для работы с ним. Узнаём где лежит файл с конфигурацией openssl.cnf с помощью той же команды, что указана выше (под виндой stunnel идёт с собственной версией openssl, поэтому файл с конфигурацией лежит в path\to\stunnel\config\openssl.cnf
Давайте проверим, что rtengine подключился, для этого подключим токен и выведем список всех алгоритмов шифрования:
Напомню, что в Windows нужно проверять на openssl, который лежит рядом с stunnel
Если среди них будут присутствовать наши ГОСТы, значит всё настроено верно.
Настало время самого интересного: проверка установки соединения по ГОСТу с тестовыми серверами КриптоПро. Список данных серверов описан здесь (https://www.cryptopro.ru/products/csp/tc26tls). Каждый из этих серверов работает со своими алгоритмами для аутентификации и шифрования. Более того на портах 443, 1443, 2443,… запущены сервисы, которые воспринимают только определённые парамсеты. Так, например, по адресу http://tlsgost-256auth.cryptopro.ru происходит шифрование с аутентификацией с использованием алгоритмов GOST2012-GOST8912-GOST8912 и 256-битным ключом. Так же на порту 443 используется XchA-ParamSet, на порту 1443 — XchB-ParamSet, на порту 2443 — A-ParamSet и т.д.
Теперь, когда мы знаем, какой ключ нам нужен, давайте получим корневой сертификат от тестового сервера, выработаем ключи для работы и подпишем запрос на наш сертификат.
Простой способ (работает под Windows и Linux)
Через командную строку
Для того, чтобы получить корневой сертификат, зайдём на сайт тестового УЦ ООО «КРИПТО-ПРО». И нажмём на кнопку для получения сертификата. Отобразится новая вкладка, в которой нужно будет выбрать метод шифрования Base64 и нажать на кнопку «Загрузка сертификата ЦС». Полученный файл certnew.cer сохраняем.
Теперь генерируем ключи.
Стоит заметить, что сгенерированные на токене ключи не могут быть скопированы с токена. В этом состоит одно из основных преимуществ их использования.
Создадим запрос на сертификат:
Опять открываем сайт тестового УЦ, но на этот раз нажимаем на кнопку «Отправить готовый запрос PKCS#10 или PKCS#7 в кодировке Base64». Вставляем в поле содержимое нашего запроса, нажимаем на кнопку Выдать и загружаем сертификат user.crt в формате Base64. Полученный файл сохраняем
Остался последний вопрос: Для чего всё это. Зачем мы получали все эти сертификаты, ключи и запросы?
Дело в том, что они нужны протоколу TLS для двусторонней аутентификации. Работает это очень просто.
У нас есть сертификат сервера, и мы считаем его доверенным.
Наш клиент проверяет, что сервер, с которым мы работаем имеет аналогичный сертификат.
Сервер же хочет убедиться, что работает с пользователем, который ему известен. Для этого мы и создавали запрос на сертификат для работы через наши ключи.
Мы отправили этот запрос и сервер подписал её своей ЭЦП. Теперь мы можем каждый раз предъявлять этот сертификат, подписанный корневым УЦ, тем самым подтверждая, что мы — это мы.
Конфигурирование Stunnel
Осталось только правильно настроить наш туннель. Для этого создадим файл stunnel.conf с настройками Stunnel по умолчанию и напишем туда следующее:
Теперь, если всё сделано правильно, можно запустить Stunnel с нашей конфигурацией и подключиться к серверу:
Откроем браузер и зайдём по адресу localhost:8080. Если всё верно, то отобразится следующее:
Если же нет, то смотрим логи и используем отладчик, чтобы понять в чём же всё-таки проблема.
Если у вас остались какие-то вопросы, то милости просим в комментарии 🙂