Проверка цифровой подписи ГОСТ с OpenSSL в Ruby

77
9

У меня есть мой сертификат, исходный документ, отдельная подпись в формате Base64. Подпись, созданная UEC (Universal Electronic Card - проект русской смарт-карты) в Windows в программе CryptoARM (я думаю, используется функция хеша ГОСТа).

Я использую Ubuntu 13.10 и установил OpenSSL 1.0.1e (поддержка GOST включена по умолчанию AFAIK).

Я установил сертификат UEC CA в хранилище CA Ubuntu:

sudo cp ~/uec/uec.cer /usr/local/share/ca-certificates/uec.crt
sudo update-ca-certificates

И проверка консоли завершается успешно (конечно, если файл не был изменен):

$ openssl smime -verify -engine gost -inform DER -in ~/uec/to_be.txt.sig -content ~/uec/to_be.txt 
engine "gost" set.
Verification successful
Original file contents goes here

Итак, я пытаюсь сделать проверку в Ruby (2.0.0 и 2.1.0), как указано в этом вопросе: проверка цифровой подписи с помощью OpenSSL

require 'openssl'
OpenSSL::Engine.load
engine = OpenSSL::Engine.by_id('gost')

cert_store = OpenSSL::X509::Store.new
cert_store.set_default_paths
my_cert = File.read('/home/envek/uec/envek-b64.cer')
data = File.read('/home/envek/uec/to_be.txt')
signature = OpenSSL::PKCS7.new(File.read('/home/envek/uec/to_be.txt.der.sig'))

signature.verify([my_cert], cert_store, data, OpenSSL::PKCS7::DETACHED || OpenSSL::PKCS7::NOVERIFY)
# => false
signature
# => #<OpenSSL::PKCS7:0x00000002168918 @data="\xEF\xBB\xBF\xD0\xAD\xD1\x82\xD0\xBE \xD1\x84\xD0\xB0\xD0\xB9\xD0\xBB, \xD0\xBA\xD0\xBE\xD1\x82\xD0\xBE\xD1\x80\xD1\x8B\xD0\xB9 \xD1\x8F \xD0\xBF\xD0\xBE\xD0\xB4\xD0\xBF\xD0\xB8\xD1\x88\xD1\x83", @error_string="unsupported algorithm">

Таким образом, я действительно не знаю, почему он просто возвращает false, загружает ли мой двигатель что-то или нет. Как сказать PKCS7#verify правильность алгоритма, предусмотренного движком ГОСТ?

Есть идеи?

файлы:

PS Для правильной работы OpenSSL необходимо выполнить следующие шаги (см. Здесь):

Эта строка должна быть добавлена в верхней части /etc/ssl/openssl.cnf

openssl_conf = openssl_def

Эти строки должны быть добавлены в нижней части /etc/ssl/openssl.cnf

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

После этого следующая команда должна показать следующий вывод:

$ openssl ciphers | tr ":" "\n" | grep GOST
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

спросил(а) 2021-01-25T12:47:07+03:00 4 месяца, 3 недели назад
1
Решение
63

Странно, я просто попытался вызвать метод OpenSSL::Engine#set_default со значением 0xFFFF. Просто:

engine.set_default(0xFFFF)

И это работает !!!

Документация абсолютно не понятна. Что он делает, какие флаги он получает в качестве значений? Кто-нибудь, объясните, пожалуйста.

ответил(а) 2021-01-25T12:47:07+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема