paquetesGUIxSeguridad

Utilidades para leer certificados de Internet Explorer, eDNI, firmar y verificar firma de forma sencilla.
1. Acceso HTTPS con eDNI
2. Firma digital y verificación
3. Seleccionar un certificado de forma visual


1. Acceso HTTPS con eDNI



import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.util.Enumeration;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import utilesGUIxSeguridad.JCertificadosSUN;
import utilesGUIxSeguridad.JFrameSeleccionarCertificado;

/**
 *
 * @author eduardo
 */
public class JTest5 {

    public static void main(String[] args) throws Exception {
        //conectamos con url
        HttpsURLConnection connection = null;
        URL url = null;
        //config. para leer la dll PKCS11 directamente (en este caso la de la Universidad de Murcia)
        String ls =
                "name = DNIe" + "\n"
                + "slot = 1" + "\n"
                + "library = c:/WINDOWS/system32/UMU_PKCS11_v1_02.dll" + "\n"
                + "showInfo=true" + "\n";
        InputStream loConf = new ByteArrayInputStream(ls.getBytes());
        //Creamos el Provider con la clase SunPKCS11
        Provider nss = new sun.security.pkcs11.SunPKCS11(loConf);
        Security.addProvider(nss);
        //creamos el keystore
        KeyStore ks = KeyStore.getInstance("PKCS11", nss);
        ks.load(null, "1111".toCharArray());
        //recorremos todos los certificados e imprimimos el titulo
        Enumeration aliases = ks.aliases();
        String alias = null;
        while (aliases.hasMoreElements()) {
            alias = (String) aliases.nextElement();
            System.out.println(alias);
        }

        //creamos el controlador de seguridad
        JCertificadosSUN loCert = new JCertificadosSUN();
        //establecemos el keystore
        loCert.setKeyStore(ks);
        //seleccionamos un certificado
        new JFrameSeleccionarCertificado(null, loCert).setVisible(true);

        SSLContext sc = SSLContext.getInstance("SSLv3");

        url = new URL("https://172.16.0.4:8443/");

        connection = (HttpsURLConnection) url.openConnection();
        //establecemos el verificador de nombres, la funcion de esta clase es comprobar que el certificado del servidor
        //contiene la direccion del servidor, si se construye con true ignora esta comprobacion, util para pruebas
        connection.setHostnameVerifier(new JTramitacionOnLineHostNameVerifier(true));
        //establecemos el conexto ssl, con nuestro controlador de certificados que ya tiene el certificado a usar
        sc.init(
                //controlador de certificados que ya tiene el certificado a usar
                new KeyManager[]{
                    new JTramitacionOnLineKeyManager(loCert)
                },
                //TrustManager:comprueba la cadena de confianza del certificado del servidor
                //cuando se crea a true no comprueba la cadena de confianza del certificado del servidor, es util cuando somos nosotros los q creamos los certificados
                new TrustManager[]{new JTramitacionOnLineTrustManager(true)},
                null);
        connection.setSSLSocketFactory(sc.getSocketFactory());
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setRequestProperty("User-Agent", "Mozilla/4.05 [en] (WinNT; I)");
        connection.setFollowRedirects(true);
        connection.setInstanceFollowRedirects(true);
        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());

        out.write("");
        out.close();

        System.err.println(connection.getResponseCode());

        InputStream in = connection.getInputStream();
        int l;
        while ((l = in.read()) >= 0) {
            System.out.print((char) l);
        }
    }
}

2. Firma digital y verificación

        ICertificados loAux = new JCertificadosSUN();
        Vector loVector = loAux.getListaCertificados();
        loAux.mostrarInformacionCertificados(loVector);
        loAux.setX509Certificate((X509Certificate) loVector.get(0));
        byte[] lab = loAux.sign("pepe".getBytes());

        System.out.println(loAux.getTransFormarABASE64(lab));

        System.out.println("    La verificación resultó:  " + loAux.verificar("pepe".getBytes(), lab) + "!!!\n");



3. Seleccionar un certificado de forma visual


        try {
            ICertificados loCert = new JCertificadosSUN();
            //mostramos el formulario para seleccionar un certificado digital
            new JFrameSeleccionarCertificado(null, loCert).setVisible(true);
            byte[] lab = loCert.sign("pepe".getBytes());
            System.out.println(loCert.getTransFormarABASE64(lab));
            System.out.println("    La verificación resultó:  " + loCert.verificar("pepe".getBytes(), lab) + "!!!\n");
        } catch (Exception ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(new JLabel(), ex);
        }

4. Firmar un PDF

                //leemos certificado
                KeyStore ks = KeyStore.getInstance("pkcs12");
                ks.load(new FileInputStream(msFirmaFichero), msFirmaPasword.toCharArray());
                JCertificadosSUN loCert = new JCertificadosSUN();
                loCert.setKeyStore(ks);
                loCert.setPassword(msFirmaPasword);
                loCert.setX509Certificate((X509Certificate)loCert.getListaCertificados().get(0));
                //leemos el fichero PDF recien creado
                FileInputStream loin = new FileInputStream("PDFOriginal.pdf"));
                //un nuevo fichero de firma
                File loFilePDF = new File("PDFFirmado.pdf");
                loFileO = new FileOutputStream(loFilePDF);
                //firma del fichero
                loCert.fimarPDF(loin, loFileO, "ITV", "SPAIN", new Rectangle(0, 450, 200, 100));

                //verificar firma
                loCert.verificarPDF(new FileInputStream(loFilePDF), null);


NOTA: al abrirlo en Acrobat Reader te indica si la firma es valida, esto lo acepta el cliente cuando lo  abre.
Si el certificado no es de confianza lo puedes añadir a la cadena de confianza: una vez abierto el documento ir a propieades de la firma, mostrar certificado, pestaña confianza, agregar idetntidades de confianza y marcarlo todo