您好我正在尝试使用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);
执行时带 =的行(= )会抛出以下异常
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”,但我不知道要放在那里。我尝试了很多组合......
任何人都可以帮助我...
答案 0 :(得分:7)
我也得到如下错误:
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
它解决了这个问题。
答案 1 :(得分:4)
我不确定问题是这个名字。看起来很正确。 ColinD's suggestion传递Provider
实例应该将其排除在外。
我猜这个问题与PKCS11的支持有关。例如,您的阅读器中没有卡,或者本机代码无法访问阅读器。您是否尝试将此驱动程序与某些“已知良好”软件(如Firefox或Thunderbird的安全模块)结合使用?
答案 2 :(得分:3)
为什么不直接将Provider
作为第二个参数传递给KeyStore.getInstance(String, Provider)。在您的代码中,您只需:
KeyStore keyStore = KeyStore.getInstance("PKCS11", p);
答案 3 :(得分:-1)
请尝试以下代码:
// 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());
它对我来说很好。