2012-07-17 13 views
5

Estoy intentando firmar digitalmente XML en Perl usando el módulo Crypt::OpenSSL::RSA. Estoy cargando una clave privada de un archivo. La clave privada se generó desde un almacén de claves usando Java.Firmas digitales XML en Perl

A continuación se muestra el código Perl:

my $private = 'my_priv.key'; 
my $private_key = read_file($private); 
print "my private key text is\n", $private_key; 

de salida, no poner toda la clave aquí, sólo las pocas primeras líneas :-)

> -----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKAuqJ1ZkxHZStfSt0CdEsaSYuLO 
> 6zDiTpt60asVLWpLe2bf... 


my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($private_key); 
print "my private key is\n",$rsa_priv->get_private_key_string(); 

salida :

> -----BEGIN RSA PRIVATE KEY----- 
> MIICXAIBAAKBgQCgLqidWZMR2UrX0rdAnRLGkmLizusw4k6betGrFS1qS3tm3+97 
> wMvFXCx0Od8eb 

Los resultados de $private_key y $rsa_priv->get_private_key_string() son diferentes. ¿Se supone que debe comportarse así?

¿Alguien ha podido firmar XML usando Crypt::OpenSSL::RSA?

edición:

estoy usando el código de Java para extraer la clave privada, el código es la siguiente `almacén de claves ks = KeyStore.getInstance ("JKS");

keypass = sPass.toCharArray(); 

FileInputStream fis = new FileInputStream(store); 
ks.load(fis, sPass.toCharArray()); 
fis.close(); 

String eol = System.getProperty("line.separator"); 

Key k = ks.getKey(alias, keypass); 

System.out.println("....Generating the Private Key....."); 
String encKey = new BASE64Encoder().encode(k.getEncoded()); 
System.out.println("Encoded Key: " + encKey); 
BufferedWriter myKey = null; 
myKey = new BufferedWriter(new FileWriter(alias + "_priv.key")); 
myKey.write("-----BEGIN PRIVATE KEY-----" + eol); 
myKey.write(encKey + eol); 
myKey.write("-----END PRIVATE KEY-----"); 
myKey.close(); 
System.out.println("....Private Key Generated.....");` 

usando Java y Perl porque los XMLs Estoy tratando de firmar están en Perl (que es un gran sistema entero) y el almacén de claves está en java.

primera vez digitalmente firmar nada y mi XML firmado digitalmente no está autenticando en absoluto al sistema receptor

+0

Tal vez podría ayudar si se agrega el comando 'keytool' utilizado para generar la clave privada de Java. –

+0

acaba de agregar el código utilizado para generar la clave privada – qateey

Respuesta

1

Los resultados de $private_key; y $rsa_priv->get_private_key_string(); son diferentes, se supone que esto comporte así?

Sí, la entrada es una tecla X509, la salida es una tecla RSA. openssl rsa -in my_priv.key da el mismo resultado.

Si no tiene idea de esto, es mejor que tenga una biblioteca de alto nivel.

+0

intenté trabajar con XML-Sig pero no funcionaba con mi aplicación, el xml resultante no se estaba autenticando, pensé que utilizaría este enfoque para comprender mejor todo el proceso , soy un poco nuevo en firmas digitales y openssl – qateey

+1

@qateey y @daxim, 'XML :: Sig' es * no * una buena recomendación: http://matrix.cpantesters.org/?dist=XML-Sig+ 0.22, 'Net :: SAML2 ', por otro lado: http://matrix.cpantesters.org/?dist=Net-SAML2+0.17 – Axeman

+0

Axeman, debe aprender a leer los informes automáticos de pruebas resumidos correctamente. ¡Debería desconfiar de un resultado completamente rojo! En el caso de XML-Sig, solo falta una dependencia. Esto enmascara un problema real con las teclas DSA y PKCS # 8, pero mientras qateey mantenga las claves RSA, el módulo es perfectamente utilizable. – daxim