Pkcs11互操作.PDF库中私钥的标识



我正在尝试设置一个带有 Pkcs11Interop.PDF 扩展的示例应用程序。不幸的是,我在设置 ckaId 时遇到了System.ArgumentNullException。什么在这里起作用?我在这里尝试了不同的数字,这些数字都给了我一个System.ArgumentOutOfRangeException

安装程序使用VirtualCryptoki-64-1.0.6.7.exe应用程序来模拟智能卡。

令人不安的电话是:

pkcs11RsaSignature = new Pkcs11RsaSignature(libraryPath, tokenSerial, tokenLabel, pin, ckaLabel, ckaId, hashAlgorithm);

我使用的哈希算法是:

HashAlgorithm hashAlgorithm = HashAlgorithm.SHA256;

使用 pkcs11 工具后更新:

虚拟卡的内容是:

    C:Program FilesOpenSC ProjectOpenSCtools>pkcs11-tool.exe --module "C:windowsSystem32vcki.dll" --list-slots --list-objects --login --pin 1234
Available slots:
Slot 0 (0xd47db04d): Virtual Smart Card Reader
  token label:   Virtual SC-A0101010101
  token manuf:   Cryptware
  token model:   VirtualSmartCard
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x200
  serial num  :
Using slot 0 with a present token (0xd47db04d)
Certificate Object, type = X.509 cert
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
Public Key Object; RSA 1024 bits
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      encrypt, verify
Private Key Object; RSA
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      decrypt, sign
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)
Public Key Object; RSA 1024 bits
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      encrypt, verify
Private Key Object; RSA
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      decrypt, sign
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

我使用的参数是:

string libraryPath = @"C:WindowsSystem32vcki.dll";
string tokenSerial = null;
string tokenLabel = @"Virtual SC-A0101010101";
string pin = @"1234";
string ckaLabel = @"ibisit";
string ckaId = "4a656e73204b6175666d616e6e";
HashAlgorithm hashAlgorithm = HashAlgorithm.SHA256;

不幸的是,我在设置 ckaID 时遇到了Net.Pkcs11Interop.PDF.ObjectNotFoundException。更改引脚给了我一个不同的例外,所以我肯定在这里访问了正确的设备。

切换到软HSM后的更新:Jariq 表示,这里存在太多具有相同 ID 的对象的问题。不幸的是,虚拟密钥资源管理器不允许我删除任何对象,所以我切换到 SoftHSM(我一开始使用的是)。我收到"找不到标签为"ibis-it 密钥"且 ID 为"A1B2"的证书"。我想这里的问题是这个虚拟卡只保存一个RSA密钥对而不是一个证书。

pkcs11 工具的输出为:

C:Program Files (x86)OpenSC ProjectOpenSCtools>pkcs11-tool.exe --module "C:SoftHSMliblibsofthsm.dll" --list-slots --list-objects --login --pin smart
Available slots:
Slot 0 (0x0): SoftHSM
  token label:   SoftHSM
  token manuf:   SoftHSM
  token model:   SoftHSM
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x40
  serial num  :  1
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:      ibis-it key
  ID:         a1b2
  Usage:      verify
Private Key Object; RSA
  label:      ibis-it key
  ID:         a1b2
  Usage:      sign

问题是SoftHSM只导入PKCS#8(RSA)密钥对,所以这里永远不会有证书。我想您一直在将其与 RSA 密钥对一起使用,而不是与证书一起使用。

传递给 Net.Pkcs11Interop.PDF.Pkcs11RsaSignature 类构造函数的参数标识以下内容:

  • 应该使用哪个 PKCS#11 库(库路径)
  • 哪个令牌/
  • 智能卡存储私钥(令牌串行和/或令牌标签)
  • 应该使用哪个私钥进行签名(ckaLabel 和/或 ckaId)
  • 在创建签名期间应使用哪种哈希算法(哈希算法)

如果您知道应该使用哪个PKCS#11库来访问智能卡,那么您可以确定其余参数的正确值,即通过运行与OpenSC中间件捆绑在一起的pkcs11-tool实用程序。请在下面找到为我的测试卡生成的确切命令和输出(重要部分以粗体突出显示):

C:\Program Files (x86)\OpenSC Project\OpenSC\tools>pkcs11-tool.exe --module cardos11.dll --list-slots --list-objects --login --pin 11111111可用插槽:插槽 0 (0x1): SCM 微系统公司 SCR33x USB 智能卡读卡器 0  令牌标签 : Pkcs11互操作  代币制造商 : www.atos.net/cardos  令牌型号:卡操作系统V4.3B  令牌标志:rng,需要登录,PIN已初始化,令牌已初始化,其他标志=0x800  硬件版本 : 102.63  固件版本 : 200.8  序列号 : 7BFF2737350B262C将插槽 0 与当前令牌一起使用 (0x1)私钥对象;RSA  标签: 约翰·多伊ID: ec5e50a889b888d600c6e13cb0fdf0c1  用法:符号证书对象,类型 = X.509 证书  标签: 约翰·多伊  ID: ec5e50a889b888d600c6e13cb0fdf0c1

根据此输出,这些是此卡的各个参数的正确值:

  • libraryPath="cardos11.dll"
  • tokenSerial="7BFF2737350B262C" 和/或 tokenLabel="Pkcs11Interop"
  • ckaLabel="John Doe" 和/或 ckaId="ec5e50a889b888d600c6e13cb0fdf0c1"

希望这有帮助。

ObjectNotFoundException的更新:

您正在获得 ObjectNotFoundException,因为您的令牌中存储了两个具有完全相同标签和 ID 的私钥,因此 Pkcs11RsaSignature 类无法确定应该使用哪一个来创建签名。只需删除或重命名其中一个,它应该可以工作。

软HSM更新:

您可以使用 softhsm.exe 工具将 PKCS#8 私钥导入 SoftHSM:

C:SoftHSMbin>softhsm.exe --import doe.key --slot 0 --label "John Doe" --pin 11111111 --id "ec5e50a889b888d600c6e13cb0fdf0c1"
The key pair has been imported to the token in slot 0.

您可以使用 pkcs11-tool.exe 工具将 DER 编码的 X.509 证书导入 SoftHSM:

C:SoftHSMbin>"c:Program Files (x86)OpenSC ProjectOpenSCtoolspkcs11-tool.exe" --module libsofthsm.dll --login --pin 11111111 --write-object doe.der --type cert --label "John Doe" --id "ec5e50a889b888d600c6e13cb0fdf0c1"
Using slot 0 with a present token (0x0)
Created certificate:
Certificate Object, type = X.509 cert
  label:      John Doe
  ID:         ec5e50a889b888d600c6e13cb0fdf0c1

只需确保导入的证书与私钥的 ID 相同。

最新更新