2011-01-28 15 views
7

Witaj Próbuję uzyskać dostęp do magazynu kluczy z mojej karty inteligentnej w Javie. I używam następujący kod ..Token dostępu Java PKCS11 Nie znaleziono dostawcy

Używam realizację pkcs11 z opensc http://www.opensc-project.org/opensc

pliku windows.cnf = kod

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

Gdy wykonanie przechodzi przez linię z =) (= wyrzuca mi następujący wyjątek

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) 

Myślę, że problem jest "SunPKCS11-Dnie", ale nie wiem, aby tam umieścić. Próbowałem z wieloma kombinacjami ...

Ktoś może mi pomóc ...

Odpowiedz

4

Nie jestem pewien, czy problem dotyczy nazwy. Wygląda to poprawnie. ColinD's suggestion przekazanie instancji Provider powinno wyłączyć problem.

Zgaduję, że problem dotyczy obsługi PKCS11. Na przykład, nie masz karty w czytniku, lub kod natywny nie może uzyskać dostępu do czytnika. Czy próbowałeś używać tego sterownika w połączeniu z jakimś "znanym, dobrym" oprogramowaniem, takim jak Firefox lub moduły bezpieczeństwa Thunderbird?

+1

Znalazłem. Dll dla mojego czytnika kart chipowych (asepkcs.dll). I spróbowałem ponownie z tym samym kodem (z zaleceniami @ ColinD) i działa! Problemem był .dll. Musisz mieć odpowiednią bibliotekę DLL dla twojego urządzenia. – oracleruiz

3

Dlaczego nie można po prostu przejść Provider bezpośrednio, jako drugi argument do KeyStore.getInstance(String, Provider). W swoim kodzie wystarczy:

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

Dobra sugestia. Tak to robię. Mimo że nazwa wygląda poprawnie w kodzie, dobrze byłoby zlikwidować nazewnictwo jako problem. – erickson

+0

Co masz na myśli? maybe, KeyStore keyStore = KeyStore.getInstance ("PKCS11", "opensc")? – oracleruiz

+2

@oracleruiz: 'KeyStore' ma przeciążenie' getInstance', które pobiera '' Provider' bezpośrednio jako drugi argument: [KeyStore.getInstance (String, Provider)] (http://download.oracle.com/javase/1.5 .0/docs/api/java/security/KeyStore.html # getInstance% 28java.lang.String,% 20java.security.Provider% 29). Zobacz moją edycję, chociaż @erickson ma rację, że może być czymś innym, w którym to przypadku by się nie udało. – ColinD

6

Byłem też uzyskiwanie błąd jak poniżej:

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

używam aplikacji z słoiku przez plik bat.

plik I bat Wymieniłem kod: java - jar sign.jar z kodem: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar

I to rozwiązało problem.

+0

Nie widzę, jak podanie opcji debugowania rozwiązałoby ten problem. Być może zadzwoniłeś do tego z innego katalogu roboczego? –

0

Jest to komentarz do odpowiedzi BK Elizabeth (nie można jeszcze komentować z powodu reputacji).

Dlaczego działa włączanie właściwości systemu debugowania bez metody slotId? Jest to efekt uboczny (zobacz tę odpowiedź: https://stackoverflow.com/a/16776155/5658642).

-1

Wypróbuj poniższy kod:

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

to działa dobrze dla mnie.