为什么列出 pksc11-tool 七个对象,但 Java Keystore 只有一个
Why lists pksc11-tool seven Objects but Java Keystore has Only one
当我在 cmd 行中执行时:
pkcs11-tool --login -O
我的智能卡上有 7 个对象、3 个 Public 密钥对象、3 个证书对象和 1 个私钥对象。
但是当我尝试用一个小 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);
}
为什么我找不到 Public 密钥或其他带有此代码的证书?
这是 JAVA 的 SunPKCS11
提供商的标准行为。它的实现通常记录在 "PKCS#11 reference guide":
- JDK 7 PKCS#11 Reference Guide
- JDK 8 PKCS#11 Reference Guide
- JDK 9 PKCS#11 Reference Guide
- JDK 10 PKCS#11 Reference Guide
为您的 JAVA 版本选择正确的指南,然后查看 "KeyStore requirements" 章节。您会发现 SunPKCS11 提供程序 returns 仅为证书对及其匹配的私钥(在您的情况下是一个条目)设置别名,而忽略所有其他对象。
当我在 cmd 行中执行时:
pkcs11-tool --login -O
我的智能卡上有 7 个对象、3 个 Public 密钥对象、3 个证书对象和 1 个私钥对象。
但是当我尝试用一个小 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);
}
为什么我找不到 Public 密钥或其他带有此代码的证书?
这是 JAVA 的 SunPKCS11
提供商的标准行为。它的实现通常记录在 "PKCS#11 reference guide":
- JDK 7 PKCS#11 Reference Guide
- JDK 8 PKCS#11 Reference Guide
- JDK 9 PKCS#11 Reference Guide
- JDK 10 PKCS#11 Reference Guide
为您的 JAVA 版本选择正确的指南,然后查看 "KeyStore requirements" 章节。您会发现 SunPKCS11 提供程序 returns 仅为证书对及其匹配的私钥(在您的情况下是一个条目)设置别名,而忽略所有其他对象。