zur Startseitezur Info-Startseite

PGP/MIME-Signaturen manuell verifizieren

Version 1.0, 19.10.2013

Es kann passieren, dass man ohne die Zuhilfenahme eines Mailclients (o.Ä.) überprüfen möchte, ob eine PGP/MIME-Mail korrekt signiert ist. Wie man das alleine mit gpg hinbekommt, wird in diesem Dokument erklärt.

die Standards

Die zugrundeliegenden Standards sind RfC 2045 & RfC 2046 (beide MIME), RfC 3156 (MIME Security with OpenPGP) und RfC 4880 (OpenPGP Message Format).

die Beispiele

Im folgenden werden zwei Beispiele verwendet, weil es zwei Arten von Signaturen gibt: Signaturen über Binärdaten und Signaturen über Text im kanonischen Format (d.h. mit Windows-Zeilenumbrüchen: CR-LF, \r\n).

KMail (binäre Signatur) Thunderbird / EnigMail (Textsignatur)
 1 --nextPart2277130.ZFjIJeZDsO
 2 Content-Transfer-Encoding: quoted-printable
 3 Content-Type: text/plain; charset=utf-8
 4 
 5 Am Fr 18.10.2013, 22:33:13 schrieb Hauke Laging:
 6 > Dies ist ein Testtext mit Umlauten: =C3=A4=C3=B6=C3=BC=C3=9F
 7 
 8 --nextPart2277130.ZFjIJeZDsO
 9 Content-Type: application/pgp-signature; name=signature.asc
10 Content-Description: This is a digitally signed message part.
11 Content-Transfer-Encoding: 7Bit
12 
13 -----BEGIN PGP SIGNATURE-----
14 Version: GnuPG v2.0.19 (GNU/Linux)
15 
16 iQFYBAABCABCBQJSYZxQOxpodHRwOi8vd3d3LmhhdWtlLWxhZ2luZy5kZS9vcGVu
17 cGdwL3BvbGljeV9fMHgxYTU3MWRmNS5odG1sAAoJEEhrF6s/lq2OFQQH/1diQHcy
18 pPy9n6dz+Br0V2V5G1BmyBmJZ34h0opBKRWUI+KfhNwc1rdHQRJI8fIz+w1kabsN
19 4wLJYnIsjr6ff4KQfg4C/JrkHTRcBA3ej1ZfJIw/+5mxa/LWX1DVljrQlC8P6Wbe
20 pB9ZKagnBLuk3Ez3vTASb/5FqXQMd22JQ54JoUNwLuogsovSSQWrRYIrJXjLPUmy
21 G9jafjunDcl/4i7MJCsR2Pi3p07MVbglfC11UjpDUOBtpWbEjbgfiw6J0TO+NWt3
22 c34KDFqJUMS04J/6vK4L2WKDq5E04ew3hpaH3z1op8otpjky026WH4//Jp7EfV6a
23 w7idt1QFe+JbaHg=
24 =bjyN
25 -----END PGP SIGNATURE-----
26 
27 --nextPart2277130.ZFjIJeZDsO--
 1 --gvFCNCHXlHLRLaB9eDpXC10ksOV9nqjb3
 2 Content-Type: text/plain; charset=UTF-8
 3 Content-Transfer-Encoding: quoted-printable
 4 
 5 Am 18.10.2013 22:33, Hauke Laging schrieb:
 6 > Dies ist ein Testtext mit Umlauten: =C3=A4=C3=B6=C3=BC=C3=9F
 7 
 8 
 9 
10 --gvFCNCHXlHLRLaB9eDpXC10ksOV9nqjb3
11 Content-Type: application/pgp-signature; name="signature.asc"
12 Content-Description: OpenPGP digital signature
13 Content-Disposition: attachment; filename="signature.asc"
14 
15 -----BEGIN PGP SIGNATURE-----
16 Version: GnuPG v2.0.19 (GNU/Linux)
17 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
18 
19 iQFYBAEBCABCBQJSYaIROxpodHRwOi8vd3d3LmhhdWtlLWxhZ2luZy5kZS9vcGVu
20 cGdwL3BvbGljeV9fMHgxYTU3MWRmNS5odG1sAAoJEEhrF6s/lq2OVHIIAI7Q5Xcu
21 mQrL1xs7LwN+55tG5inHbBSoni34QXxfu8y0SCzS/LJSCW/YIczwB1Db4DfzSdRa
22 bCZgEgk2XZ/40VeVkTB91nDjnYjLJmldw7gO+ErU/BU0jdnZj1ngs1rR75V5Z15T
23 gos5V+eVsQOoQclPcGX6VcIGljdzRNw8tSN6RmAS4SBw+eR71fOSn+cEEjUDVu1c
24 zyc6a2wX4QTuutbKzrKGACOIkKuJO1OtJySvA/YTX3z2JrBsbyKle2c2dl31k8tD
25 NY7eKEmIMc+JqglkWQmUKDuTpzyei9s2RYAw10LMpO8k5CU7+TraIlzwf7r8P01X
26 0rsDpiO0tW1Idmg=
27 =NoH2
28 -----END PGP SIGNATURE-----
29 
30 --gvFCNCHXlHLRLaB9eDpXC10ksOV9nqjb3--

Die beiden Mails unterscheiden sich inhaltlich dadurch, dass die KMail-Variante nur aus zwei Zeilen Text besteht, während die Thunderbird-Variante darunter noch zwei Leerzeilen hat. Das ist natürlich der unterschiedlichen Eingabe geschuldet und keine Eigenmächtigkeit der Mailclients.

Die MIME-Trenner, hier

sind für jede Mail neu festgelegte Zufallswerte.

Signaturtypen

