我尝试使用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)取得任何成功?
答案 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库。