Sauberer GPG-Schlüsselwechsel
Gerade eben habe ich meinen alten, liebgewonnenen GnuPG-Schlüssel durch einen neuen ersetzt. Der alte 1024-bit-Schlüssel ist nach aktuellem Stand der Kryptologie unsicher. Der neue Schlüssel hat eine Länge von 4096 Bit.
Der Schlüsselwechsel ist natürlich nicht ganz einfach, besonders, da mein alter Schlüssel sehr viele Signaturen hat. Daher habe ich die Transition nach einem geplanten Ablauf durchgeführt.
- Erstellung eines neuen Schlüsselpaars mit allen wichtigen UIDs
$ gpg --gen-key
$ gpg --edit xxxxxxxx
adduid
adduid
...
save - Signieren des neuen Schlüssels mit dem alten Schlüssel, um eine authentifizierte Verbindung herzustellen
$ gpg -u yyyyyyyy --sign-key xxxxxxxx - Erstellen einer Transition Note, d.h. einer kurzen Textdatei, die eine Information über den Schlüsselwechsel enthält. Signieren der Notiz mit dem alten und dem neuen Schlüssel, um den Text zu authentifizieren
$ gpg -a -u xxxxxxxx -u yyyyyyyy --clearsign transition-note.txt - Update der Signaturrichtlinie und Signatur mit altem und neuem Schlüssel, so dass alte Signaturen gültig bleiben
- Versand von Benachrichtigungen an alle Benutzer, die den alten Schlüssel signiert haben, mit der Bitte, auch den neuen zu signieren. Signatur der Mail mit neuem und altem Schlüssel. (Tipp: geht komplett durch mit einem Bash-Oneliner
…)
# (Hier jetzt etwas ausführlicher, damit es lesbar wird ...)# Public Keyring sichern
$ cd
$ mv .gnupg/pubring.gpg .gnupg/pubring.bak# Alten Schlüssel neu laden
$ gpg --recv-keys yyyyyyyy# Signaturen des alten Schlüssels auflisten
$ gpg --list-sigs | grep ^sig | grep -o '[A-F0-9]\{8\}' | sort | uniq > sigs.txt# Alle Signaturschlüssel laden
$ gpg --recv-keys `cat sigs.txt`# Adressliste erstellen
$ gpg --list-sigs yyyyyyyy | grep -o '<.*>' | sed -e 's/<//g' | sed -e 's/>//g' >mails.txt# Nachricht signieren
$ gpg -a -u xxxxxxxx -u yyyyyyyy --clearsign transition-mail.txt# Nachrichten versenden
$ for i in `cat mails.txt`; do mail -s "New GPG key - please sign" $i <transition-mail.txt.asc; done# Wiederherstellen des Schlüsselringes
$ mv .gnupg/pubring.bak .gnupg/pubring.gpg
- Widerruf des alten Schlüssels und Publizieren des alten und des neuen Schlüssels
$ gpg --edit yyyyyyyy
revkey
save
$ gpg --send-keys xxxxxxxx yyyyyyyy
Anmerkung: In der Konfigurationsdatei (~/.gnupg/gpg.conf) sollten die Optionen expert und ask-cert-level eingetragen sein. In den Aufrufen steht xxxxxxxx für die ID des neuen und yyyyyyyy für die ID des alten Schlüssels. Das System muss Mails nach außen verschicken können, außerdem muss ein Keyserver konfiguriert sein.
Morgen muss ich noch die Informationen auf der Website aktualisieren und auf die Signaturen warten, dann ist der Übergang abgeschlossen.
Zusätzlich habe ich auch im neuen Schlüssel Felix als Revoker hinzugefügt. Damit hat er die Möglichkeit, meinen öffentlichen Schlüssel durch eine spezielle Signatur seines privaten Schlüssels zurückzuziehen. Sollte ich also meinen privaten Schlüssel und alle Backups verlieren oder im kritischen Fall keinen Zugang haben, kann Felix die nötigen Schritte einleiten, um Signaturen meines Schlüssels zu devalidieren. Bitte gebt dieses Recht aber nur Personen, denen ihr am besten noch mehr als 100% vertraut, sonst wird es im Zweifelsfall nämlich etwas haarig
…

Januar 23rd, 2010 at 10:28
Danke für diese gute Anleitung. Könntest du das evtl. noch etwas ausführlicher darlegen. Vielleicht mit der einen oder anderen Kommandozeile?
Danke … Ivo
Januar 23rd, 2010 at 19:02
Erledigt
Januar 23rd, 2010 at 19:37
Mein Held!
Januar 23rd, 2010 at 19:57
Besitzansprüche zurückgewiesen – aber Held geht in Ordnung
.