Watch
1
0
Fork
You've already forked keys
0
Overview on how I organize my GPG keys
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Alexander Hess ed6a26b69e
Add a signing subkey for the leonardo project
The subkey 16D5D4DFC0C36022 lives only on the project's machines,
with its own passphrase, and expires together with the primary key
on 2027-01-31

- Add the subkey to the table in OPENPGP.md
- Replace the 6-month expiry policy for external subkeys: they now
  follow the yearly update and are revoked as "retired" at project end
- Export the updated public key and a dated snapshot
- Re-sign OPENPGP.md
2026-09-21 21:33:08 +02:00
ceremonies Add age key 2026-09-21 21:18:48 +02:00
history Supersede all old keys with 75681C8167312680 2026-07-08 17:34:00 +02:00
scripts Name snapshots by full date instead of just year 2026-09-21 21:19:41 +02:00
snapshots Add a signing subkey for the leonardo project 2026-09-21 21:33:08 +02:00
age-recipient.txt Add age key 2026-09-21 21:18:48 +02:00
AGE.md Add age key 2026-09-21 21:18:48 +02:00
AGE.md.asc Add age key 2026-09-21 21:18:48 +02:00
KEYS.md Add age key 2026-09-21 21:18:48 +02:00
KEYS.md.asc Add age key 2026-09-21 21:18:48 +02:00
OPENPGP.md Add a signing subkey for the leonardo project 2026-09-21 21:33:08 +02:00
OPENPGP.md.asc Add a signing subkey for the leonardo project 2026-09-21 21:33:08 +02:00
public-key.asc Add a signing subkey for the leonardo project 2026-09-21 21:33:08 +02:00
README.md Name snapshots by full date instead of just year 2026-09-21 21:19:41 +02:00
security.txt Add security.txt 2026-09-21 21:19:12 +02:00

Keys

Public record of the cryptographic keys of Alexander Hess (i.e., "me" in this repository): What they are, how they are handled, and how to verify them.

There are two audiences for this repository:

  • I want a how-to: OPENPGP.md and AGE.md hold the policies and ceremonies, and the scripts/ run them.
  • Readers want to confirm my keys and my identity: Everything needed for that is in the Verify section below.

Verify

The fingerprint of my current PGP key is in KEYS.md, which is signed.

Compare the fingerprint with at least one source outside this repository to confirm my identity:

  • WKD, for example, via gpg --locate-keys ah@alexander-hess.com
  • The keyservers listed in OPENPGP.md, for example, gpg --keyserver hkps://keys.openpgp.org --search-keys alexander@webartifex.de
  • KEYS.md obtained from my websites:

Then:

gpg --import public-key.asc

gpg --verify KEYS.md.asc KEYS.md
gpg --verify OPENPGP.md.asc OPENPGP.md
gpg --verify AGE.md.asc AGE.md
gpg --verify security.txt

Each gpg --verify will print two things:

  1. Good signature from "Alexander Hess <...>": The file is intact and was signed by this key.
  2. WARNING: This key is not certified with a trusted signature!: Because gpg likely has no record that this key is mine.

So, a good signature plus a matching Primary key fingerprint line is the full result.

To silence the warning on your machine, tell gpg about your check:

gpg --lsign-key <FPR>  # after comparing the fingerprint yourself

If you trusted one of the two keys I retired in 2026, they certified the current one, and the supersession is recorded in ceremonies/:

gpg --import history/344EA5AB10D868E0-public.asc history/6D11C1E91D3B0265-public.asc
gpg --check-signatures 8B1140ADB5185334E9FA513B75681C8167312680
gpg --verify ceremonies/2026-07-08_supersession.md.asc ceremonies/2026-07-08_supersession.md

Contents

The files in this repository are described below.

OpenPGP

How I implement OpenPGP:

age

Besides OpenPGP, I also use the modern age encryption:

  • AGE.md: age policies
  • AGE.md.asc: Detached signature, renewed at every ceremony
  • age-recipient.txt: age public key for age -R
  • ceremonies/: Signed record of when a recipient became valid or rotated because age keys carry no metadata of their own

Scripts

sh scripts for my own use:

  • bootstrap.sh: Imports and trusts all keys on a new machine, then verifies all files
  • sign.sh: Renews the detached signatures
  • verify.sh: Verifies all signed files against the pinned signing subkey, warns when the key is about to expire, and cross-checks age-recipient.txt and security.txt
  • snapshot.sh: Exports the current key to snapshots/ and public-key.asc
  • publish.sh: Pushes the current key to the keyservers
  • security-txt.sh: Generates and clearsigns security.txt