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構造自体ではありませんが、サードパーティのライブラリと一緒に使用してasn1互換性のあるコンテンツを生成できます。これは退屈で推奨されないプロセスですが、検証可能なpkcs7-signedData署名を構築できます。

openssl smime -signpkcs11推奨コマンド:同じモジュールを含むエンジンを使用するように構成する必要があり、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

関連情報