To main content

DNS-Eintrag für PGP-Key erstellen

Veröffentlicht von Benjamin Marwell am

Wer einen PGP-Key mit GnuPG oder ähnlichen Tools nutzt, möchte erreichen, dass andere Personen den eigenen Key leicht erhalten und prüfen können. Neben der üblichen Prüfung von Signaturen und Fingerprints bietet das Domain Name System (DNS) eine einfache Möglichkeit, zumindest eine kleine Prüfung vorzunehmen.

[caption id="attachment_5659" align="aligncenter" width="1440"]Verschlüsselung - Carola Langer / pixelio.deWelcher Schlüssel ist der richtige? Verschlüsselung - Carola Langer / pixelio.de[/caption]

Das funktioniert zwar nur mit einer eigenen Domain - aber den DNS-Einträgen vertraut man beim Senden einer E-Mail nunmal auch. Sie stehen unter der Kontrolle des Empfängers. Stimmt ein speziell formartierter Eintrag nun also mit dem Schlüssel des Empfängers überein, so gewinnt man ein wenig Sicherheit.

PGP-Fingerprint im DNS

Das Prinzip ist recht einfach. Tools wie GnuPG fragen beim Verschlüsseln an eine beliebige E-Mailadresse zunächst einen speziell formartierten DNS-Eintrag ab. In diesem ist der Fingerprint des Schlüssels, sowie die URL zu einem PGP-Keyblock enthalten. Hat der Keyblock, den GnuPG automatisch herunterlädt, die entsprechende E-Mailadresse sowie den gleichen Fingerprint, so wird diesem Schlüssel ein bisschen mehr vertraut.

Der DNS-Eintrag lautet localpart._pka.domain  und ist ein TXT-Eintrag. Als Wert enthält er diese Zeichenfolge:

v=pka1;fpr=11D661B0F5E821FC61E511AA715C2E21FD580CC0;uri=https://www.bmarwell.de/0xfd580cc0.gpg.asc

Dabei ist der Teil hinter fpr=  mit dem Fingerprint des eigenen Keys zu ersetzen, und der Teil hinter uri=  mit der URL, unter der der eigene Keyblock zu erreichen ist.

Howto: Einen DNS-Eintrag für den GnuPG-Key erstellen

Nun soll also der eigene GnuPG-Key ins DNS gestellt werden. Kein Problem, das ist in wenigen Schritten erledigt.

1. Öffentlichen Schlüssel in eine Datei exportieren

Zunächst exportiert man den eigenen öffentlichen Schlüssel in eine Datei. Dazu ist es ratsam, nicht unbedingt viele ungültige Signaturen mitzunehmen, vielleicht höchstens ein paar von denen man die Schlüssel gerade sowieso lokal vorhält, oder einfach gar keine.

$ gpg --export-options export-clean --export fd580cc0 > 0xfd580cc0.gpg.asc
gpg: compacting user ID "Benjamin Marwell <alte@mail>" on key FD580CC0: revoked

Der Schlüssel liegt nun als Datei bereit. Möchte man gar keine Fremdsignaturen hochladen, um etwa Kommunikationsgewohnheiten zu verbergen, nutzt mal die Option export-minimal :

$ gpg --export-options export-minimal --export fd580cc0 > 0xfd580cc0.gpg.asc
gpg: compacting user ID "Benjamin Marwell <alte@mail>" on key FD580CC0: revoked

2. Exportierten Schlüssel hochladen

Die exportierte Datei (in diesem Fall heißt sie 0xfd580cc0.gpg.asc ) lädt man nun an eine beliebige Stelle hoch. Das kann der eigene Blog, die eigene Homepage, oder auch ein Dropbox-Link sein. Das Vertrauen wird durch Fremdseiten nicht geschmälert, da ja die URL im DNS ist. Für höchste Sicherheit nutzt man aber eine eigene Seite mit SSL-Zertifikat.

$ scp ~user/0xfd580cc0 remoteuser@host.uberspace.de:websites/mycoolsite/

Der oben genannte Befehl kopiert den lokal abgelegten Public-Schlüssel auf einem Uberspace-Webspace ab, sofern man entsprechende Symlinks angelegt hat. Der Pfad ist natürlich passend zu den eigenen Servergegebenheiten anzupassen. Mein Schlüssel ist daher unter https://www.bmarwell.de/0xfd580cc0.gpg.asc erreichbar.

3. Fingerabdruck des Schlüssels bestimmen

Damit im DNS nicht nur eine (angreifbare) URL mit der Schlüsselblockdatei steht, wird zusätzlich der Fingerabdruck (engl. Fingerprint) abgelegt. Dieser identifiziert den Schlüssel. Da der Fingerabdruck an einer anderen Stelle steht, nämlich im DNS und nicht auf dem Hoster, ist diese Verifikation vertrauenswürdiger als ein Fingerabdruck auf der Homepage ausgeschrieben.

$ gpg --list-keys --fingerprint --with-colons 0xfd580cc0
pub   1024D/FD580CC0 2007-04-05 [verfällt: 2020-04-06]
  Schl.-Fingerabdruck = 11D6 61B0 F5E8 21FC 61E5  11AA 715C 2E21 FD58 0CC0