Um es spannender zu machen, verwenden die OpenPGP-Clients unterschiedliche Signaturtypen. Es gibt (aus gutem Grund) Signaturen für Binärdaten (im Sinne von "beliebige Daten", das kann auch Text sein) und solche für Text. Textsignaturen sorgen dafür, dass die Signatur den Sprung von Linux zu Windows oder Mac überlebt – diese Plattformen codieren Zeilenumbrüche unterschiedlich. Das bedeutet, dass man im Fall von Binärsignaturen sicherstellen muss, dass die Eingabedaten die richtige Codierung haben.

Die Codierung findet man heraus, indem man den Signaturblock (inklusive der Einleitungs- und Endzeile) in eine Datei kopiert und die von gpg --list-packets dateiname analysieren lässt. Man kann aber auch auf die Datei verzichten, indem man die Daten per Copy&Paste und Pipeline in der Shell in gpg schiebt:

Kommandozeilen-Eingabe
start cmd:> echo "-----BEGIN PGP SIGNATURE-----
cont. cmd:> Version: GnuPG v2.0.19 (GNU/Linux)
cont. cmd:> 
cont. cmd:> iQFYBAABCABCBQJSYZxQOxpodHRwOi8vd3d3LmhhdWtlLWxhZ2luZy5kZS9vcGVu
cont. cmd:> cGdwL3BvbGljeV9fMHgxYTU3MWRmNS5odG1sAAoJEEhrF6s/lq2OFQQH/1diQHcy
cont. cmd:> pPy9n6dz+Br0V2V5G1BmyBmJZ34h0opBKRWUI+KfhNwc1rdHQRJI8fIz+w1kabsN
cont. cmd:> 4wLJYnIsjr6ff4KQfg4C/JrkHTRcBA3ej1ZfJIw/+5mxa/LWX1DVljrQlC8P6Wbe
cont. cmd:> pB9ZKagnBLuk3Ez3vTASb/5FqXQMd22JQ54JoUNwLuogsovSSQWrRYIrJXjLPUmy
cont. cmd:> G9jafjunDcl/4i7MJCsR2Pi3p07MVbglfC11UjpDUOBtpWbEjbgfiw6J0TO+NWt3
cont. cmd:> c34KDFqJUMS04J/6vK4L2WKDq5E04ew3hpaH3z1op8otpjky026WH4//Jp7EfV6a
cont. cmd:> w7idt1QFe+JbaHg=
cont. cmd:> =bjyN
cont. cmd:> -----END PGP SIGNATURE-----" | gpg --list-packets
Programmausgabe
:signature packet: algo 1, keyid 486B17AB3F96AD8E
        version 4, created 1382128720, md5len 0, sigclass 0x00
        digest algo 8, begin of digest 15 04
        hashed subpkt 2 len 4 (sig created 2013-10-18)
        hashed subpkt 26 len 58 (policy: http://www.hauke-laging.de/openpgp/policy__0x1a571df5.html)
        subpkt 16 len 8 (issuer key ID 486B17AB3F96AD8E)
        data: [2047 bits]

Die Eingabe erfolgt, indem man echo " eingibt, dann den Signaturblock aus der Zwischeneingabe einfügt und dann " | gpg --list-packets eingibt.

Der spannende Teil der Ausgabe ist sigclass 0x00. Das zeigt eine Binärsignatur an. Für die EnigMail-Signatur erhält man sigclass 0x01, was eine Textsignatur markiert.

Prüfung

Man kopiert die Daten in eine Datei, beginnend mit der Zeile unter dem MIME-Trenner:

1 Content-Type: text/plain; charset=UTF-8
2 Content-Transfer-Encoding: quoted-printable
3 
4 Am 18.10.2013 22:33, Hauke Laging schrieb:
5 > Dies ist ein Testtext mit Umlauten: =C3=A4=C3=B6=C3=BC=C3=9F
6 
7 
8

Der Zeilenumbruch vor dem nächsten MIME-Trenner gehört nicht mehr zu den Daten (sondern zu dem MIME-Trenner). Die Prüfung erfolgt dann (wie immer bei abgetrennten Signaturen) mit:

gpg --verify signaturdatei datendatei

Bei einer Binärsignatur ist es (wenn unter Linux oder Mac geprüft wird) etwas komplizierter. Auch dann werden die Daten in eine Datei kopiert, aber die muss dann noch auf Windows-Zeilenumbrüche umgeschrieben werden (unter Linux z.B. mit unix2dos). Die Prüfung erfolgt dann genauso.

Und natürlich muss der entsprechende öffentliche Schlüssel vorhanden sein. Die Ausgabe von gpg --list-packets liefert auch die long ID des signierenden Schlüssels (das muss nicht der Hauptschlüssel sein!): keyid 486B17AB3F96AD8E

Fehler

Es gibt zwei Arten von Fehlern:

  1. Der Signaturblock ist kaputt.

  2. Die Daten passen nicht zur Signatur.

Zum Glück kann man der Fehlermeldung entnehmen, welches der Probleme vorliegt:

Daten passen nicht zur Signatur
gpg: Signatur vom Fr 18 Okt 2013 23:03:13 CEST
gpg:                mittels RSA-Schlüssel 0x3F96AD8E
gpg: FALSCHE Signatur von "Hauke Laging (Standardschlüssel)"
kaputte Signatur
gpg: Prüfsummenfehler; 6b3a18 - 3681f6
gpg: Keine Signatur gefunden
gpg: Die Signatur konnte nicht überprüft werden.

Dass ein Fehler der zweiten Art auftritt, ist in diesem Fall unwahrscheinlich. Ein Fehler der ersten Art dürfte zumeist daran liegen,