From 2b241c57552cacc44f417d5d3b2253e10ba9a8e2 Mon Sep 17 00:00:00 2001 From: Razvan Dimescu Date: Sun, 29 Mar 2026 10:38:19 +0300 Subject: [PATCH] blog: add DNSSEC chain-of-trust SVG diagram Replace text-based chain trace with a visual diagram showing the verification flow from cloudflare.com through .com TLD to root trust anchor. Matches site color palette and typography. Co-Authored-By: Claude Opus 4.6 (1M context) --- blog/dnssec-from-scratch.md | 18 +---- site/blog/dnssec-chain.svg | 136 ++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 site/blog/dnssec-chain.svg diff --git a/blog/dnssec-from-scratch.md b/blog/dnssec-from-scratch.md index fc9db7c..208bc53 100644 --- a/blog/dnssec-from-scratch.md +++ b/blog/dnssec-from-scratch.md @@ -50,17 +50,7 @@ TLD priming solves this. On startup, Numa queries root for NS records of 34 comm DNSSEC doesn't encrypt DNS traffic. It *signs* it. Every DNS record can have an accompanying RRSIG (signature) record. The resolver verifies the signature against the zone's DNSKEY, then verifies that DNSKEY against the parent zone's DS (delegation signer) record, walking up until it reaches the root trust anchor — a hardcoded public key that IANA publishes and the entire internet agrees on. -``` -cloudflare.com A 104.16.132.229 - signed by → RRSIG (key_tag=34505, algo=13, signer=cloudflare.com) - verified with → DNSKEY (cloudflare.com, key_tag=34505, ECDSA P-256) - vouched for by → DS (at .com, key_tag=2371, digest=SHA-256 of cloudflare's DNSKEY) - signed by → RRSIG (key_tag=19718, signer=com) - verified with → DNSKEY (com, key_tag=19718) - vouched for by → DS (at root, key_tag=30909) - signed by → RRSIG (signer=.) - verified with → DNSKEY (., key_tag=20326) ← root trust anchor (hardcoded) -``` +DNSSEC chain of trust diagram — verifying cloudflare.com from answer through .com TLD to root trust anchor ### How keys get there @@ -165,11 +155,9 @@ The network fetch dominates. The crypto is noise. ## Surviving hostile networks -I deployed Numa as my system DNS and switched to a different network. Everything broke. Every query: SERVFAIL, 3-second timeout. +I deployed Numa as my system DNS and switched networks. Everything broke — every query SERVFAIL, 3-second timeout. The ISP blocks outbound UDP port 53 to everything except whitelisted public resolvers. Root servers, TLD servers, authoritative servers — all unreachable over UDP. -The network probe told the story: the ISP blocks outbound UDP port 53 to all servers except a handful of whitelisted public resolvers (Google, Cloudflare). Root servers, TLD servers, authoritative servers — all unreachable over UDP. The ISP forces you onto their DNS or a blessed upstream. Recursive resolution is impossible. - -Except TCP port 53 worked fine. And every DNS server is required to support TCP (RFC 1035 section 4.2.2). The ISP apparently only filters UDP. +But TCP port 53 worked. Every DNS server is required to support TCP (RFC 1035 section 4.2.2). The ISP only filters UDP. The fix has three parts: diff --git a/site/blog/dnssec-chain.svg b/site/blog/dnssec-chain.svg new file mode 100644 index 0000000..f28845d --- /dev/null +++ b/site/blog/dnssec-chain.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + DNSSEC Chain of Trust + Verifying cloudflare.com — from answer to root trust anchor + + + + + Verify signature (RRSIG → DNSKEY) + + Vouch for key (DS → parent DNSKEY) + + DNS record / key + + + + + CLOUDFLARE.COM ZONE + + + + cloudflare.com A 104.16.132.229 + The answer we want to verify + + + + signed by + + + RRSIG + tag=34505, algo=13 + signer: cloudflare.com + + + + DNSKEY + cloudflare.com, tag=34505 + ECDSA P-256 + — 174ns to verify + + + + verified with + + + + .COM TLD ZONE + + + + vouched for by + + + + DS + tag=2371, digest=SHA-256 + hash of cloudflare.com DNSKEY + + + + signed by + + + RRSIG + tag=19718, signer=com + + + + DNSKEY + com, tag=19718 + + + + verified with + + + + ROOT ZONE (.) + + + + vouched for by + + + + DS + tag=30909, digest=SHA-256 + hash of com DNSKEY + + + + signed by + + + RRSIG + signer=. + + + + DNSKEY + root (.), tag=20326, RSA/SHA-256 + + + + verified with + + + + + + ROOT TRUST ANCHOR + IANA KSK, key_tag=20326 — hardcoded in Numa as const [u8; 256] + + + Trust flows up (DS records). Keys flow down (DNSKEY → RRSIG). + If any link breaks — wrong signature, missing DS, expired RRSIG — Numa rejects the response. + +