Java Access Token PKCS11未找到提供程序
您好我正在尝试从Java中的智能卡访问密钥库。 我正在使用以下代码..
我正在使用OpenSc http://www.opensc-project.org/opensc的Pkcs11实现
文件windows.cnf =
name=dnie library=C:\WINDOWS\system32\opensc-pkcs11.dll
Java代码 =
String configName = "windows.cnf" String PIN = "####"; Provider p = new sun.security.pkcs11.SunPKCS11(configName); Security.addProvider(p); KeyStore keyStore = KeyStore.getInstance("PKCS11", "SunPKCS11-dnie"); =)(= char[] pin = PIN.toCharArray(); keyStore.load(null, pin);
执行时带=)的行(=抛出以下exception
java.security.KeyStoreException: PKCS11 not found at java.security.KeyStore.getInstance(KeyStore.java:635) at ObtenerDatos.LeerDatos(ObtenerDatos.java:52) at ObtenerDatos.obtenerNombre(ObtenerDatos.java:19) at main.main(main.java:27) Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11-dnie at sun.security.jca.GetInstance.getService(GetInstance.java:70) at sun.security.jca.GetInstance.getInstance(GetInstance.java:190) at java.security.Security.getImpl(Security.java:662) at java.security.KeyStore.getInstance(KeyStore.java:632)
我认为问题是“SunPKCS11-dnie”,但我不知道要放在那里。 我尝试了很多组合……
任何人都可以帮助我……
我不确定问题是这个名字。 看起来很正确。 ColinD建议传递Provider
实例应该将其排除在外。
我猜这个问题与PKCS11的支持有关。 例如,您的阅读器中没有卡,或者本机代码无法访问阅读器。 您是否尝试将此驱动程序与一些“已知良好”软件(如Firefox或Thunderbird的安全模块)结合使用?
我也得到如下错误:
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11
我正在通过bat文件从jar运行应用程序。
我将bat文件替换为代码: java - jar sign.jar
,代码为: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar
它解决了这个问题。
为什么不直接将Provider
作为第二个参数传递给KeyStore.getInstance(String,Provider) 。 在您的代码中,您只需:
KeyStore keyStore = KeyStore.getInstance("PKCS11", p);
这是对BK Elizabeth答案的评论(由于声誉而无法发表评论)。
为什么在没有slotId的情况下启用调试系统属性? 这是一个副作用(请参阅此答案: https : //stackoverflow.com/a/16776155/5658642 )。
请尝试以下代码:
// Create instance of SunPKCS11 provider String pkcs11Config = "name=eToken\nlibrary=C:\\Windows\\System32\\eps2003csp11.dll"; java.io.ByteArrayInputStream pkcs11ConfigStream = new java.io.ByteArrayInputStream(pkcs11Config.getBytes()); sun.security.pkcs11.SunPKCS11 providerPKCS11 = new sun.security.pkcs11.SunPKCS11(pkcs11ConfigStream); java.security.Security.addProvider(providerPKCS11); // Get provider KeyStore and login with PIN String pin = "12345678"; java.security.KeyStore keyStore = java.security.KeyStore.getInstance("PKCS11", providerPKCS11); keyStore.load(null, pin.toCharArray());
它对我来说很好。