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.
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). –