在 windows 7(64 位)上使用 j2pkcs11.dll 和 java 8(64 位)

Using j2pkcs11.dll with java 8 (64-bit) on windows 7 (64-bit)

我尝试使用 j2pkcs11.dll(与 jdk1.8.0 - 64 位打包在一起)访问存储在智能卡上的证书,但无法使其正常工作。

--- 动态添加 SunPKCS11 提供程序的示例代码 ---

    String pkcs11ConfigSettings = "name = " + "TestSmartCard" + "\n" + "library = " + "C:/jdk1.8.0_11/jre/bin/j2pkcs11.dll";
    byte[] pkcs11ConfigBytes = pkcs11ConfigSettings.getBytes();
    ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11ConfigBytes);            
    Provider p = new sun.security.pkcs11.SunPKCS11(confStream);

----我得到的异常---

java.security.ProviderException: Initialization failed
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:376)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
    at scpoc.SmartCard.main(SmartCard.java:28)

Caused by: java.io.IOException: The specified procedure could not be found.
    at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
    at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:138)
    at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:151)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:313)

JEP 131 声称在 Java 8 (http://openjdk.java.net/jeps/131) 中支持 PKCS11,但我无法使用 [=29= 使其在 windows 7 上运行] 64 位。注意:我还在 windows 7 上尝试了 java 8 32 位 - 但也不走运。

有没有人在 java 8 (Windows 7) 中成功使用 SunPKCS11 提供程序?

SunPKCS11 提供程序仅存在于 JRE7 之前的 32 位 Windows 版本中。自 JRE8 以来,它也出现在 64 位 Windows 版本的 JRE 中。这是您在 JEP131.

中看到的信息

如果您需要在早于 JRE8 的 64 位 Windows 版本的 JRE 中使用 PKCS#11 API,那么您将不得不使用替代的第 3 方实现之一 - 例如 IAIK-JCE.

我还在您的代码示例中注意到,您正试图直接将 "j2pkcs11.dll" 用作 PKCS#11 库,这是错误的,因为它只是位于 JRE 和实现 PKCS# 的库之间的 JNI 包装器11 接口。您需要加载智能卡或 HSM 供应商提供的 PKCS#11 库,而不是加载 "j2pkcs11.dll"。