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()); 

它对我来说很好。