1

当我在 cmd 行中执行以下操作时:

pkcs11-tool --login -O

我的智能卡上有 7 个对象、3 个公钥对象、3 个证书对象和一个私钥对象。

但是当我尝试用一​​个小的 Java 代码做同样的事情时,我只找到一个证书:

 String pkcs11Config = "name = SmartCard\nlibrary = opensc-pkcs11.dll\nslot=0";
  ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11Config.getBytes());
  Provider prov = new sun.security.pkcs11.SunPKCS11(confStream);
  Security.addProvider(prov);
  String pin = "0000000";
  KeyStore cc = KeyStore.getInstance("PKCS11", prov);
  cc.load(null, pin.toCharArray());

  // Look for certificate
  Enumeration aliases = cc.aliases();
  for (Enumeration e = aliases; e.hasMoreElements();) {
    Object alias = aliases.nextElement();
    System.out.println("Alias is : " + alias);
  }

为什么我找不到带有此代码的公钥或其他证书?

4

1 回答 1

1

这是 JAVA 提供者的标准行为SunPKCS11。它的实现通常记录在“PKCS#11 参考指南”中:

为您的 JAVA 版本选择正确的指南并查看“KeyStore 要求”一章。您会发现 SunPKCS11 提供程序仅返回证书对及其匹配的私钥(在您的情况下是一个条目)的别名,并忽略所有其他对象。

于 2018-12-13T20:07:09.193 回答