Openssl

我可以使用 pkcs11-tool 創建 pkcs#7 簽名嗎?

  • May 1, 2019

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

引用自:https://unix.stackexchange.com/questions/404774