2011-01-28 3 views
7

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

Я использую реализацию 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

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

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

+1

Я нашел .dll для своего считывателя смарт-карт (asepkcs.dll). И я попробовал снова с тем же кодом (с рекомендациями @ ColinD) и Works! Таким образом, проблема была .dll. У вас должна быть правильная dll для вашего устройства. – oracleruiz

3

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

KeyStore keyStore = KeyStore.getInstance("PKCS11", p); 
+0

Хорошее предложение. Вот как я это делаю. Хотя имя выглядит правильно в коде, было бы неплохо устранить именование как проблему. – erickson

+0

Что ты имеешь в виду? возможно, KeyStore keyStore = KeyStore.getInstance ("PKCS11", "opensc") ?? – oracleruiz

+2

@oracleruiz: 'KeyStore' имеет перегрузку' getInstance', которая берет 'Provider' непосредственно в качестве второго аргумента: [KeyStore.getInstance (String, Provider)] (http://download.oracle.com/javase/1.5 0,0/документы/API/Java/безопасность/KeyStore.html # деЫпзЬапс% 28java.lang.String,% 20java.security.Provider% 29). См. Мое редактирование, хотя @erickson прав, что это может быть что-то еще, и в этом случае это все равно потерпит неудачу. – ColinD

6

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

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

Я бег приложения из кувшина через летучую мышь файл.

я летучая мышь файл я заменил код: java - jar sign.jar с кодом: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar

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

+0

Я не вижу, как предоставление вариантов отладки разрешит эту проблему. Возможно, вы назвали это из другого рабочего каталога? –

0

Это подразумевается как комментарий к ответу БК Элизабет (не могу комментировать еще из-за репутации).

Почему это работает на включение свойства системы отладки без slotId? Это побочный эффект (см. Этот ответ: https://stackoverflow.com/a/16776155/5658642).

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

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