GNUPGP Schlüssel erzeugen

Ich wollte schon seit längerem mir noch einmal einen gut aufgesetzten gpg Schlüssel einrichten. Auch wenn ich das Thema der Mailverschlüsselung als gescheitert betrachte könnte es doch einmal sinnvoll sein einen veröffentlichten pgp Schlüssel zu haben.

Der aktuelle Anlass das Thema noch einmal aufzugreifen ist aber ein geplanter Wechsel meines Passwort Managers von keepassx zu dem Kommandozeilenwerkzeug pass. Dieser Passwortmanager verwendet halt gpg zur Verschlüsselung der Kennwörter. Diese Prozedur ist eigentlich nicht notwendig aber wenn man die gängigen Dokumente liest wird empfohlen nicht alle Schlüssel zusammenzuhalten sondern mit Master- und Subkeys zu arbeiten. Ob ich das wirklich mal brauchen werden… keine Ahnung.

Im wesentlichen ist dies nur eine Dokumentation meiner Schritte und basiert auf diesem und diesem Dokumenten.

Ausgeführt habe ich diese Schritte auf meinem “Schlüsselserver”. Das ist ein ausrangierter Thinkpad X100 den ich in einem Safe lagere.

Zuerst eine saubere Umgebung einrichten

mkdir realhbauer
GNUPGHOME=/home/hbauer/realhbauer
export GNUPGHOME

Damit die Keys schneller generiert werden können ein Zusatzprogramm (loht sich wirklich)

apt-get install rng-tools

echo 'HRNGDEVICE=/dev/urandom' >> /etc/default/rng-tools

Zuerst erstellen wir einen Primären Key. Den Expert Modus wähle ich damit ich festlegen kann welche Eigenschaften der Schlüssel bekommen soll.

gpg --full-generate-key --expert
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (1) RSA und RSA (voreingestellt)
   (2) DSA und Elgamal
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (9) ECC und ECC
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
**Ihre Auswahl? 8**

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Zertif. Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Signieren Zertif. Verschl. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

**Ihre Auswahl? s**

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Zertif. Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Zertif. Verschl. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

**Ihre Auswahl? v**

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Zertif. Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Zertif. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

**Ihre Auswahl? q**
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
**Wie lange bleibt der Schlüssel gültig? (0)**
Schlüssel verfällt nie
**Ist dies richtig? (j/N) j**

GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen.

Ihr Name ("Vorname Nachname"): Hagen Bauer
Email-Adresse: hagen.bauer@caserio.de
Kommentar: 
Sie haben diese User-ID gewählt:
    "Hagen Bauer <hagen.bauer@caserio.de>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? f
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
gpg: Schlüssel 30xxxxxxxxxxx ist als ultimativ vertrauenswürdig gekennzeichnet
gpg: Widerrufzertifikat wurde als '/home/hbauer/realhbauer/openpgp-revocs.d/349CF4F4F52D36C080748A5B30791E86B24329AF.rev' gespeichert.
Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa4096 2019-12-15 [C]
      3uuuuuuuuuuuuuuuuuuuuuuuuuB30791E86B24329AF
      3uuuuuuuuuuuuuuuuuuuuuuuuuB30791E86B24329AF
uid                      Hagen Bauer <hagen.bauer@caserio.de>

Bei der Fehlermeldung

gpg: agent_genkey failed: Keine Berechtigung
Schlüsselerzeugung fehlgeschlagen: Keine Berechtigung

hat ein

 killall gpg-agent

geholfen

Jetzt haben wir einen Schlüssel der nur zertifiieren darf. Wir brauchen natürlich die Subkeys die später verschlüsseln sollen

gpg --expert --edit-key hagen.bauer@caserio.de
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/asdkskdsdksad
     erzeugt: 2019-12-15  verfällt: niemals     Nutzung: C   
     Vertrauen: ultimativ     Gültigkeit: ultimativ
[ ultimativ ] (1). Hagen Bauer <hagen.bauer@caserio.de>

gpg> addkey
Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (5) Elgamal (nur verschlüsseln)
   (6) RSA (nur verschlüsseln)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
  (12) ECC (nur verschlüsseln)
   (13) Vorhandener Schlüssel
Ihre Auswahl? 8

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Signieren Verschl. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? v

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Signieren 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? q
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 2y
Key verfällt am Di 14 Dez 2021 10:44:44 CET
Ist dies richtig? (j/N) j
Wirklich erzeugen? (j/N) j
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.

sec  rsa4096/223423
     erzeugt: 2019-12-15  verfällt: niemals     Nutzung: C   
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/23223
     erzeugt: 2019-12-15  verfällt: 2021-12-14  Nutzung: S   
