Ich versuche, die Signaturprüfung für PDFs zu implementieren. Es ist ein großes Thema, also gehe ich Schritt für Schritt vor, zuerst versuche ich, im Falle eines PDFs, das ich selbst unterschrieben habe, ein Positiv zurückzugeben, indem ich alle Standardwerte mit dem aktuellen Acrobat verwende - das sollte SHA256 sein für den Digest und eine PKCS7-abgelöste Signatur. Also knacke ich openssl, und indem ich den Byte-Bereich lese, der in der PDF angegeben ist und die Funktionen SHA256_*
aufruft, habe ich einen Hash, mit dem ich vergleichen kann. Jetzt muss ich die Zertifikatsdaten usw. lesen und die Funktionen PKCS7_*
verwenden. Dieser scheint der zu sein, den ich will:
als finden Sie in der Dokumentation . Außer dieser Dokumentation sagt mir nicht, wie ich eines dieser Dinge konstruiere. Ok, ich denke, die BIO *indata
kann mit einigen der Funktionen in hier und dem Array erstellt werden von denen, die diese verwenden (obwohl sie nicht die genauen Details ausgearbeitet haben), aber was ist mit dem PKCS7 *p7
? oder das STACK_OF(x)
, das angefordert wird. Ich kann keinen dokumentierten Weg finden, diese Strukturen zu initialisieren. Es gibt einige pkcs7_ctrl-Funktionen in der Kopfzeile pkcs7.h
: -
Aber ohne einige Richtlinien scheint dies nicht wie ein Wald, es wäre wirksam zu beginnen blind herumzustochern.
Habe ich etwas offensichtlich übersehen? Wie gehe ich vor, um diese Funktion mit den Datenwerten aufzurufen, die ich aus der PDF analysiert habe?
Ok, habe das alles auf (sehr) harte Weise herausgefunden. So machen Sie das, damit andere leichter lernen können.
Nehmen wir an, wir haben die Signatur char* sig
der Länge int sig_length
und die Verifizierungsdaten char* data
, int data_length
. (Es gibt einige Feinheiten für PDF-Signaturen, aber diese sind in der PDF-Spezifikation gut dokumentiert.)
Die Funktion, die die Arbeit erledigt, ist PKCS7_dataVerify, und Sie müssen keine Auszüge selbst ausführen.
Aber warten Sie, wenn Sie das versuchen, wird es nicht funktionieren! Warum? Weil die Überprüfung sowohl Vertrauen als auch Integrität schafft. Darüber hinaus müssen Sie auch Vertrauen schaffen, indem Sie dem Store Zertifikate hinzufügen, was ebenfalls kompliziert und nicht dokumentiert ist. Wenn Sie feinkörnige Ergebnisse wünschen, sollten Sie die Überprüfung über den Zertifikatspeicher wie folgt rückgängig machen:
%Vor%wo
%Vor%Sie können den Fehler auf "OK" setzen und ihn bestätigen, z. B. wenn Sie abgelaufene Zertifikate ignorieren möchten:
%Vor%Tags und Links c security openssl digital-signature pkcs#7