GPG

Siehe auch

Voraussetzungen schaffen:

dnf -y install pinentry

Wer bei der Key-Erzeugung für genügend Entropie sorgen möchte, lässt dieses Kommando während der Key-Erzeugung in einer zweiten Session nebenbei laufen:

dnf -y install rng-tools
rngd -f -r /dev/urandom

GPG-Keys interaktiv mit den notwendigsten Angaben erstellen (Keys gelten dann für 2 Jahre, 2048 Bit):

# asks for "Real name" (mind. 5 chars long), "Email address", "Passphrase"
gpg --gen-key

Tipp

Das Passwort verschlüsselt die Keys, und dient nicht der Verschlüsselung der Daten.

Real name: myname
Email address:
You selected this USER-ID:
    "myname"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O

GPG-Keys interaktiv mit mehr Möglichkeiten erstellen:

# also asks for "Kind of key", "Keysize", "Key expiration", "Comment"
gpg --full-generate-key

Tipp

Per Default entspricht der Encryption-Key dem Signature-Key.

Schlüssel auflisten:

gpg --list-keys --keyid-format long
pub   rsa4096/8F0B00C7FE8AD8F1 2022-02-01 [SCEA]   <== public primary key, algo/short-key-ID
      AFB712371AEDC93DE30BC6EE8F0B00C7FE8AD8F1     <== the fingerprint (fpr)
uid        [ultimate] myname (mycomment) <a@b.ch>  <== the owner of the key
sub   rsa4096/1881B9C9B7BF2227 2022-02-01 [SEA]    <== public sub-key
sec   ...                                          <== secret (private) primary key
ssb   ...                                          <== secret (private) sub-key

Tipp

Subkeys werden für die Verschlüsselung verwendet, Primary Keys für das Signing (unter anderem der Subkeys).

Zweck:

  • S: sign / Signing data

  • C: cert / Key Certification (= Signing keys)

  • E: encr / Encrypting data

  • A: auth / Authentication

Key-Type eddsa: cv25519 ist für encrypt, ed25519 für cert, sign, auth.

gpg --list-keys --keyid-format long
# for machine parsing:
gpg --list-keys --keyid-format long --with-colons
tru::1:1643905320:0:3:1:5
pub:u:4096:1:8F0B00C7FE8AD8F1:1643905231:::u:::escaESCA::::::23::0:
fpr:::::::::AFB712371AEDC93DE30BC6EE8F0B00C7FE8AD8F1:
uid:u::::1643905231::7FEC38053E299BB6D040BD0460E8DD28421504B4::duplicity_enc (duplicity) <a@b.ch>::::::::::0:
sub:u:4096:1:1881B9C9B7BF2227:1643905231::::::esa::::::23:
fpr:::::::::53EE2E443C2062A3127A29A01881B9C9B7BF2227:
pub:u:4096:1:0E3EE1044D2916F7:1643905236:::u:::escaESCA::::::23::0:
fpr:::::::::8A74804A2216ABCDD730E23C0E3EE1044D2916F7:
uid:u::::1643905236::69D60BEC6C72C72CC4AC676EC572307F0814BDA1::duplicity_sign (duplicity) <a@b.ch>::::::::::0:
sub:u:4096:1:FF202D2B4905C4CA:1643905236::::::esa::::::23:
fpr:::::::::C656AF43C183436187F16748FF202D2B4905C4CA:

GPG-Key signieren:

KEYNAME=myname
gpg --sign-key $KEYNAME

# unattended:
gpg --quick-sign-key $FINGERPRINT $NAME1 $NAME2

Secret-Keys auflisten:

gpg --list-secret-keys

Signing-Keys auflisten:

gpg --list-sigs

# pub   rsa4096 2022-01-06 [SCEA]
#       <ENCRYPT_KEY_ID>
# uid                 [ultimate] myname (mycomment) <a@b.ch>
# sig 3        <SIGNING_KEY_ID> 2022-01-06  duplicity_sign (duplicity) <a@b.ch>
# ...

Schlüssel exportieren (Backup der Schlüssel anlegen):

# Public Key:
gpg --armor --export $GPG_KEY > /path/to/key_pub.gpg
# Private Key - asks for the password:
gpg --armor --export-secret-keys $GPG_KEY > /path/to/key_sec.gpg

Schlüssel mit Passwort-Übergabe auf der Kommandozeile (für Automatismen) exportieren:

# Private Key - provide password via command-line:
echo "mypassword" | gpg --pinentry-mode loopback --passphrase-fd 0 --armor --export-secret-keys $GPG_KEY > /path/to/key_sec.gpg

Schlüssel (auf einem neuen System) importieren:

gpg --import /path/to/key_sec.gpg
gpg --list-keys --keyid-format long
gpg --edit-key $GPG_KEY trust quit
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

Der GPG-Agent läuft auf einem Server unter dem root-Benutzer mit gpg-agent --homedir /root/.gnupg --use-standard-socket --daemon.

ALLE Public und Private Keys löschen:

rm -rf ~/.gnupg

GPG-Keys automatisiert (unattended) erstellen

Der --batch-Parameter kann nur Schlüssel mit einem Sub-Key erzeugen.

PASSWORD=$(< /dev/urandom tr -dc A-Za-z0-9 | head -c30)

cat > gpg-key.def << EOF
%echo Generating a basic OpenPGP key
Key-Type: RSA
Key-Length: 4096
Subkey-Type: RSA
Subkey-Length: 4096
Name-Real: $(hostname)
Name-Comment: My Comment
Name-Email: info@example.org
Expire-Date: 0
Passphrase: $PASSWORD
# Do a commit here, so that we can later print something
%commit
%echo Password: $PASSWORD
EOF

unset PASSWORD

# The --batch option to gpg is limited to generating a key with a single subkey:
gpg --batch --generate-key gpg-key.def

gpg --list-keys --keyid-format long
rm -f gpg-key.def

Um ed25519-Keys für Encryption nutzen zu können, ist GnuPG v2.1.7 nötig - RHEL 7 kommt aber mit GnuPG v2.0.22. Erst ab RHEL 8 mit GnuPG v2.2.20 ist deren Einsatz möglich.

Troubleshooting

gpg: agent_genkey failed: No pinentry, Key generation failed: No pinentry
dnf -y install pinentry

Built on 2022-06-03