[ ultimativ ] (1). Hagen Bauer <hagen.bauer@caserio.de>

Das ganze machen wir jetzt noch für Verschlüsseung. Am Ende haben wir

sec  rsa4096/asdklfsjdfldfj
     erzeugt: 2019-12-15  verfällt: niemals     Nutzung: C   
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/0asdfkjsfldj
     erzeugt: 2019-12-15  verfällt: 2021-12-14  Nutzung: S   
ssb  rsa4096/adlaskjdflsdfjE
     erzeugt: 2019-12-15  verfällt: 2021-12-14  Nutzung: E   
[ ultimativ ] (1). Hagen Bauer@caserio.de <hagen.bauer@caserio.de>

und beenden das ganze mit save

     save

Jetzt müssen wir die secrets key sichern

mkdir gnupgp-backup

gpg -a --export-secret-subkeys hagen.bauer@caserio.de > gnupgp-backup/secret_subkeys.gpg
gpg -a --export hagen.bauer@caserio.de > gnupgp-backup/public_key.gpg

Auch einen Revokatoin key sollte man wohl generieren.

gpg -a --gen-revoke hagen.bauer@caserio.de > gnupgp-backup/revocation_cert.gpg

sec  rsa4096/skljslfdjsd3 2019-12-15 Hagen Bauer@caserio.de <hagen.bauer@caserio.de>

Ein Widerrufszertifikat für diesen Schlüssel erzeugen? (j/N) j
Grund für den Widerruf:
  0 = Kein Grund angegeben
  1 = Hinweis: Dieser Schlüssel ist nicht mehr sicher
  2 = Schlüssel ist überholt
  3 = Schlüssel wird nicht mehr benutzt
  Q = Abbruch
(Wahrscheinlich möchten Sie hier 1 auswählen)
Ihre Auswahl? 0
Geben Sie eine optionale Beschreibung ein. Beenden mit einer leeren Zeile:
> 
Grund für Widerruf: Kein Grund angegeben
(Keine Beschreibung angegeben)
Ist das OK? (j/N) j
Widerrufszertifikat wurde erzeugt.

Bitte speichern Sie es auf einem Medium welches Sie wegschließen
können; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat
erhält, kann er Ihren Schlüssel unbrauchbar machen.  Es wäre klug,
dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren,
falls das ursprüngliche Medium nicht mehr lesbar ist. Aber Obacht: Das
Drucksystem kann unter Umständen eine Kopie anderen Nutzern zugänglich
machen.

Neben einem digitalen Backup werde ich die beiden exportierten Schlüssel auch noch ausdrucken.

Um die Sicherheit zu erhöhren sollten man den Masterkey aus dem Schlüsselbund entfernen. Das geht anscheinend aber nicht so einfach. Man muss stattdessen die geheimen subkeys exportieren, alle geheimen keys löschen und die subkeys wieder imporiteren

mkdir tmp
gpg -a --export-secret-subkeys hagen.bauer@caserio.de > tmp/secret_subkeys.gpg
gpg --delete-secret-keys hagen.bauer@caserio.de
gpg --import tmp/secret_subkeys.gpg
rm tmp/secrectsubkeys.gpg

Da diese Prozedur auf meinem “key signing server” passiert exportierten wir den rest jetzt auf einen usb stick damit wir dies dann auf den eigentlichen Rechnern verwenden können

mkdir gnupgp-laptop
gpg -a --export hagen.bauer@caserio.de > gnupgp-laptop/laptop_keys_public.gpg
gpg -a --export-secret-keys hagen.bauer@caserio.de > gnupgp-laptop/laptop_keys_secret.gpg
sudo cp gnupgp-laptop/\* /mnt/hbauer-gnupgp/

auf dem Arbeitsrechnern werden die dann importiert

gpg --import /mnt/hbauer-gnupgp/laptop_keys_public.gpg 
gpg: Schlüssel sdsdfsd: Öffentlicher Schlüssel "Hagen Bauer@caserio.de <hagen.bauer@caserio.de>" importiert
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1
gpg:               importiert: 1

gpg --import /mnt/hbauer-gnupgp/laptop_keys_secret.gpg
gpg: Schlüssel sdfksfkl: "Hagen Bauer@caserio.de <hagen.bauer@caserio.de>" nicht geändert
gpg: Um 'secring.gpg' zu migrieren sollte für jede Smartcard "gpg --card-status" aufgerufen werden.
gpg: Schlüssel sdfjksklfj: geheimer Schlüssel importiert
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1
gpg:              unverändert: 1
gpg:       gelesene geheime Schlüssel: 1
gpg:   geheime Schlüssel importiert: 1

So jetzt habe ich hoffentlich eine gute Basis geschaffen.

As usual: Use at your own risk