Foros del Web » Programación para mayores de 30 ;) » Java »

certificado y firma digital

Estas en el tema de certificado y firma digital en el foro de Java en Foros del Web. Hola. Tengo una serie de dudas y a ver si me las podeis resolver. A esta aplicaccion accedo con un dnie. El caso es que ...
  #1 (permalink)  
Antiguo 24/03/2008, 12:37
 
Fecha de Ingreso: mayo-2004
Mensajes: 180
Antigüedad: 20 años
Puntos: 2
certificado y firma digital

Hola. Tengo una serie de dudas y a ver si me las podeis resolver.
A esta aplicaccion accedo con un dnie. El caso es que una vez accedo, selecciono un fichero y necesito firmarlo digitalmente con ese certificado. El numero de usuarios que hay en la aplicacion es variable y cada uno debe poder firmar con su certificado. el caso es que no se como, ni por donde tirar.
He estado echandolo un ojo a X509Certificate pero no se hacia donde tirar.
Alguien me ayuda?

Gracias
  #2 (permalink)  
Antiguo 30/07/2009, 15:59
Avatar de alrik  
Fecha de Ingreso: enero-2005
Mensajes: 45
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: certificado y firma digital

Reviviendo el tema, a ver tengo mas o menos la solución pero me faltan cosas.

Código:
import java.security.*;
import java.security.spec.*;

String key = "-----BEGIN CERTIFICATE-----" +
                "MIIDpTCCAw6gAwIBAgIJANgchXrpgvXcMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD" +
                "VQQGEwJFUzEPMA0GA1UECBMGTWFkcmlkMQ8wDQYDVQQHEwZNYWRyaWQxFDASBgNV" +
                "BAoTC21zZnNvZnR3YXJlMQ8wDQYDVQQLEwZrZXl6YW0xFzAVBgNVBAMTDnd3dy5r" +
                "ZXl6YW0uY29tMSMwIQYJKoZIhvcNAQkBFhRpbmZvQG1zZnNvZnR3YXJlLmNvbTAe" +
                "Fw0wOTA3MDIyMDMzMjBaFw0xMDA3MDIyMDMzMjBaMIGUMQswCQYDVQQGEwJFUzEP" +
                "MA0GA1UECBMGTWFkcmlkMQ8wDQYDVQQHEwZNYWRyaWQxFDASBgNVBAoTC21zZnNv" +
                "ZnR3YXJlMQ8wDQYDVQQLEwZrZXl6YW0xFzAVBgNVBAMTDnd3dy5rZXl6YW0uY29t" +
                "MSMwIQYJKoZIhvcNAQkBFhRpbmZvQG1zZnNvZnR3YXJlLmNvbTCBnzANBgkqhkiG" +
                "9w0BAQEFAAOBjQAwgYkCgYEAxluS0xZanQPySJfsGmjbf8+IwS44OvaVIKZBJQ8C" +
                "CNydfl8X4pKUbmzThms+tA5YZiEhjDkwUApZP0ac19O68DbPpWJlv8shjKch9cVo" +
                "odJoWa9RUmkKPZvs0ziBtNlejfRws4nKSL7y/HtWgquPWKfzPX01J6FBWQmISCZQ" +
                "FwUCAwEAAaOB/DCB+TAdBgNVHQ4EFgQUfHNglvzAX1O19R8gwNPdr/npHAYwgckG" +
                "A1UdIwSBwTCBvoAUfHNglvzAX1O19R8gwNPdr/npHAahgZqkgZcwgZQxCzAJBgNV" +
                "BAYTAkVTMQ8wDQYDVQQIEwZNYWRyaWQxDzANBgNVBAcTBk1hZHJpZDEUMBIGA1UE" +
                "ChMLbXNmc29mdHdhcmUxDzANBgNVBAsTBmtleXphbTEXMBUGA1UEAxMOd3d3Lmtl" +
                "eXphbS5jb20xIzAhBgkqhkiG9w0BCQEWFGluZm9AbXNmc29mdHdhcmUuY29tggkA" +
                "2ByFeumC9dwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBZboTUJvra" +
                "YbpmNwBmHyeuRXhKgw7tOpai6nVFzS8l/z1QFZrAPTcDtOoyKWAwYqg+jlkcH72t" +
                "7axKB/i/HI+RUNbq6Xk/Cpdpvso1RBSo7aMR3o5duCPT/zf87P0BCipKciqTJ/dN" +
                "4aimzgbq/S7eh3OY8H4+LhZgDnAqFcLxxA==" +
                "-----END CERTIFICATE-----";
        
        byte[] encKey = key.getBytes();
        //X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
        X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);

        KeyFactory keyFactory1;
        PublicKey pubKey;
        try {
            keyFactory1 = KeyFactory.getInstance("RSA");
            try {
                pubKey = keyFactory1.generatePublic(pubKeySpec);
            } catch (InvalidKeySpecException ex) {
                JOptionPane.showMessageDialog(this,ex.getMessage());
            }
        } catch (NoSuchAlgorithmException ex) {
            JOptionPane.showMessageDialog(this,ex.getMessage());
        }
