wkd/build-wkd.sh
claude-macmini 21b237f0da
All checks were successful
build-and-push / build (push) Successful in 8s
WKD (advanced method): nginx-image met gpg-wks-client-gebouwde hu/-boom (infra#88)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:31:35 +02:00

42 lines
1.9 KiB
Bash

#!/bin/sh
# Bouwt de WKD-boom (advanced method) uit keys/<domein>/<adres>.asc met gpg-wks-client.
# Gebruik: build-wkd.sh <keys-dir> <out-dir> → <out-dir>/<domein>/{policy,hu/<hash>}
# Faalt hard (build breekt) als een .asc geen publieke sleutel is, een privésleutel bevat, de
# bestandsnaam niet bij de map hoort, of de sleutel geen UID met precies dat adres heeft.
set -eu
KEYS=$1; OUT=$2
export GNUPGHOME=$(mktemp -d); chmod 700 "$GNUPGHOME"
mkdir -p "$OUT"
n=0
for domdir in "$KEYS"/*/; do
[ -d "$domdir" ] || continue
domain=$(basename "$domdir" | tr 'A-Z' 'a-z')
mkdir -p "$OUT/$domain/hu"
: > "$OUT/$domain/policy" # verplicht; leeg volstaat (spec §3.1)
for f in "$domdir"*.asc; do
[ -f "$f" ] || continue
addr=$(basename "$f" .asc)
case "$addr" in
*@"$domain") ;;
*) echo "FOUT: $f — bestandsnaam moet <local-part>@$domain.asc zijn" >&2; exit 1 ;;
esac
if grep -q 'PRIVATE KEY BLOCK' "$f"; then
echo "FOUT: $f bevat een PRIVÉSLEUTEL — nooit in deze repo" >&2; exit 1
fi
gpg --batch --quiet --import "$f"
# exact-match op het adres (<addr>), niet substring
fpr=$(gpg --batch --with-colons --list-keys "<$addr>" 2>/dev/null | awk -F: '/^fpr/{print $10; exit}')
if [ -z "$fpr" ]; then
echo "FOUT: $f — geen sleutel met een UID die exact <$addr> bevat" >&2; exit 1
fi
# --install-key: exporteert binair, filtert op deze UID, schrijft <domain>/hu/<hash> (+ policy)
gpg-wks-client --batch --quiet --directory "$OUT" --install-key "$fpr" "$addr"
hash=$(gpg-wks-client --print-wkd-hash "$addr" | awk '{print $1}')
[ -s "$OUT/$domain/hu/$hash" ] || { echo "FOUT: $OUT/$domain/hu/$hash niet aangemaakt" >&2; exit 1; }
echo "OK $addr → $domain/hu/$hash ($fpr)"
n=$((n+1))
done
done
rm -rf "$GNUPGHOME"
echo "Klaar: $n sleutel(s)."
find "$OUT" -type f | sort