Der Anwendungsfall ist wie folgt:C# - Get öffentliche Schlüssel von PDF-Signatur
- Benutzer auf eine Webseite eingeben, die ein Zertifikat
- Wenn gültig darzustellen erfordert, kann der Benutzer eine PDF herunterladen und unterzeichnen mit demselben Zertifikat
- Lädt die PDF-Datei hoch
- Server validiert PDF ist mit demselben Zertifikat signiert, das auf der Website angezeigt wird.
Ich stecke bei Schritt 4. Ich habe es geschafft, den Client-Zertifikat öffentlichen Schlüssel von der Website und auch aus dem PDF zu bekommen, sind aber nicht das Gleiche. Der öffentliche Schlüssel ist ein SHA256 RSA von 2048 Bits. Außerdem verwende ich iTextSharp, um PDF-Dokumente zu behandeln.
Hier ist mein Code:
HttpRequest request = context.Request;
HttpClientCertificate cert = request.ClientCertificate;
//get public key from client certificate
string certKey = BitConverter.ToString(cert.PublicKey).Replace("-", " ")
//now gets PDF and retrieves public key
PdfReader pdfreader = new PdfReader("path_to_pdf");
AcroFields fields = pdfreader.AcroFields;
AcroFields.Item item = fields.GetFieldItem("Signature1");
List<string> names = fields.GetSignatureNames();
foreach (string name in names){
PdfDictionary dict = fields.GetSignatureDictionary(name);
PdfPKCS7 pkcs7 = fields.VerifySignature(name);
Org.BouncyCastle.X509.X509Certificate cert = pkcs7.SigningCertificate;
//get public key from PDF cert
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(cert.GetPublicKey());
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = BitConverter.ToString(serializedPublicBytes).Replace("-", " ");
}
Mit diesem Code Certkey und serializedPublic sind nicht das gleiche.
sind sie grundlegend verschieden (in Bezug auf die Länge und die allgemeine Ähnlichkeit von Teilen der Byte-Sequenz), oder vielleicht nur eine DER/base64 Kodierung Mismatch? Wenn Sie beide Zertifikate mit den Zertifikatseigenschaftsdialogen des Betriebssystems oder PDF-Viewers betrachten, stimmen diese überein? – dlatikay
Ich habe davon nicht. Mein Code wird aus dem PDF erhalten, wie ich direkt aus der Zertifikatseigenschaft des Viewers sehen kann und ist nicht identisch mit dem Zertifikat – A77ak
Ich würde nicht vermuten, dass der Browser/iis Roundtrip mit [dem öffentlichen Schlüssel] (https: // msdn .microsoft.com/de-us/library/system.web.httpclientcertificate.publickey (v = vs.110) .aspx) ... dann sollten wir versuchen herauszufinden, wo sich der Unterschied zuerst bemerkbar macht. Ich nehme an, Sie haben eine Art selbstsigniertes Zertifikat zum Testen? funktioniert der öffentliche Schlüssel, wie er in der signierten PDF-Datei angezeigt wird, an erster Stelle? – dlatikay