miércoles, 1 de diciembre de 2010

Certificados digitales

1. Firma "en bruto" con eDNI o con cualquier certificado incluido en internet explorer
2. Tomcat pida a internet explorer cliente un certificado digital eDNI
3. Acceso HTTPS con eDNI (DNI electrónico)

1. Firma "en bruto" con eDNI o con cualquier certificado incluido en internet explorer

1.1 mityc

(http://oficinavirtual.mityc.es/componentes/index.html)
Conjunto de clases y dll que ha desarrollado el ministerio de industria para la eFactura
Código:
  • Version 1.0.4
        IESignEngine moBrige = new IESignEngine();
        IPKStoreManager moStore = new IExplorerStore();
        Vector loVector1 = new Vector(moStore.getSignCertificates());
        moBrige.setBinaryCertificate(((X509Certificate) loVector1.get(0)).getEncoded());
        moBrige.setToSign("pepe".getBytes());
        byte[] lab1 = moBrige.engineSign();
        BASE64Encoder moBase64Encoder = new BASE64Encoder();
        BASE64Decoder moBase64Decoder = new BASE64Decoder();       
        System.out.println(moBase64Encoder.encode(lab1));
       
        Signature rsa_vfy = Signature.getInstance("SHA1withRSA");
        rsa_vfy.initVerify(((X509Certificate) loVector1.get(0)).getPublicKey());
        rsa_vfy.update("pepe".getBytes());

        boolean lbResult = rsa_vfy.verify(lab1);
       
        System.out.println("    La verificación resultó:  " + lbResult + "!!!\n");

  • Version 0.9
        // Accedemos al almacén de certificados de internet explorer
        InterfazFirma si = UtilidadFirmaElectronica.getSignatureInstance(EnumAlmacenCertificados.ALMACEN_EXPLORER);

        listCertificates = si.getAllCertificates("My");

        // Accedemos al almacén de certificados de Mozilla Firefox
        //InterfazFirma si = UtilidadFirmaElectronica.getSignatureInstance(EnumAlmacenCertificados.ALMACEN_MOZILLA);
        //listCertificates = si.getAllCertificates("Poner aqui la ruta al perfil de Mozilla");

        System.out.println("Hay " + listCertificates.size() + " certificados");
//        mostrarInformacionCertificados(listCertificates);
        //recogemos el certificado para firmar
//        moCerts = (X509Certificate[]) listCertificates.toArray();
        //Seleccionamos el primero de los certificados para firmar
        moX509 = (X509Certificate) listCertificates.get(0);
//        // Consigue la clave privada
//        moPriv = (PrivateKey) keystore.getKey(alias, pwd);
//
//        if (moPriv == null) {
//            throw new Exception(alias + " could not be accessed");
//        }
        byte[] labDatos = "perico de los palotes".getBytes();
        FirmaMSBridge loBrige = new FirmaMSBridge();
        loBrige.setBinaryCertificate(moX509.getSignature());
        loBrige.setToSign(labDatos);
        loBrige.engineSetParameter(
                ParametrosFirma.getInstance(
                    moX509.getSerialNumber(),
                    moX509.getIssuerDN().toString()));
        byte[] labFirma = loBrige.engineSign();


        System.out.println();
        System.out.println(new String(labFirma));
        System.out.println();

        BASE64Encoder base64Encoder = new BASE64Encoder();
        String lsFirmaBase64 = base64Encoder.encode(labFirma);

        System.out.println();
        System.out.println(lsFirmaBase64);
        System.out.println();

        BASE64Decoder base64Decoder = new BASE64Decoder();
        byte[] b= base64Decoder.decodeBuffer(lsFirmaBase64);
        byte[] datos= labDatos;

        //Verification:
        System.out.println("    Verificando la firma ...");
        Signature rsa_vfy = Signature.getInstance( "SHA1withRSA");
        rsa_vfy.initVerify(moX509.getPublicKey());
        rsa_vfy.update(datos);
        System.out.println("    La verificación resultó:  " + rsa_vfy.verify(b) + "!!!\n");

 

1.2 SunMSCAPI

Conjunto de clases y dll incorporadas en jre 1.6
KeyStore ks = KeyStore.getInstance("Windows-MY");
        // Note: When a security manager is installed, 
        // the following call requires SecurityPermission 
        // "authProvider.SunMSCAPI".
        ks.load(null, null); 

        byte[] data = ...
        String alias = "myRSA";

        PrivateKey privKey = (PrivateKey) ks.getKey(alias, null);
        Certificate cert = ks.getCertificate(alias);

        Provider p = ks.getProvider();
        Signature sig = Signature.getInstance("SHA1withRSA", p);
        sig.initSign(privKey);
        sig.update(data);
        byte[] signature = sig.sign();
        System.out.println("\tGenerated signature...");
        sig.initVerify(cert);
        sig.update(data);
        if (sig.verify(signature)) {
           System.out.println("\tSignature verified!");
        } 

2. Tomcat pida a internet explorer cliente un certificado digital eDNI


descomentar las lineas
    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

y dejarla asi

    <Connector port="8443" maxHttpHeaderSize="8192"  SSLEnabled="true"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
          acceptCount="100" scheme="https" secure="true"
        enableLookups="false" disableUploadTimeout="true"
               clientAuth="true" sslProtocol="TLS"
               truststoreFile="/home/eduardo/.truststore" truststorePass="eduardo"
            keystoreFile="/home/eduardo/myKeyStore" keystorePass="eduardo"
   />

Los parámetros de configuración del elemento "Connector" que debemos establecer son:
  1. clientAuth: true-> es el que pedira el certificado al cliente
  2. TruststoreFile: el certificado que cumpla la cadena de confianza podra ser seleccionado por el  cliente, "pá" enterdernos,  en el internet explorer solo aparareceran para seleccionar los certificados que cumplan la cadena de confianza de este archivo
  3. truststorePass: password del fichero anterior
  4. keystoreFile: el almacen de nuestro certificado digital en el servidor
  5. keystorePass: password del fichero anterior
keytool -v -keystore /home/eduardo/myKeyStore -genkey -keyalg rsa   

El keytool nos pedirá una contraseña: "eduardo". Después nos pedirá una serie de datos para el certificado:
Importante: en la pregunta¿Cuáles son su nombre y su apellido? poner la ip o dns de la pagina web, pq asi en el navegador de internet explorer puedes añadir el certificado a entidades emisoras raiz de confianza y asi NO te hace la pregunta de q "no es un certificado de confianza" O usar un certificado firmado por fnmt o @firma o firma profesional

Escriba la contraseña del almacén de claves: 
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
  [Unknown]:  172.16.0.4
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:  Informatica
¿Cuál es el nombre de su organización?
  [Unknown]:  informatica
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:  Murcia
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:  Murcia
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:  es
¿Es correcto CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es?
  [no]:  y

Generando par de claves RSA de 1.024 bits para certificado autofirmado (SHA1withRSA) con una validez de 90 días
    para: CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es
Escriba la contraseña clave para <mykey>
    (INTRO si es la misma contraseña que la del almacén de claves): 

Le damos a INTRO para que utilice la misma que la del almacén.
Bajarse el certificado raiz de eDNI http://www.cert.fnmt.es/index.php?cha=cit&sec=4&page=139&lang=es
 keytool -import -keystore /home/eduardo/.truststore -file FNMTClase2CA.cer 
    • Import the Chain Certificate into you keystore
      keytool -import -alias root -keystore <your_keystore_filename> \
       -trustcacerts -file <filename_of_the_chain_certificate>
    • And finally import your new Certificate
      keytool -import -alias tomcat -keystore <your_keystore_filename> \
       -trustcacerts -file <your_certificate_filename>

  • Prueba de que va todo bien:en internet explorer poner https://localhost:8443 y debe pedir el certificado digital eDNI
  • Configurar una aplicacion para forzar las comunicaciones como https
En el WEB-INF/web.xml de la aplicacion:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Entire  Application</web-resource-name>
    <url-pattern>*.ctrl</url-pattern>
    <url-pattern>*.jsp</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

esto es todas las paginas con .ctrl o .jsp se pedira propotoco seguro y el certificado digital eDNI

otro ejemplo

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Entire  Application</web-resource-name>
  <url-pattern>/secure/*</url-pattern>  
</web-resource-collection>

  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

Todas las llamadas q esten en el directorio /secure de la aplicacion
  • para obtener los datos del certificado del cliente en un servlet del servidor:

X509Certificate[] certs;
certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
if (certs != null) {
    clientCert = certs[0];
}

3. Acceso HTTPS con eDNI (DNI electrónico)



Para acceder a una página web mediante protocolo https con eDNI ver paquetesGUIxSeguridad

No hay comentarios:

Publicar un comentario