Verifying a post

Each post is signed twice, with an SSH key and an ML-DSA-87 key, and links to its source and both signatures at the foot of the page. The keys:

SSH
allowed_signers SHA256:QW/OZAgqStuEVmxcmtn7HR91mWBeVj9RHxJ3bk8pPEI
ML-DSA-87
x8svc-mldsa87.pub.pem sha256:cb4008efee8078f9e96701e5858ee9a64f03f4691b9c8db4f4ac2c4a2a6c4e85

To check a post, with OpenSSH and OpenSSL 3.5 or later:

curl -O https://x8svc.dev/keys/allowed_signers -O https://x8svc.dev/keys/x8svc-mldsa87.pub.pem
curl -O https://x8svc.dev/<post>/index.md -O https://x8svc.dev/<post>/index.md.sig -O https://x8svc.dev/<post>/index.md.mldsa87.sig
ssh-keygen -Y verify -f allowed_signers -I x8svc -n x8svc.dev-post -s index.md.sig < index.md
openssl pkeyutl -verify -rawin -pubin -inkey x8svc-mldsa87.pub.pem -in index.md -sigfile index.md.mldsa87.sig -pkeyopt context-string:x8svc.dev-post-v1
openssl pkey -pubin -in x8svc-mldsa87.pub.pem -outform DER | sha256sum

The first check prints Good "x8svc.dev-post" signature for x8svc, the second Signature Verified Successfully, and the last line must match the ML-DSA-87 fingerprint above. The SSH key is also listed for x8svc at api.github.com/users/x8svc/ssh_signing_keys. security.txt is signed the same way, with -n x8svc.dev-security and context-string:x8svc.dev-security-v1.