Funciona pero me da un error diciendo que la clave no es válida.

¿Alguien sabe cómo solucionarlo? He leido por ahí que es por que el chisme este no acepta los .pem pero claro... es lo que tengo y no puedo andar convirtiéndolo.

¿Alguien sabe como se podría solucionar sin tener que pasar el String a .der? que pa empezar no se puede por que el .der es binario pro weno....
  #3 (permalink)  
Antiguo 31/07/2009, 17:08
Avatar de alrik  
Fecha de Ingreso: enero-2005
Mensajes: 45
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: certificado y firma digital

Bueno buscando por ahí he encontrado lo que parece ser un error de compatibilidad de PEM con JAVA, es decir, no sirven para X509 de java los archivos PEM, en todas sus formas. SOLO SON VALIDOS LOS ARCHIVOS .der o .cer que se pueden hacer con el explorer o con el openssl.

openssl x509 -inform PEM -in cert.pem -outform DER -out cert.der

Para quien lo necesite.

En el caso de querer hacerlo con el explorador de windows, abridlo-> herramientas -> opciones de internet -> contenido -> certificados -> importar

Ahí importais el archivo .pem recordad que es el que lleva el rollo ese de
"----BEGIN ...." "-----END...."

Recordad meterlo en "otras personas" para que podáis luego exportarlo a DER.

Y bueno hasta ahí la parte facil... ahora estoy intentando investigar como solucionar una excepción rara...

derInputStream.getLenght() : lenghtTag = 111 too big

Que intuyo que es por que el certificado no está bien, pero a ver si puedo encontrar la respuesta dentro de unos días. Y de paso la dejo aquí puesta por que es una gracia andar buscando información de esto y que no haya nada ni en español ni en inglés casi...
  #4 (permalink)  
Antiguo 01/08/2009, 23:42
Avatar de alrik  
Fecha de Ingreso: enero-2005
Mensajes: 45
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: certificado y firma digital

Nueva información, he encontrado una función que permite simplificar un poco el tema, aunque ahora en lugar del error anterior me sale otro tipo de error:

Código:
public static PublicKey get(String filename)
        throws Exception {
        File f = new File(filename);
        FileInputStream fis = new FileInputStream(f);
        DataInputStream dis = new DataInputStream(fis);
        byte[] keyBytes = new byte[(int)f.length()];
        dis.readFully(keyBytes);
        dis.close();

        X509EncodedKeySpec spec =
          new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }
El error es: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)

A ver si encuentro la solución algún siglo de estos ¬¬
  #5 (permalink)  
Antiguo 07/08/2009, 00:47
Avatar de alrik  
Fecha de Ingreso: enero-2005
Mensajes: 45
Antigüedad: 19 años, 4 meses
Puntos: 0
Respuesta: certificado y firma digital

PORRRRRR FINNNNNNNNN LO HE CONSEGUIDO, hay que ver la de tiempo que me he tirado... puff.

Al final he descubierto que solo se puede hacer lo siguiente:

Mediante esta página:

http://codeartisan.blogspot.com/2009...y-in-java.html

Hay que seguir estos pasos a hacer con tu clave privada para generar una nueva clave pública válida en JAVA.

# generate a 2048-bit RSA private key
$ openssl genrsa -out private_key.pem 2048

# convert private Key to PKCS#8 format (so Java can read it)
$ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem \
-out private_key.der -nocrypt

# output public key portion in DER format (so Java can read it)
$ openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der

Después os aseguro que funciona:

Código:
public static PublicKey get(String filename)
        throws Exception {
        File f = new File(filename);
        FileInputStream fis = new FileInputStream(f);
        DataInputStream dis = new DataInputStream(fis);
        byte[] keyBytes = new byte[(int)f.length()];
        dis.readFully(keyBytes);
        dis.close();

        X509EncodedKeySpec spec =
          new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }
Este código os permitirá conseguir la clavePública desde un fichero.

Código:
     public static boolean verifySig(byte[] data, PublicKey key, byte[] sig) throws Exception {
        Signature signer = Signature.getInstance("SHA1withRSA");
        signer.initVerify(key);
        signer.update(data);
        return (signer.verify(sig));
      }
Este os permitirá verificar la firma digital.

Cuando leáis la firma como tenéis que pasarla en binario si la leeis de algún sitio que esté en hexadecimal:

byte[] signature = new BigInteger(keyzamSignature, 16).toByteArray();

Y ya está ahí acaba mi quebradero de cabeza durante 8 días.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:37.