我可以使用 pkcs11-tool 创建 pkcs#7 签名吗?

我可以使用 pkcs11-tool 创建 pkcs#7 签名吗?

我在 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:

答案1

经过广泛研究:

pkcs11-tool --sign命令生成所选哈希算法的二进制结果,该结果本身不是 PKCS 结构,但可以与第 3 方库一起使用以生成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

相关内容