2017-05-10 1 views
2

Der Anwendungsfall ist wie folgt:C# - Get öffentliche Schlüssel von PDF-Signatur

  1. Benutzer auf eine Webseite eingeben, die ein Zertifikat
  2. Wenn gültig darzustellen erfordert, kann der Benutzer eine PDF herunterladen und unterzeichnen mit demselben Zertifikat
  3. Lädt die PDF-Datei hoch
  4. 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.

+0

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

+1

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

+0

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

Antwort

0

In Ihrem Code vergleichen Sie

  • der öffentliche Schlüssel Binärwert aus dem Zertifikat (HttpClientCertificate.PublicKey) mit
  • den binären Wert eines SubjectPublicKeyInfo Objekt (publicKeyInfo.ToAsn1Object().GetDerEncoded()), die den öffentlichen Schlüssel und seinen Algorithmus wickelt.

Letzteres könnte daher enthalten zu erwarten der ehemaligen aber nicht mit ihm zusammen.

A SubjectPublicKeyInfo ist wie folgt definiert:

publicKeyInfo.PublicKeyData.GetBytes() 
:

SubjectPublicKeyInfo ::= SEQUENCE { 
    algorithm AlgorithmIdentifier, 
    publicKey BIT STRING 
} 

Statt mit der binären Darstellung des vollständigen SubjectPublicKeyInfo Objekts zu vergleichen, damit Sie mit der binären Darstellung des enthaltenen öffentlichen Schlüssels vergleichen sollten

Verwandte Themen