uid                  Benjamin Marwell <mailadresse>
uid                  Benjamin Marwell <mailadresse>
sub   4096g/50CFEE28 2009-01-31 [verfällt: 2020-04-06]

Wer den Fingerabdruck gleich im passenden Format (ohne Leerzeichen) sehen möchte, nutzt das maschinenlesbare Format mit --with-colons  und greppt sich die entsprechende Zeile heraus, mit cut  schneidet man sich das entsprechende (zehnte) Feld heraus:

$ gpg --list-keys --fingerprint --with-colons 0xfd580cc0 | grep -e "^fpr" | cut -f 10 -d ":"
11D661B0F5E821FC61E511AA715C2E21FD580CC0

Den Fingerprint kopiert man sich in einen Editor oder eine Zwischenablage, den brauchen wir später. Wichtig: Die Großschreibung muss beibehalten werden.

4. DNS-TXT-Record anlegen

Nun wird der eigentliche DNS-Record erstellt. Das Format hatte ich oben bereits erläutert. In meinem Falle sieht der Eintrag mit eingesetztem Fingerprint und der URL wie folgt aus:

e-post._pka.bmarwell.de. 3592   IN      TXT     "v=pka1;fpr=11D661B0F5E821FC61E511AA715C2E21FD580CC0;uri=https://www.bmarwell.de/0xfd580cc0.gpg.asc"

Der Eintrag sieht bei meinem DNS-Provider INWX wie folgt aus:

[caption id="attachment_5658" align="aligncenter" width="300"]INWX: Nameserver-TXT-Eintrag für PGP-KeyINWX: Nameserver-TXT-Eintrag für PGP-Key[/caption]

Den darunterliegenden Eintrag habe ich nur Testweise angelegt, die anderen Einträge stammen aus Google-Webmastertools und können ebenfalls ignoriert werden. Kontrolliert werden kann der Eintrag über das Befehl dig  oder host  abgefragt werden.

$ dig +short  e-post._pka.bmarwell.de TXT
"v=pka1;fpr=11D661B0F5E821FC61E511AA715C2E21FD580CC0;uri=https://www.bmarwell.de/0xfd580cc0.gpg.asc"
$ host.exe -t TXT e-post._pka.bmarwell.de
e-post._pka.bmarwell.de descriptive text "v=pka1;fpr=11D661B0F5E821FC61E511AA715C2E21FD580CC0;uri=https://www.bmarwell.de/0xfd580cc0.gpg.asc"

Die GnuPG-Konfiguration anpassen und testen

Der eigentliche Eintrag für den Key ist nun angelegt und kann getestet werden. Das lässt sich leicht über die Konfigurationsdatei bewerkstelligen.

gpg.conf für pka anpassen

Die Datei ~/.gnupg/gpg.conf  wird nun wie folgt angepasst:

keyserver-options auto-key-retrieve honor-pka-record
auto-key-locate pka
verify-options pka-lookup pka-trust-increase

Die Keyserver-Optionen sorgen dafür, dass der Schlüssel automatisch eingeladen wird und bei einem Aktualisieren (via --refresh ) über das DNS geprüft wird. Die Option auto-key-locate sorgt hingegen dafür, dass bei einer ersten, unbekannten Verwendung der Schlüssel über das DNS ermittelt wird, sofern möglich. Und zum Schluss wird der Schlüssel über die Prüf-Optionen laufend geprüft und eine erfolgreiche Prüfung erhöht das Vertrauen in den Schlüssel. Mit diesen Optionen kann nun getestet werden, ob ein Empfänger den eigenen Schlüssel empfangen kann.

Den DNS-Abruf des PGP-Schlüssels testen

Damit der Schlüssel nicht aus dem eigenen Keyring genutzt wird, nutzen wir diesen explizit nicht. Um weitere Abfragen zu vermeiden, wird ein einziges Wort verschlüsselt -- das beendet GnuPG automatisch nach erfolgreicher Verschlüsselung.

