Dokumente signieren und verifizieren

Mi, 9. Dezember 2020, Ralf Hersel

Wer hat heute noch einen Drucker, Scanner, Kopierer zu Hause? Kaum noch jemand, weil im privaten und geschäftlichen Bereich das papierlose Büro - nach gefühlten 20 Jahren - immer mehr zur Realität wird. Damit wird auch die persönliche Unterschrift unter Dokumenten irrelevanter; ohne Papier gibt es keine Unterschrift. Die Sicherheit einer analogen Unterschrift kann sowieso in Zweifel gezogen werden. Was mache ich nun, wenn ich ein Dokument elektronisch unterschreiben möchte und den Empfänger in die Lage versetzen möchte, diese Unterschrift zu überprüfen?

Wer schlechte Laune hat, oder auf eine einfache Lösung hofft, sollte jetzt nicht weiterlesen.

Schlüssel erstellen

Um ein Dokument elektronisch unterschreiben zu können, werden zwei Schlüssel benötigt; ein privater und ein öffentlicher Schlüssel (private/public key). Diese können mit dem Programm GPG ganz einfach erzeugt werden. Dazu öffnet man ein Terminal und gibt ein:

gpg --full-generate-key

In einem Dialog müssen mehrere Fragen beantwortet werden:

  • Art des Schlüssels: hier wählt man RSA aus
  • Länge des Schlüssels: 4096
  • Dauer der Schlüsselgültigkeit: hier wählt man z.B. 0, für unbegrenzte Gültigkeit
  • Name, Vorname
  • E-Mail-Adresse
  • Ein Kommentar, z.B.: "Das ist die Unterschrift von Hein Mück"
  • Passwort für die Schlüssel (Achtung, nicht vergessen)

Danach erhält man Informationen über die Schlüssel:

  • Allgemeine Infos zu den Schlüsseln
  • Verzeichnis, in dem die beiden Schlüsselpaare liegen
  • Widerrufzertifikat für die Schlüssel. Das ist wichtig, falls die Schlüssel kompromittiert werden.

All diese Informationen sollte man sorgfältig abspeichern. Das war der schwierige Teil; jetzt wird es einfacher. In der Regel werden die Schlüsselinformationen in der Schlüsselverwaltung der Linux-Distribution gespeichert, z.B. Seahorse (Passwörter und Verschlüsselung) bei Ubuntu.

Dokument signieren

Mit dem Begriff 'Dokument' sind alle denkbaren Dateien gemeint; das können Office-Dokumente, Bilder, PDFs, ZIP-Dateien, Filme, usw. sein. Um eine Datei zu unterschreiben, öffnet man das Verzeichnis, in dem die Datei gespeichert ist, startet ein Terminal (Ctrl+Alt+t), und gibt dieses Kommando ein:

gpg --sign Beispiel.pdf

Bei der Datei 'Beispiel.pdf' kann es sich um jede x-beliebige Datei handeln. Nach der Ausführung des Befehls befindet sich eine neue Datei im Verzeichnis, die die Endung 'gpg' hat, also 'Beispiel.pdf.gpg'. Nun kann man überprüfen, ob die Unterschrift korrekt erstellt wurde:

gpg --verify Beispiel.pdf.gpg

Die Ausgabe des Befehls zeigt, ob alles in Ordnung ist. Nun kann es sein, dass man mehrere (private) Schlüssel besitzt. In diesem Fall kann angegeben werden, welcher Schlüssel verwendet werden soll:

gpg --sign --default-key hein.mueck@gnulinux.ch Beispiel.pdf

Die Datei Beispiel.pdf.gpg ist in jedem Fall (auch wenn das Original eine reine Textdatei ist) eine nicht lesbare Binärdatei, die sowohl das Original als auch die Signatur enthält. Achtung: diese Datei ist nicht verschlüsselt.

Falls das Original eine reine Textdatei ist, kann man auch eine lesbare Variante erstellen, und zwar so:

gpg --clearsign text.txt

