2011-01-28 24 views
7

Hola Estoy intentando acceder al almacén de claves desde mi tarjeta inteligente en Java. Y estoy usando el siguiente código ..Token de acceso a Java PKCS11 No encontrado Proveedor

estoy usando la aplicación pkcs11 de OpenSC http://www.opensc-project.org/opensc

Archivo windows.cnf = Código

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

Cuando la ejecución se realiza por línea con =) (= me arroja la siguiente excepción

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) 

Creo que el problema es "DNIe SunPKCS11-", pero no sé que poner allí. Había probado con una gran cantidad de combinaciones ...

alguien me puede ayudar ...

Respuesta

4

No estoy seguro de que el problema sea el nombre. Se ve correcto ColinD's suggestion para pasar la instancia Provider debe descartarlo como un problema.

Supongo que el problema es con el soporte de PKCS11. Por ejemplo, no tiene una tarjeta en su lector, o el código nativo no puede acceder al lector. ¿Has probado usar este controlador junto con algún software "bien conocido", como los módulos de seguridad de Firefox o Thunderbird?

+1

Encontré el archivo .dll para mi lector de tarjetas inteligentes (asepkcs.dll). ¡Y lo intenté de nuevo con el mismo código (con las recomendaciones de @ ColinD) y funciona! Entonces el problema era el .dll. Debes tener la dll correcta para tu dispositivo. – oracleruiz

3

¿Por qué no sólo tiene que pasar la Provider directamente como segundo argumento a KeyStore.getInstance(String, Provider). En su código, simplemente lo haría:

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

Buena sugerencia. Así es como lo hago. Aunque el nombre parece correcto en el código, sería bueno eliminar el nombre como un problema. – erickson

+0

¿Qué quieres decir exactamente? tal vez, KeyStore keyStore = KeyStore.getInstance ("PKCS11", "opensc") ?? – oracleruiz

+2

@oracleruiz: 'KeyStore' tiene una sobrecarga de' getInstance' que toma 'Provider' directamente como el segundo argumento: [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). Ver mi edición, aunque @erickson tiene razón en que podría ser algo más, en cuyo caso eso aún fallaría. – ColinD

6

También conseguía el error de la siguiente manera:

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

Me postulo la aplicación de un frasco a través bat.

archivo que he bate He sustituido el código: java - jar sign.jar con código: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar

Y es resuelto el problema.

+0

No veo cómo resolver las opciones de depuración resolvería este problema. ¿Posiblemente lo llamaste desde un directorio de trabajo diferente? –

0

Esto se entiende como un comentario a la respuesta de BK Elizabeth (aún no puedo comentar por su reputación).

¿Por qué funciona al habilitar la propiedad del sistema de depuración, sin slotId? Este es un efecto secundario (vea esta respuesta: https://stackoverflow.com/a/16776155/5658642).

-1

Prueba el código de abajo:

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

que está trabajando muy bien para mí.

Cuestiones relacionadas