- Shell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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 |
||
| ceremonies | ||
| history | ||
| scripts | ||
| snapshots | ||
| age-recipient.txt | ||
| AGE.md | ||
| AGE.md.asc | ||
| KEYS.md | ||
| KEYS.md.asc | ||
| OPENPGP.md | ||
| OPENPGP.md.asc | ||
| public-key.asc | ||
| README.md | ||
| security.txt | ||
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.mdandAGE.mdhold the policies and ceremonies, and thescripts/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.mdobtained 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:
Good signature from "Alexander Hess <...>": The file is intact and was signed by this key.WARNING: This key is not certified with a trusted signature!: Becausegpglikely 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:
KEYS.md: Current keys, signedKEYS.md.asc: Detached signature, renewed at every ceremonyOPENPGP.md: OpenPGP policies, ceremonies, and historyOPENPGP.md.asc: Detached signature, renewed at every ceremonypublic-key.asc: Armored export of the current OpenPGP keysecurity.txt: RFC 9116 contact file, clearsigned, renewed at every ceremonysnapshots/: Dated exports of the current OpenPGP key, one per ceremonyceremonies/: Signed records of exceptional eventshistory/: Armored public keys of all previous OpenPGP keys
age
Besides OpenPGP,
I also use the modern age encryption:
AGE.md:agepoliciesAGE.md.asc: Detached signature, renewed at every ceremonyage-recipient.txt:agepublic key forage -Rceremonies/: Signed record of when a recipient became valid or rotated becauseagekeys 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 filessign.sh: Renews the detached signaturesverify.sh: Verifies all signed files against the pinned signing subkey, warns when the key is about to expire, and cross-checksage-recipient.txtandsecurity.txtsnapshot.sh: Exports the current key tosnapshots/andpublic-key.ascpublish.sh: Pushes the current key to the keyserverssecurity-txt.sh: Generates and clearsignssecurity.txt