$ echo "Test" | gpg2 --no-options --no-default-keyring --keyring /tmp/gpg-$$ --auto-key-locate pka -ear mailadresse
gpg: requesting key FD580CC0 from https server www.bmarwell.de
gpg: key FD580CC0: public key "Benjamin Marwell <mailadresse>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
gpg: automatically retrieved `mailadresse' via PKA
gpg: 50CFEE28: There is no assurance this key belongs to the named user

pub  4096g/50CFEE28 2009-01-31 Benjamin Marwell <mailadresse>
 Primary key fingerprint: 11D6 61B0 F5E8 21FC 61E5  11AA 715C 2E21 FD58 0CC0
      Subkey fingerprint: 933F A1C5 83C6 6501 E48B  C21B 6FEA AABA 50CF EE28

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.22 (GNU/Linux)

hQQOA2/qqrpQz+4oEA//Vg8IooamDxgtEFQxmKkQc7CDHfneVptpbDxrOQ+lbgWs
+W3DG3AKmxBRVidLmKd/DNS5gtAgT1GhVhwdO/haMvaOMPrwJASLVTvOd4Uqf2dF
H41LqO1rI+ZV2xrajX4wG5xKXq9xdk7ShOf+ben/Nu7FwqjFk+BqyhHaV5Lr623+
VnVQXdAaCeT8P9lEbNw/sUovRwcbpSJROSbwyK5hfXCRdBiSrlFTHFBmP/QT63+f
SaAQThQhaMyf73Ck50mRutzo1crTHcx+bx/R5nDOVDL/uFjZyuTEIKjI3yzCKMD3
CSKo8frwuRMkxWrZLa+lfiQdNc3UFKgdLKw1fX8RGARofF+ffUOmmnq84tJdLBCQ
+0XLyLlpY+4Fc0+67QIWeGlksuROAVbAJL9Ex/GQnVGq042yzh2zDsAt7EKNepil
tcZaWVKKO9bcMVXz8gGa6dqu+6qUqionyip6PH9j/79jPqMf0f7L5c5mZ6IUfoDK
qk+wdhG3fWLOUGgk6Glcx4DrUiGewQ2g7/mstqhO9UnAANHFUbjcSBjQmxf4Gk0Z
6oIxJp726+VRsRZdZBukubBojQUYsg4mZV6dzRjvHKj9Szt9yJkdbziTkNqTuCN6
bCS5rf7gS9OeRkZ8v6DCDwkwWR1nZHggq8EiwPFgOWotbVk4Vp7KGd5wZ0GINKgP
/1bZgBD4NEG4cRvSIl7TwMBB+4uIAL6U2rHgjsO2+sjF5ZwkeTHRLAlmA+eixGSx
L6jitS/vEs2NiIdp40hmyZg6ZeiGpb2OD2a94qaY/7U/M0XLqaDT+qdsXiz9IqIm
DgFWYRcO+OuMq2C7a6VU7yXNqmx2xaiaMdyMLvf18hkQ744g2skMdsVywE+oPaeJ
KJaRPbLtMI2QzoHP5pdoSndQ5PccAEc5tOFyHXcOEcBBiLAD+LVc7nOrBP0/IK7L
p9T33rY81hyDU4LDyGpGo3dexMO9rsDJoqhq5wp1v0L9rnsT/ST/bBpTr4/of69m
x9cqzWJGtEHVI+wgwELkHSGDVCdhZwolk8GqLv07TE/WYmACZ3PZU465FBDXcDnE
AfoTki5eBsnWQIryWevE7a0KZM3qxEApO0l83VHFeHPUL6V8ygqMrJepwE5TGTgC
wvqBJxi4jfxyEC5BRUYYc7nXtdhxp7m7j8zwbQ/pKFbrInWA3Va+XVKBUeU9BD/Q
JOdWm+ksbcur+t308xXbkO6N30/MNxaya3GyJnpE0OuT0YtJ2zb/M31NIgcmLD/2
p9RJoymk6CnJZn7K+sNvwGgK6xsy5SDd7cHJc2OmL/I8L3eNEzZQFYhOdqQVMFFo
85Ttr2ZR6gaNJ5n8aunIU2sYnpYemM5FETneGvuMX5iS0mgByEDkrmB3IuQL+IDo
Hq18qMXbgv6soAoHP4xhyfltUIWiAS90KbBCfRSYnNu/5mcg0gwoBGQd+H5Q2/qn
ULVcIuhGBmkxy2dErpdVGN+0mQ456trNMH1zX3/xONRLB9AhjwFGZg2elQ==
=xG9M
-----END PGP MESSAGE-----
Wichtig ist etwa die Zeile zwei, weil dort ersichtlich ist, dass der Schlüssel von (m)einem Server heruntergeladen wird. Man kann dann noch den Schlüsselfingerabdruck vergleichen, falls man diesen noch anderweitig zur Hand hat -- kann aber auch sonst eher getrost mit ja Antworten. Warum habe ich ja oben bereits ausführlich erläutert.

Nachteile der DNS-Methode

  • Leider scheint GnuPG in der Version 1.4.x keine https-URLs zu unterstützen. Dazu muss man nun explizit GnuPG 2.0 oder 2.1 verwenden. Das ist aber unproblematisch, da man beide Tools auch gleichzeitig installieren kann. Im zweifelsfall lassen sich die Schritte auch manuell durchführen.
  • Das DNS ist nicht komplett sicher, vor allem nicht ohne DNSSEC.
  • Das DNS ist nicht für sehr viele Abfragen ausgelegt.
  • Das DNS kann abgehört werden und damit die Kommunikationsgewohnheiten.
  • Enigmail kann nicht mit PKA umgehen, siehe diesen Supporteintrag bei Sourceforge.
Insgesamt überwiegen aber die Vorteile dieser Methode, auch wenn sie derzeit noch kaum Verbreitung findet. Das wird sich mit der Verbreitung von GnuPG 2 ändern. Zudem gibt es noch weitere Möglichkeiten, die auf gushi.org beschrieben sind.