2

我有 Base64 格式的证书、源文档和分离签名。UEC(通用电子卡 - 俄罗斯智能卡项目)在 Windows 上在 CryptoARM 程序中创建的签名(我认为使用了 GOST 哈希函数)。

我正在使用 Ubuntu 13.10 并安装了 OpenSSL 1.0.1e(默认情况下包括 GOST 支持 AFAIK)。

我已经在 Ubuntu CA 商店中安装了 UEC CA 证书:

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)中进行验证,如以下问题所述:Digital signature verification with 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使用 GOST 引擎提供的正确算法?

有任何想法吗?

文件:

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
4

1 回答 1

1

奇怪的事情,我刚刚尝试OpenSSL::Engine#set_default用它的值调用方法0xFFFF。只是:

engine.set_default(0xFFFF)

它有效!

文档绝对不清楚。它做什么,它接收什么标志作为值?任何人,请解释我。

于 2014-04-14T21:57:07.297 回答