我在Ubuntu 17.10上尝试使用智能卡签名字符串。我需要的是一个pkcs7-signedData
对象。我可以使用下面的命令进行一些签名,然后获得一些二进制foo.sig
文件。它是什么?如何使其成为PKCS#7签名?
$ echo foobar | pkcs11-tool --module ./VdsPKCS1164.so --login --pin $PIN \
--sign --id 5378 --output-file foo.sig
Using slot 0 with a present token (0x1)
Using signature algorithm RSA-PKCS
$ openssl asn1parse -in foo.sig
Error: offset too large
$ openssl asn1parse -inform der -in foo.sig
Error in encoding
139905918145984:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:../crypto/asn1/asn1_lib.c:101:
经过广泛研究:
pkcs11-tool --sign
该命令生成的选定哈希算法的二进制结果本身不是PKCS结构,但可以与第三方库一起使用以生成asn1
兼容的东西。这是一个繁琐且不推荐的过程,但是可以构建可验证的pkcs7-signedData
签名。
openssl smime -sign
建议使用命令;它需要配置为pkcs11
与具有相同模块的引擎一起使用,pkcs11-tool
并且可以在没有其他库的情况下构建PKCS#7结构。
OpenSSL配置文件示例:
openssl_conf = openssl_def
[openssl_def]
engines = engine_section
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
dynamic_path = /usr/lib/x86_64-linux-gnu/openssl-1.0.0/engines/pkcs11.so
engine_id = pkcs11
MODULE_PATH = ./VdsPKCS1164.so
PIN = 1234
default_algorithms = ALL
init = 1
生成PKCS#7签名示例的命令:
$ echo foobar > input.data
$ OPENSSL_CONF=./openssl.cnf openssl smime -sign -engine pkcs11 \
-md sha1 -binary -in input.data -out foo.sig -outform der \
-keyform engine -inkey id_5378 -certfile extra.cert.pem -signer cert.pem
cert.pem
可以从令牌卡中提取文件(以及任何其他证书,如果需要),并使用以下命令将其转换为PEM:
$ pkcs11-tool --module ./VdsPKCS1164.so --login --pin $PIN \
--read-object --type cert -id 5378 --output-file cert.crt
$ openssl x509 -inform der -in cert.crt -out cert.pem
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句