Java Access Token PKCS11 Не найден Провайдер - PullRequest
7 голосов
/ 29 января 2011

Здравствуйте. Я пытаюсь получить доступ к хранилищу ключей с моей смарт-карты на Java. И я использую следующий код ..

Я использую Pkcs11-реализацию OpenSc http://www.opensc -project.org / opensc

Файл 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", но я не знаю, куда его поставить. Я пробовал много комбинаций ...

Любой может помочь мне ...

Ответы [ 4 ]

7 голосов
/ 03 декабря 2012

Я также получил ошибку, как показано ниже:

Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11

Я запускаю приложение из файла jar через bat.

В файле bat я заменил код: java - jar sign.jar с кодом: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar

И это решило проблему.

4 голосов
/ 29 января 2011

Я не уверен, что проблема в названии.Это выглядит правильно. Предложение ColinD передать экземпляр Provider должно исключить это как проблему.

Я предполагаю, что проблема в поддержке PKCS11.Например, у вас нет карты в вашем читателе, или нативный код не может получить доступ к читателю.Вы пытались использовать этот драйвер в сочетании с каким-либо «заведомо исправным» программным обеспечением, таким как Firefox или модули безопасности Thunderbird?

3 голосов
/ 29 января 2011

Почему бы просто не передать Provider непосредственно в качестве второго аргумента KeyStore.getInstance (String, Provider) .В своем коде вы просто сделаете:

KeyStore keyStore = KeyStore.getInstance("PKCS11", p);
0 голосов
/ 04 декабря 2016

Попробуйте следующий код:

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

у меня это нормально работает.

...