Openssl
我可以使用 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:
經過廣泛研究:
pkcs11-tool --sign
命令生成所選散列算法的二進制結果,該算法本身不是 PKCS 結構,但可以與 3rd 方庫一起使用以生成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