スマート カードで署名を実行する PKCS7 signedData 構造を作成する必要があります。署名を除いて、openssl 関数 PKCS7_sign が行うこととほとんど同じです。誰かがこの質問に対して何かアドバイスできるかもしれません。つまり、openssl または他の c/c++ クロスプラットフォーム ライブラリでこれを行う方法です。openssl に関しては、PKCS7_sign 関数のフラグ PKCS7_PARTIAL または PKCS7_STREAM が役立つようです。このフラグのいずれかを使用すると、ほぼ完全な PKCS7 構造を取得できます。この場合、「データ」と「符号」が含まれていないことを除いて、構造は完全です。したがって、これらの要素を追加するだけです。しかし、私はこれを行う方法を見つけられませんでした。誰か知っていますか?
質問する
1819 次
1 に答える
3
通常、スマートカードから秘密鍵を抽出することは望ましくありません (または技術的にブロックされています)。これは一種のスマートカードの要点であり、暗号メモリと接続された CPU の改ざん防止ビットであり、秘密鍵が決して漏えいすることはありません。
代わりに、チップカードにうまく署名を依頼する必要があります。
OpenSSL はこれを行うことができますが、チップカードと通信する方法を知る必要があります。それは一般的に「エンジン」で行われます。これには、ベンダーのチップカード (リーダー) ドライバーと組み合わせて、最も一般的には #15 の pkcs#11 が使用されます。
次に、通常、スロットとキーの識別子を取得する必要があります。
# Extracting slot, auth ids and key id's for later use/reference
#
set `pkcs11-tool --module /usr/lib/opensc-pkcs11.so --list-slots | grep Slot | grep SCM`
SLOT=$2
set `pkcs15-tool --list-keys | grep ID`
AID=$4
KID=$7
その後、カードで「こと」を行うことができます:
/usr/bin/openssl << EOM
engine dynamic -pre SO_PATH:/Library/OpenSC/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11.so
XXX -engine pkcs11 -b-key slot_$SLOT-id_$KID -keyform engine ....
EOM
そのようなことの 1 つは、pkcs7 に署名することです。コードから - ほとんど同じことを行います。私は通常、ライブを少し簡単にするために、openssl の app/util 便利な stuf を使用します。
于 2013-05-30T08:59:45.063 に答える