2016-05-28 3 views
0

Ich versuche, eine Datenzeichenfolge und seine RSA-SHA256-Signatur von einem Webdienst zu überprüfen, und ich bin völlig fest, den privaten/öffentlichen Schlüssel aus dem Zertifikat zu laden.Überprüfung der RSA SHA256-Signatur schlägt fehl Privater Schlüssel aus Zertifikat

Ich habe den folgenden Code Informationen aus der cer Datei abzurufen, denke ich, dass in einem DER-Format, weil es nicht in den typischen base64 ist codiert:

InputStream in = new FileInputStream(path1); 
CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) factory.generateCertificate(in); 
System.out.println(cert.toString()); 

Es gibt die ganze Informationen des Zertifikats:

Version: V3 
Subject: EMAILADDRESS=... 
... 
Algorithm: [SHA256withRSA] 
... 

aber wenn ein Versuch, die privaten Schlüssel mit dem folgenden Code zu laden und abrufen:

KeyFactory kf = KeyFactory.getInstance("RSA");   
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(encodedKey); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec); 
Signature sig = Signature.getInstance("SHA256withRSA"); 
sig.initVerify(bobPubKey); 
sig.update(data_received); 
sig.verify(signature_received); 

Ich erhalte die folgende Ausnahme

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format 

im keyFactory.generatePublic Verfahren. Gleiches Ergebnis, wenn es in generatePrivate geändert wird.

+2

Erstens, ein privater Schlüssel und die Öffentlichkeit sind zwei sehr unterschiedliche Dinge. Sie verifizieren mit einem öffentlichen Schlüssel. Das Zertifikat enthält einen öffentlichen Schlüssel. Es ist kein privater Schlüssel in das Verifizierungsstück involviert. Zweitens, da Sie herausgefunden haben, wie man das Zertifikat einliest, rufen Sie einfach ['getPublicKey()' auf dem X509Certificate-Objekt auf] (http://stackoverflow.com/questions/6358555/ob- taining-public-key-from-certificate). –

Antwort

1

Dank James, nach Ihrer Beratung Ich habe es mit dem folgenden:

 InputStream in = new FileInputStream(System.getProperty("user.dir") + "\\" + certificateName); 
     CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
     X509Certificate cert = (X509Certificate) factory.generateCertificate(in); 
     PublicKey pubKey = cert.getPublicKey(); 


     Signature sig = Signature.getInstance("SHA256withRSA"); 
     sig.initVerify(pubKey); 
     sig.update(xmlContent); 

     return sig.verify(headerSignature); 
Verwandte Themen