Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PHP-basiert signiertes PDF pruefen

2 views
Skip to first unread message

Stefan Froehlich

unread,
Nov 14, 2020, 7:38:18 AM11/14/20
to
Ich möchte gerne die Signatur von PDF-Dateien automatisch prüfen;
interessanterweise findet man zwar Anbieter für derartige Software,
aber wenigstens die Frage bezüglich Bordmitteln, die ich gefunden
habe, waren alle unbeantwortet.

In die Gegenrichtung kann das tcpdf, also habe ich mir deren etwas
hausbacken wirkenden Code einmal angesehen und versuche
(logischerweise nicht minder hausbacken), den umgekehrten Weg zu
gehen: Die PDF-Datei enthält den Text "/ByteRange[$i $j $k $l]",
wobei $j und $k die Position der Signatur innerhalb der PDF-Datei
angeben dürften - passt bei meinen Testdokumenten. Das PDF-Dokument
wird im ersten Schritt einmal um diese Signatur inklusive der
einschließenden <> verkürzt.

Von der Signatur entferne ich nun die <>, konvertiere sie zuerst mit
pack('H*') und danach mit base64_encode(). Das Ergebnis kann ich mir
mit openssl in plausiblen Klartext konvertieren, das dürfte also
passen.

Nun kommt PHP ins Spiel - offenbar lässt sich dort nur mit
<?php openssl_pkcs7_verify($file, PKCS7_NOVERIFY); ?> prüfen,
und dafür wird eine S/MIME-Struktur vorausgesetzt. Geht das denn
nicht direkter? Aber ok, also baue ich mir etwas zusammen, das so
aussieht:

#v+
MIME-Version: 1.0
Content-Type: multipart/signed;
protocol="application/x-pkcs7-signature"; micalg="sha-256";
boundary="----81B308D16C92710DEC77786E5C3EAD26"

This is an S/MIME signed message

------81B308D16C92710DEC77786E5C3EAD26
%PDF-1.3^M
[...]

------81B308D16C92710DEC77786E5C3EAD26
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIIGVgYJKoZIhvcNAQcCoIIGRzCCBkMCAQExCzAJBgUrJAMCAQUAMAsGCSqGSIb3
[...]
SfxWThXOFWCmHGQ3w1lELRcNkVOzZV6lJxQA3p6SGR0c4NPZ4Y8lux2t

------81B308D16C92710DEC77786E5C3EAD26--
#v-

...und werfe das openssl_pkcs7_verify() zum Fraß vor; leider ist das
Ergebnis "false", und ich habe keinen Tau, bei welchem Schritt der
Fehler wohl passiert sein mag.

Am Ende der (originalen) PDF-Datei befinden sich eine Reihe von
NULL-Bytes, ich habe es mit und ohne denen versucht. Ansonsten fällt
mir ad hoc nicht sehr viel ein, was ich anders machen könnte.

Ist der eingeschlagene Weg denn ganz prinzipiell in Ordnung?

Servus,
Stefan (X'post ohne F'up, ich wüsste noch nicht, wohin)

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - Extase in Moll!
(Sloganizer)
0 new messages