Präambel

Diese Anleitung wurde von der offiziellen NitroKey Dokumentation kopiert und übersetzt.

Prerequisites

Um von diesem Feature Gebrauch zu machen muss gpg installiert sein, welches mittels GnuPG installiert werden kann:

  • Unter Windows kann dies auch mittels winget geschehen: winget install -e --id GnuPG.GnuPG
  • Unter macOS kann GnuPG auch durch Homebrew installiert werden: brew install gnupg
  • Unter Linux ist GnuPG in den meisten gängigen Paketmanagern vertreten und kann so installiert werden.

Generating a keypair

Um ein neues GPG Schlüsselpaar auf einem Sicherheitsschlüssel zu generieren muss dieser eingesteckt sein. Dann muss ein Terminalfenster geöffnet werden und folgendes Kommando eingegeben werden:

gpg --card-edit

Das Programm sollte nun alle relevanten Informationen über den Sicherheitsschlüssel ausgeben, zum Beispiel:

$ gpg --card-edit

Reader ...........: 20A0:42B2:X:0
Application ID ...: D276000124010304000F43A8ED3F0000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Nitrokey
Serial number ....: 43A8ED3F
Name of cardholder: [not set]
Language prefs ...: [not set]
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 19
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: REDA CTED REDA CTED REDA  CTED REDA CTED REDA CTED
      created ....: 2024-10-22 08:59:50
Encryption key....: REDA CTED REDA CTED REDA  CTED REDA CTED REDA CTED
      created ....: 2024-10-22 08:59:50
Authentication key: REDA CTED REDA CTED REDA  CTED REDA CTED REDA CTED
      created ....: 2024-10-22 08:59:50
General key info..: 
pub  rsa2048/9AA75CA228063515 2024-10-22 Bastian REDACTED (NitroKey) <[email protected]>
sec>  rsa2048/REDACTEDREDACTED  created: 2024-10-22  expires: never     
                                card-no: 000F 43A8ED3F
ssb>  rsa2048/REDACTEDREDACTED  created: 2024-10-22  expires: never     
                                card-no: 000F 43A8ED3F
ssb>  rsa2048/REDACTEDREDACTED  created: 2024-10-22  expires: never     
                                card-no: 000F 43A8ED3F

gpg/card> 

Weiter wird der Benutzer in die GnuPG Kommandozeile geschickt, welche sich von der normalen Kommandozeile unterscheidet.

Innerhalb dieser Kommandozeile müssen folgende Schritte durchgeführt werden:

  1. Durch das Ausführen des Kommandos admin wird man berechtigt, administrative Kommandos auszuführen.

    gpg/card> admin
    Admin commands are allowed
     
  2. Durch das Ausführen des Kommandos generate wird eine Anleitung zum Generieren eines GPG Schlüssels gestartet.

    gpg/card> generate
  3. Durch das quit Kommando kann die GnuPG Kommandozeile verlassen werden.

    gpg/card> quit

Den GPG Schlüssel zum Signieren von Commits verwenden

Um den gerade generierten Schlüssel zum Signieren von Commits zu verwenden werden zwei Attribute benötigt:

  1. Die ID des gerade generierten Schlüssels. Diese ist relevant da man über sie den öffentlichen GPG Schlüssel ermittelt, aber auch da git den zu verwendenden Schlüssel über die ID ermittelt.
  2. Den öffentlichen GPG-Schlüssel. Dieser muss auf GitHub/GitLab hinterlegt werden, um die damit signierten Commits als “verifiziert” anzeigen zu lassen.

Die Schlüssel-ID ermitteln

Um die Schlüssel-ID zu ermitteln muss folgendes Kommando eingegeben werden:

gpg --list-secret-keys --keyid-format LONG

Die Ausgabe dieses Kommandos wird in etwa so aussehen:

sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
      D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid                   [ultimate] Mr. Robot <your_email>
ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]

Die Schlüssel-ID ist in der sec-Zeile direkt nach dem rsaXXXX/; in diesem Fall lautet diese also 30F2B65B9246B6CA.

Um git nun dazu anzuweisen, diesen Schlüssel zu verwenden, muss die Konfiguration mittels folgenden Kommandos geändert werden (<ID> muss dabei durch die gerade ermittelte Schlüssel-ID ersetzt werden):

git config --global user.signingkey <ID>

Den öffentlichen GPG-Schlüssel ermitteln

Um den öffentlichen GPG-Schlüssel mithilfe der Schlüssel-ID zu ermitteln, muss folgendes Kommando ausgeführt werden (<ID> muss dabei durch die gerade ermittelte Schlüssel-ID ersetzt werden):

gpg --armor --export <ID>

Die Ausgabe dieses Kommandos wird ungefähr wie folgt aussehen:

-----BEGIN PGP PUBLIC KEY BLOCK-----
 
mQENBGcXaYYBCADJb80ojN9jwEqW2p0aNEQb83rCm/a+vwZDrnrcl9NEyaQWp4eW
AtKjSMgU/R4s5g7EbbS1wYQo1JOdZrX5vKz07O5C/2c6isT10jqCh0gibdZYxx/E
...
-----END PGP PUBLIC KEY BLOCK-----

Die Ausgabe hier ist der öffentliche GPG-Schlüssel, welcher in den Einstellungen von GitHub/GitLab hinterlegt werden muss.