Leer datos de un certificado

Hola,

He visto que hay una entrada en el foro que se llama "Leyendo numero de serie de .cer ", pero mi situación es distinta.
En esa entrada se obtiene un certificado a partir de un InputStream, deduzco que será un fichero firmado, bueno no lo sé.

A lo mio, tengo una aplicación web y quiero mostrar en un JSP un listado de los certificados que se encuentren el sistema, en mi caso está en una tarjeta. Después el usuario elegirá uno y necesito obtener el "subjectdn" del certificado seleccionado.

He conseguido comprobar que la tarjeta está insertada en el terminal, obteniendo un objeto de tipo javax.smartcardio.Card.

Lo que no sé es acceder al certificado de la tarjeta. El certificado es X509

Ójala puedan ayudarme

Gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

InputStream

El código que mencionas utiliza un InputStream porque es lo más abstracto posible. El stream puede venir de un archivo, o de un socket, y al final no importa, lo que importa (desde el punto de vista del código para leer un X509) es que tengas de dónde leer datos, y un InputStream es la manera más genérica de poder leer datos.

Así que con tu clase de Card (que jamás había escuchado honestamente) supongo que tienes que obtener un filesystem o algo parecido, una lista de archivos (supongo filtrar con extensión .cer y .crt), de ahí tal vez tengas que obtener un File por cada uno, luego abrir un FileInputStream y con eso ya puedes usar el código que crea un X509 a partir de un InputStream.

Y en cuanto a leer el SubjectDN pues es cosa de buscar ese campo en el X509, para lo cual necesitas ver la documentación de la clase (hay dos, una es la que se lee de InputStream, me parece que la de javax.security).

Solucionado !!

Hola ezamudio, gracias por la explicación. Ya solucioné el tema.
Es un poco largo de explicar, asi que dejo el link de dónde obtuve el código que me sirvió.
http://svn.quipux.org/firma-digital/trunk/codigo_fuente/proyFirma_2/

Bueno ... vale ... pongo algo de código

char[] pass = new char[4];
WindowsKeyStoreProvider wksp = new WindowsKeyStoreProvider();
KeyStore ks = wksp.getKeystore(pass);     //pass está vacio, (en mi caso a funcionado)
Enumeration e = ks.aliases();   //Obtengo los alias de los certificados
while (e.hasMoreElements()){
                     String alias = e.nextElement().toString();
        System.out.println("valor:"  + e.nextElement().toString());
}
                       
// Obtengo un certificado con el alias que me interesa                 
X509Certificate cert;
cert = (X509Certificate)ks.getCertificate(alias);
String subjectdn =  cert.getIssuerDN().toString();                     

// Puede que haya más de un certificado con el mismo alias, en ese caso ...
Certificate[] certs = ks.getCertificateChain(alias);
System.out.println("Tamaño de certs:"  + certs.length);
for (int i =0;i <certs.length; i++) {
        X509Certificate mycert = (X509Certificate)certs[i];
        System.out.println("issuerDN vale:"  + mycert.getIssuerDN().toString());
}

Nota: para que el código funciona hay que bajarse los soureces del link indicado.
Ej: las clases WindowKeyStoreProvider y KeyStoreProvider están definidas en la web indicada.
Saludos

Relanzo el tema

Buenas, siguiente problema.

Tengo un estupendo código Java que lee los certificados de una tarjeta, pero estoy en una aplicación web y ésto debe ejecutarse en el cliente.

Alguna brillante idea??

Saludos

Imagen de ezamudio

webstart/applet

Tus únicas dos opciones son applet o una aplicación webstart.

Hola buenos dias, estoy

Hola buenos dias, estoy intentando acceder a la lectura de los certificados que contiene mi tarjeta criptográfica pero no doy con la tecla.
Actualmente recibo un total de 2 certificados, uno con la fecha caducada y otra en vigor (lo compruebo en el navegador), pero por defecto solo me lee el certificado caducado (ambos tienen el mismo alias).

No se como hacer que muestre los certificados para poder elegir el certificado que quiera usar (en caso de tener varios en la tarjeta).

Teneis alguna clase para java hecha ?

Gracias.