Als Ergebnis erhält man die Datei: text.txt.asc mit folgendem Inhalt:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Hello World
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAdFiEEl15wLa6nUqLpUnQBMKHnt8+JCB8FAl/JFUIACgkQMKHnt8+J
CB/mzA/8COVF9JQbrwb1q90Iax/0MMKohllF9S08S0PpPRgaJU0yLKuv9jGQymSZ
T0MLLI5Ht...
-----END PGP SIGNATURE-----

Im oberen Teil sieht man den Inhalt 'Hello World' und unten liegt die Signatur.

Dokument versenden

Um das Dokument per E-Mail zu versenden, gibt es zwei Möglichkeiten. Entweder man schickt die Datei mit der Endung 'gpg' als Anhang oder man sendet die Datei mit der Endung 'asc' als Text der E-Mail. Letzteres ist nur sinnvoll, wenn das Original eine Text-Datei ist, da ansonsten der Inhalt nicht gelesen werden kann.

Public Key bereitstellen

Damit die Empfängerin den signierten Inhalt/Anhang der E-Mail überprüfen kann, benötigt sie den öffentlichen Schlüssel (public key) des Absenders. Dazu gibt es verschiedene Möglichkeiten: entweder man übergibt den Schlüssel physisch (USB-Stick), oder sendet ihn als Datei über einen separaten Kanal (z.B. Messenger), oder stellt ihn auf der eigenen Webseite bereit, oder publiziert ihn über einen Schlüsselserver, wie z.B.: https://keys.openpgp.org/search?q=ralf.hersel@gmx.net

Dokument verifizieren

Um das per E-Mail empfangene Dokument verifizieren zu können, wird der öffentliche Schlüssel (public key) des Senders benötigt. Wir gehen im Beispiel davon aus, dass die Datei Beispiel.pdf.gpg als Anhang geschickt wurde. Vor der Verifikation muss der Public Key in den Schlüsselpunkt importiert werden:

gpg -- import public-key-von-hein-mueck.asc

Nun kann das signierte Dokument mit dem Public Key überprüft werden:

gpg --verify Beispiel.pdf.gpg

Mit diesem Befehl wird lediglich die Signatur geprüft. Das Ergebnis lautet z.B.: 'Korrekte Signatur von Hein Mück'. Zusätzlich erhält man den Hinweis, dass dieser Signatur nicht vertraut wird: 'Dieser Schlüssel trägt keine vertrauenswürdige Signatur! Es gibt keinen Hinweis, dass die Signatur wirklich dem vorgeblichen Besitzer gehört.'

gpg --output Beispiel.pdf --verify Beispiel.pdf.gpg

Dieses Kommando überprüft die signierte Datei und erzeugt die Originaldatei: Beispiel.pdf

Fazit

Wie jede Leserin zugestehen wird, ist das beschriebene Verfahren der Signierung eines Dokumentes, jenseits von jeder Benutzerfreundlichkeit. Ich habe zwei Wochen gebraucht, bis ich diesen Artikel korrekt verfassen konnte. Die Verschlüsselung und Signierung von beliebigen Dateien ist möglich, jedoch zu kompliziert, um es im Alltag einsetzen zu können.

Alternative

Ein einfacherer Weg besteht im Verschlüsseln, Versenden und Entschlüsseln einer Datei. Das geht so:

gpg -c Beispiel.pdf

Nach der zweimaligen Eingabe eines Passwortes wird die Datei 'Beispiel.pdf.gpg' erzeugt. Diese Datei ist nicht signiert, aber verschlüsselt. Nun sendet man die gpg-Datei über einen beliebigen Kanal an die Empfängerin und das Passwort über einen anderen Kanal. Der Empfänger entschlüsselt die Datei so:

gpg -d Beispiel.pdf.gpg > Beispiel.pdf

Nach Eingabe des separat übermittelten Passwortes wird die Originaldatei 'Beispiel.pdf' erzeugt. Eine Unterschrift ist in diesem Fall nicht nötig, weil man bereits den zwei separierten Übertragungskanälen vertraut hat.

Quellen
Signieren: https://www.devdungeon.com/content/gpg-tutorial#signatures
Verifizieren: https://www.devdungeon.com/content/how-verify-gpg-signature

Es wurden noch keine Kommentare verfasst, sei der erste!