我需要创建PKCS7 signedData结构,并在智能卡上执行签名。这几乎是openssl函数PKCS7_sign所做的,除了签名。也许有人可以为这个问题提出一些建议,即如何使用openssl或任何其他c / c ++跨平台库来做这件事。 至于openssl,PKCS7_sign函数的标志PKCS7_PARTIAL或PKCS7_STREAM似乎是有用的。如果我使用任何这个标志,我可以获得几乎完整的PKCS7结构。在这种情况下,结构是完整的,除了它不包含“数据”和“符号”。所以我只需要添加这些元素。但我没有找到如何做到这一点的方式。有人知道吗?
答案 0 :(得分: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
这样的事情可以签署一个pkcs7。从代码 - 几乎做同样的事情。我通常使用openssl它的应用程序目录中的app / util方便stuf来使实时更容易。