GnuPG implementiert den OpenPGP Standard für die digitale Signatur und Verschlüsselung. Dieses Kapitel zeigt, wie man die Schlüssel sicher auf einer OpenPGP-Karte wie dem YubiKey 5 NFC speichert und der Secure Shell zur Verfügung stellt.
Zusätzlich zum Kommandozeilenwerkzeug gpg
installieren wir Pakete zur Kommunikation mit einer
OpenPGP-Karte und der Einrichtung des YubiKey.
apt install gnupg scdaemon pcscd yubikey-manager
~/.gnupg/gpg.conf
~/.gnupg/gpg-agent.conf
~/.gnupg/dirmngr.conf
~/.gnupg/scdaemon.conf
~/.gnupg/pubring.kbx
~/.gnupg/private-keys-v1.d/*.key
GnuPG hat sichere Voreinstellungen, eine Festlegung auf
bestimmte Algorithmen (Härtung
) ist meiner Meinung
nach eher kontraproduktiv
~/.gnupg/gpg.conf # Avoid information leaked when exporting keys no-emit-version no-comments export-options export-minimal # Displays the long format of the ID of the keys and their fingerprints keyid-format 0xlong with-fingerprint # Show UID validity in key listings list-options show-uid-validity verify-options show-uid-validity # Always use the following keyserver keyserver hkps://hkps.pool.sks-keyservers.net keyserver-options no-honor-keyserver-url keyserver-options include-revoked
Theoretisch kann der YubiKey Schlüssel generieren, die das Gerät niemals verlassen können. Leider habe ich keine Möglichkeit gefunden, diese in den Schlüsselbund von GnuPG zu integrieren. Daher folgen wir dem vorgeschlagenen Pfad, einen separat aufbewahrten Hauptschlüssel mit kurzlebigen Unterschlüsseln für die verschiedenen kryptograohischen Operationen zu erzeugen.
Slot | Operation | Verwendung | |
---|---|---|---|
[C]ertify | Hauptschlüssel zum Ausstellen der Unterschlüssel | ||
1 | [S]ign | Unterschlüssel zum Unterschreiben | |
2 | [E]ncrypt | Unterschlüssel zum Verschlüsseln | |
3 | [A]uthenticate | Unterschlüssel zum Authentifizieren |
Der Hauptschlüssel wird ausschließlich dazu verwendet, Unterschlüssel zu unterschreiben. Er bleibt beliebig lange gültig.
id=User gpg --expert --full-gen-key Bitte wählen Sie, welche Art von Schlüssel Sie möchten 11 ECC (Nutzung selber einstellbar) Derzeit erlaubte Vorgänge: Zertif S Signaturnutzbarkeit aus Q Beenden Bitte wählen Sie, welche elliptische Kurve Sie möchten: 1 Curve 25519 Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll. 0 Schlüssel verfällt nie Ihr Name Email-Adresse Kommentar F Fertig Passphrase
Als nächstes erzeugen wir drei Unterschlüssel hinzu, die wir später auf dem YubiKey speichern werden. Dabei wird jedesmal die Passphrase des Hauptschlüssels abgefragt.
gpg --expert --edit-key $id addkey 10 ECC (Nur signieren) 1 Curve 25519 1y Schlüssel verfällt nach n Jahren addkey 12 ECC (nur verschlüsseln) 1 Curve 25519 1y Schlüssel verfällt nach n Jahren addkey 11 ECC (Nutzung selber einstellbar) A Authentisierungsnutzbarkeit ein S Signaturnutzbarkeit aus Q Beenden 1 Curve 25519 1y Schlüssel verfällt nach n Jahren
Doch vorher exportieren wir alle privaten Schlüssel.
gpg --gen-revoke $id > $id.revoke gpg --armor --export $id > $id.pub gpg --armor --export-secret-keys $id > $id.key gpg --armor --export-secret-subkeys $id > $id.subkey gpg --export-ssh-key $id >> authorized_keys
Danach löschen wir den Hauptschlüssel aus dem Schlüsselbund und re-importieren nur die Unterschlüssel.
gpg --delete-secret-key $id gpg --import $id.subkey
Den Hauptschlüssel speichern wir auf einem externen Datenträger und bewahren diesen an einem sicheren Ort auf.
Nun verschieben wir die drei Unterschlüssel auf den Yubikey.
gpg --expert --edit-key $id key 1 keytocard 1 (Signatur-Schlüssel) key 1 key 2 keytocard 2 (Verschlüsselungs-Schlüssel) key 2 key 3 keytocard 3 (Authentisierungs-Schlüssel) key 3 save
Im Schlüsselbund verbleiben nur noch sogenannte
Stubs,
markiert durch ssb>
.
gpg --list-secret-keys /home/phrank/.gnupg/pubring.kbx ------------------------------- sec# ed25519/0x36AA8A4A6D1880C6 2021-04-12 [C] Schl.-Fingerabdruck = 47C2 2ACA 7F6A 67BD AF82 C9BB 36AA 8A4A 6D18 80C6 uid [ ultimativ ] John Doe <john@example.com> ssb> ed25519/0x408E8DDF1CFE1E43 2021-04-12 [S] [verfällt: 2022-04-12] ssb> cv25519/0xCDD70704E48A3472 2021-04-12 [E] [verfällt: 2022-04-12] ssb> ed25519/0xCF424D61DD25DBE0 2021-04-12 [A] [verfällt: 2022-04-12] ^ ^ ^ ^ ^ ^ | Algo Id Gültig von Verwendung Gültig bis Unterschlüssel
? | err | Fehler | |
q | undefined | Ich weiß es nicht | |
r | revoked | Besitzer hat den Schlüssel zurückgezogen | |
e | expired | Die Gültigkeit des Schlüssels ist abgelaufen | |
1 | - | unknown | Ich weiß es nicht |
2 | n | never | Ich vertraue ihm nicht |
3 | m | marginal | Ich vertraue ihm etwas |
4 | f | full | Ich vertraue ihm sehr |
5 | u | ultimate | Ich vertraue ihm absolut |
Zum Schluß können wir die Karte noch personalisieren.
gpg --card-status gpg --card-edit admin passwd login name lang
Verschlüsselung testen (fragt nach PIN)
echo test | gpg --armor --sign --encrypt --recipient $id | gpg --armor --decrypt
Sollte einmal alles schiefgehen, lässt sich ein YubiKey 5 NFC mit folgenden APDUs vollständig zurücksetzen.
gpg-connect-agent << . /hex scd serialno scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40 scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40 scd apdu 00 e6 00 00 scd apdu 00 44 00 00 /echo YubiKey has been successfully reset. /echo All OpenPGP keys have been deleted. PINs have been reset to factory defaults. /echo The factory default PINs are 123456 (user) and 12345678 (admin). .
~/.gnupg/gpg-agent.confenable-ssh-support
systemctl --user restart gpg-agent.service gpgconf --list-dirs export SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"