2012-07-17 4 views
5

Ich versuche, XML in Perl mit dem Crypt::OpenSSL::RSA Modul digital zu signieren. Ich lade einen privaten Schlüssel aus einer Datei. Der private Schlüssel wurde mithilfe von Java aus einem Keystore generiert.XML digitale Signaturen in Perl

Unten ist mein Perl-Code:

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

Ausgang, nicht den gesamten Schlüssel setzen hier, nur die wenigen ersten Zeilen :-)

> -----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(); 

Ausgang :

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

Die Ergebnisse von $private_key und $rsa_priv->get_private_key_string() sind unterschiedlich. Soll es sich so verhalten?

Hat jemand XML mit Crypt::OpenSSL::RSA signieren können?

edit:

i Java-Code bin mit dem privaten Schlüssel zu extrahieren, Code ist wie unten `Schlüsselspeicher 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.....");` 

mit Java und Perl, weil die xmls i in Perl zu unterzeichnen bin versucht sind (es ist ein ganz großes System) und der Schlüsselspeicher ist in Java.

Zum ersten Mal digital signieren alles und meine digital signierten XML überhaupt an das Empfängersystem nicht

+0

Vielleicht könnte es helfen, wenn Sie das 'keytool' Befehl hinzufügen, verwendet, um die Java privaten Schlüssel zu generieren. –

+0

nur hinzugefügt den Code verwendet, um den privaten Schlüssel zu generieren – qateey

Antwort

1

Die Ergebnisse $private_key; und $rsa_priv->get_private_key_string(); unterschiedlich sind, ist dies so verhalten soll die Authentifizierung?

Ja, der Eingang ist ein X509-Schlüssel, der Ausgang ist ein RSA-Schlüssel. openssl rsa -in my_priv.key gibt das gleiche Ergebnis.

Wenn Sie keine Ahnung von diesem Zeug haben, sind Sie besser mit einer High-Level-Bibliothek.

+0

Ich hatte versucht, mit XML-Sig, aber es funktionierte nicht mit meiner Anwendung, die resultierende XML wurde nicht authentifiziert, dachte ich würde diesen Ansatz verwenden, um den gesamten Prozess besser zu verstehen Ich bin ein bisschen neu auf digitale Signaturen und OpenSSL – qateey

+1

@Qateey und @ Daxim, 'XML :: Sig 'ist * nicht * eine gute Empfehlung: http://matrix.cpantesters.org/?dist=XML-Sig+ 0.22, 'Net :: SAML2 ', auf der anderen Seite: http://matrix.cpantesters.org/?dist=Net-SAML2+0.17 – Axeman

+0

Axeman, Sie müssen lernen, die zusammengefassten automatisierten Testberichte richtig zu lesen. Sie sollten über ein reines Rotverdächtiges suspicious sein! Im Fall von XML-Sig fehlt nur eine Abhängigkeit. Dies maskiert ein echtes Problem mit DSA- und PKCS # 8-Schlüsseln, aber solange Qateey RSA-Schlüssel hält, ist das Modul perfekt servicabel. – daxim