使用Ruby中的OpenSSL进行GOST数字签名验证

时间:2014-04-14 21:38:30

标签: ruby openssl gost3410

我有我的证书,源文档,Base64格式的分离签名。由UEC(通用电子卡 - 俄罗斯智能卡项目)在Windows上的CryptoARM程序创建的签名(我认为GOST hash function is used)。

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

我在Ubuntu CA商店中安装了UEC CA sertificate:

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">

所以,我真的不知道为什么它只是返回假,我的发动机负载是否会影响任何东西。怎么说PKCS7#verify使用GOST引擎提供的正确算法?

有什么想法吗?

文件:

P.S。要使OpenSSL正常工作,需要执行下一步(找到here):

此字符串应添加到/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

1 个答案:

答案 0 :(得分:1)

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

engine.set_default(0xFFFF)

它有效!!!

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