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

Pkcs#11 在windows 7(64位)上使用j2pkcs11.dll和java 8(64位),pkcs#11,Pkcs#11,我试图使用j2pkcs11.dll(与jdk1.8.0-64位一起打包)访问存储在智能卡上的证书,但并非无法使其正常工作 ---动态添加SunPKCS11提供程序的示例代码--- ----我得到的例外--- java.security.ProviderException:初始化失败 位于sun.security.pkcs11.SunPKCS11。(SunPKCS11.java:376) 位于sun.security.pkcs11.SunPKCS11。(SunPKCS11.java:103) 位于

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

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

----我得到的例外---

java.security.ProviderException:初始化失败
位于sun.security.pkcs11.SunPKCS11。(SunPKCS11.java:376)
位于sun.security.pkcs11.SunPKCS11。(SunPKCS11.java:103)
位于scpoc.SmartCard.main(SmartCard.java:28)
原因:java.io.IOException:找不到指定的过程。
位于sun.security.pkcs11.wrapper.pkcs11.connect(本机方法)
位于sun.security.pkcs11.wrapper.pkcs11.(pkcs11.java:138)
位于sun.security.pkcs11.wrapper.pkcs11.getInstance(pkcs11.java:151)
位于sun.security.pkcs11.SunPKCS11。(SunPKCS11.java:313)

JEP131声称在java8()中支持PKCS11,但我一直无法让它在Windows7上使用java8 64位。注意:我也在Windows7上尝试了32位的Java8,但也没有成功


是否有人成功地将SunPKCS11提供程序与java 8(Windows 7)一起使用?

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

如果您需要在比JRE8旧的64位Windows版本的JRE中使用PKCS#11 API,那么您必须使用一种替代的第三方实现,例如


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

感谢您的快速响应。运行在Windows7(64位)上的JRE8-64位打包的PKCS#11模块(j2pcks11.dll)对我来说不起作用。“对我来说,这看起来像个虫子。”文斯:我已经更新了我的答案。请看第三段。你是对的,我的菜鸟错了。由于我的智能卡读卡器不提供PKCS11模块,我错误地认为j2pkcs11.dll将提供PKCS11实现。我搜索了一下网络,找到了一个兼容的模块(opensc-pkcs11,dll),现在运行良好。再次感谢。
    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)