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

时间:2015-02-21 00:23:25

标签: pkcs#11

我尝试使用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,但我无法使用java8 64位在Windows 7上运行它。注意:我也尝试过Windows 7上的java 8 32位 - 但也没有运气。

有没有人使用SunPKCS11提供程序和java 8(Windows 7)取得任何成功?

1 个答案:

答案 0 :(得分:4)

SunPKCS11提供程序仅存在于JRE的32位Windows版本中,直到JRE7。从JRE8开始,它也出现在64位Windows版本的JRE中。这是您在JEP131中看到的信息。

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

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