Ver Mensaje Individual
  #5 (permalink)  
Antiguo 10/03/2010, 06:39
julitro
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Como Acceder al KeyStore de Firefox

Hola.

Te pongo un código de ejemplo, deberas tener cuidado con las rutas del perfil etc que son muy puñeteras...

import java.io.ByteArrayInputStream;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateFactory;
import com.sun.security.auth.callback.DialogCallbackHandl er;
import com.tbsolutions.asf.websigner.util.Util;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import javax.security.auth.Subject;
import sun.security.pkcs11.SunPKCS11;

public class test {

/**
* @param args
*/
public static void main(String[] args) throws Throwable {

String providerConfig = "name = NSS"+"\n"+
"nssLibraryDirectory = "+"C:/Archivos de programa/Mozilla Firefox"+"\n"+
"nssSecmodDirectory = "+"\"C:/Documents and Settings/User/Datos de programa/Mozilla/Firefox/Profiles/aoyomgvn.default\""+"\n"+
"nssDbMode = readOnly" + "\n" +
"nssModule = keystore" + "\n" +
"\r";

System.load("C:/Archivos de programa/Mozilla Firefox/mozcrt19.dll");
System.load("C:/Archivos de programa/Mozilla Firefox/sqlite3.dll");

System.load("C:/Archivos de programa/Mozilla Firefox/nspr4.dll");
System.load("C:/Archivos de programa/Mozilla Firefox/plc4.dll");
System.load("C:/Archivos de programa/Mozilla Firefox/plds4.dll");
System.load("C:/Archivos de programa/Mozilla Firefox/nssutil3.dll");//

ByteArrayInputStream localByteArrayInputStream = new ByteArrayInputStream(string.getBytes());
SunPKCS11 _pk11provider = null;
try {
_pk11provider = new SunPKCS11(localByteArrayInputStream);
Security.addProvider(_pk11provider);
_pk11provider.login(new Subject(), new DialogCallbackHandler());
}catch(Throwable e){
System.out.println(e.getMessage());
}

KeyStore ks = KeyStore.getInstance("PKCS11",_pk11provider);

ks.load(null, null);
}


Para ver si te ha cargado certificados puedes añadir al final un codigo de este tipo:

Enumeration e = ks.aliases();

while(e.hasMoreElements()) {
System.out.println("\n\nCERT: ");
String alias = (e.nextElement()).toString();
java.security.cert.Certificate cert = ks.getCertificate(alias);
CertificateFactory cf = CertificateFactory.getInstance("X509");
X509Certificate cert509 = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(cert.getEncoded()));
System.out.println("\t"+cert509.getSubjectDN());
java.security.cert.Certificate[] chain = ks.getCertificateChain(alias);
if (chain != null) {
System.out.println("\t\t CADENA: ");
for (int x = 0; x < chain.length; x++) {
cert509 = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(chain[x].getEncoded()));
System.out.println("\t\t\t"+cert509.getSubjectDN() );
}
}

boolean cadenaCompleta = false;
try {
if (chain != null) {
for (int x = 0; x < chain.length; x++) {
X509Certificate certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(chain[x].getEncoded()));
if(x==chain.length-1) {
if (certificate.getSubjectDN().toString().equalsIgnor eCase(certificate.getIssuerDN().toString())) {
cadenaCompleta = true;
}
}
}
}
} catch(Throwable t) {
Util.log(Util.ERROR, "JavaKeyStore", "findCertChain", " " + t.getMessage());
}

System.out.println("Cadena completa: "+cadenaCompleta);

}


Para acceder a los tokens externos como tarjetas lo unico que cambia es el provider config:

String providerConfig= "name = NSScrypto-1"+"\n"+
"nssLibraryDirectory = "+"C:/Archivos de programa/Mozilla Firefox"+"\n"+
"nssDbMode = readOnly"+"\n"+
"nssModule = external-1\n"+
"nssSecmodDirectory = "+"\"C:/Documents and Settings/User/Datos de programa/Mozilla/Firefox/Profiles/aoyomgvn.default\"\n";

NOTA: La linea que te pongo en rojo es la que deberas cambiar para poder coger diferentes tokens externos... cuando los instalas en el firefox van uniendose tras el ultimo instalado.. external-1, external-2, etc. el nombre tambine deberas cambiarlo... una vez tengas los proveedores metidos en el security... podras hacer instancias de los KeyStores pasandole ese proveedor...

NOTA 2: Cuando lo trates de poner en un applet (si es lo que queires hacer...) es posible que debas cambiar cosas en los string de config de los provider.. cosas en plan.. que cada linea termine con \n\r y ese tipo de cosas...

Para el de windows con java 1.6 deberas hacer mas o menos lo siguiente:

//certificados personales
KeyStore store = KeyStore.getInstance("Windows-MY");
store.load(null);
//cas
KeyStore store = KeyStore.getInstance("Windows-ROOT");
store.load(null);

Para los publicos hay que hacer unas cosas con reflexion y tal poruqe no esta implementados los accesos desde el proveedor sunMSCAPI pero no voy a meterme en ese tema, con esto mas o menos ya se puede trabajas.. firmar... verificar etc.