Nitrokey, gpg und Fedora

Posted on Fr 14 September 2018 in Blog

Disclaimer: Auch wenn die Schlüssel auf einem Nitrokey gespeichert werden, sollte man unbedingt Backups der Schlüssel machen, denn ein Nitrokey kann verloren oder kaputt gehen.

Smartcard-Support unter Fedora installieren

sudo dnf install opensc ccid pcsc-lite pcsc-tools`

Und Smartcard-Support starten

sudo systemctl enable pcscd        # enable at boot
sudo systemctl start pcscd         # start the process
sudo systemctl status pcscd        # verify the status

Schlüsselpaare erstellen

gpg --full-generate-key

Folgende Optionen wurden ausgewählt

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)
   (14) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 1
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (2048) 4096
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"): dominik
Email-Adresse: test@pata.gonia.org
Kommentar: 
Sie haben diese User-ID gewählt:
    "dominik <test@pata.gonia.org>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? f

Neuen Signing Subkey hinzufügen

gpg --edit-key test@pata.gonia.org
Geheimer Schlüssel ist vorhanden.

sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
[ ultimativ ] (1). dominik <test@pata.gonia.org>

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)
   (14) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 4
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (2048) 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
Wirklich erzeugen? (j/N) j

gpg> quit
Änderungen speichern? (j/N) j

Widerrufzertifikat erstellen

gpg --output test@pata.gonia.org.gpg-revocation-certificate --gen-revoke test@pata.gonia.org
in 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? 1
Geben Sie eine optionale Beschreibung ein. Beenden mit einer leeren Zeile:
> 
Grund für Widerruf: Hinweis: Dieser Schlüssel ist nicht mehr sicher
(Keine Beschreibung angegeben)
Ist das OK? (j/N) j

Schlüssel exportieren

gpg --export-secret-keys --armor test@pata.gonia.org > test@pata.gonia.org.private.gpg-key 
gpg --export --armor test@pata.gonia.org > test@pata.gonia.org.public.gpg-key

Diese Schlüssel und das Widerrufszertifikat sollten jetzt an einem sicheren (verschlüsselten) Ort gespeichert werden. Das kann beispielsweise ein Nitrokey Storage sein. Diesen sollte man allerdings nicht verlieren.

Zusätzlich können wir die Schlüssel auf einen Nitrokey transferieren.

gpg --edit-key --expert test@pata.gonia.org
sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb  rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>
gpg> keytocard
Den Hauptschlüssel wirklich verschieben? (j/N) j
Wählen Sie den Speicherort für den Schlüssel:
   (1) Signatur-Schlüssel
   (3) Authentisierungs-Schlüssel
 Ihre Auswahl? 1

 sec  rsa4096/7F1E5EDBDFF4F981
      erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
      Vertrauen: ultimativ     Gültigkeit: ultimativ
 ssb  rsa4096/15F434089E3E8AC6
      erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
 ssb  rsa4096/4B3E2541A687FCFB
      erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
 [ ultimativ ] (1). dominik <test@pata.gonia.org>

Jetzt wurde der Hauptschlüssel auf den Nitrokey übertragen. Die zwei Unterschlüssel können ebenfalls auf den Nitrokey übertragen werden. Der Befehl key Nummer wählt einen Schlüssel aus bzw. ab.

gpg> key 1

sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb  rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>
gpg> keytocard
Wählen Sie den Speicherort für den Schlüssel:
   (2) Verschlüsselungs-Schlüssel
Ihre Auswahl? 2
sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb  rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>

Jetzt wurde der erste Schlüssel übertragen.

gpg> key 1

sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb* rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>
gpg> key 2

sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb* rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>

gpg> keytocard
Wählen Sie den Speicherort für den Schlüssel:
   (1) Signatur-Schlüssel
   (3) Authentisierungs-Schlüssel
Ihre Auswahl? 3

sec  rsa4096/7F1E5EDBDFF4F981
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/15F434089E3E8AC6
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: E   
ssb* rsa4096/4B3E2541A687FCFB
     erzeugt: 2020-05-21  verfällt: niemals     Nutzung: S   
[ ultimativ ] (1). dominik <test@pata.gonia.org>

Danach müssen die Änderungen noch gespeichert werden.

gpg> quit
Änderungen speichern? (j/N) j

Auf jedem System, auf dem der Nitrokey genutzt werden soll, muss auch der öffentliche Schlüssel vorhanden sein.

gpg --import test\@pata.gonia.org.public.gpg-key

Wenn man die privaten Schlüssel nicht nur auf dem Nitrokey haben will, dann könnte man für die Arbeit am Laptop noch den original signing subkey entfernen.

mkdir /tmp/gpg
sudo mount -t ramfs -o size=1M ramfs /tmp/gpg
sudo chown $(logname):$(logname) /tmp/gpg
gpg --export-secret-subkeys test@pata.gonia.org > /tmp/gpg/subkeys

Danach löschen wir den Subkey vom Schlüsselbund

gpg --delete-secret-key test@pata.gonia.org

Im nächsten Schritt werden die Subkeys wieder importiert

gpg --import /tmp/gpg/subkeys
sudo umount /tmp/gpg 
rmdir /tmp/gpg

Ob es funktioniert hat, kann man mit folgendem Befehl überprüfen

gpg --list-secret-keys
sec#   rsa4096

Wenn die Zeile mit sec# beginnt, dann hat es funktioniert, denn # zeigt an, der Schlüssel zum Signieren nicht im Schlüsselbund ist.

Update: 2020-05-21 Transfer auf den Nitrokey ergänzt.

Referenzen