When a resolver receives an A record, a public key, and a signature, and the signature verification succeeds, the result still cannot be immediately trusted: an attacker can also generate their own keys and sign their own fake addresses. The key to DNSSEC is connecting the signing key of the target RRset to a trust anchor already trusted on the local machine, and then determining whether the signature, negative proof, and validity period are all valid.
Question
Core Criterion
Who authorized the data?
The authenticated chain from the trust anchor to the target RRset
Is having an RRSIG safe?
Signature mathematical correctness and key trustworthiness are verified separately
How are non-existent names signed?
NSEC/NSEC3 provides authenticated negative proofs
Why SERVFAIL when there is a signature?
DS, DNSKEY, signature time, algorithm, and network must all be checked
Does DNSSEC hide queries?
It does not provide confidentiality; encrypted transport handles that responsibility
Does TLSA directly replace all CAs?
Depends on usage, DNSSEC status, and application verification specifications
Security Goals: Authenticate RRsets, Do Not Guarantee Business Goodwill
DNSSEC provides DNS data source authentication, integrity, and authenticated denial of existence. The basic object of signing is the RRset, not signing each RR independently, nor signing the entire response packet containing ID, Flags, and arbitrary additional data uniformly. A cache or another authoritative server can deliver the same signed data; verification does not require connecting to a specific physical server. RFC 4033: Capabilities and Boundaries
It does not encrypt names, addresses, or query times, does not guarantee service availability, and does not prove that the domain operator is not malicious. An incorrectly signed erroneous A record by the domain owner is still an authenticated misconfiguration; compromise of the private key or registrar account is also beyond the capability of "preventing man-in-the-middle tampering."
Traditional DNS random transaction IDs, source ports, response correlation, and cache admission checks can increase the difficulty of forgery, but they are not cryptographic source authentication. DNSSEC complements these checks; enabling it does not allow the cancellation of all resolver protections.
What Each of the Four Record Types Does
Type
Content Stored
Role During Verification
DNSKEY, 48
flags, protocol, algorithm, public key
Provides candidate verification keys
RRSIG, 46
Signed type, algorithm, time, key tag, signature, etc.
Verifies the canonicalized RRset
DS, 43
key tag, key algorithm, digest type, digest
Connects parent zone authorization to child zone DNSKEY
NSEC / NSEC3, 47 / 50
Name or hash range, type bitmaps
Supports negative answers and delegation status proofs
RRSIG contains the Original TTL because TTLs in cache forwarding are decremented; canonicalized signature verification requires using the specified original values, name forms, and ordering. The Key Tag is a short identifier for filtering candidate keys; collisions are possible and it cannot be treated as a cryptographic fingerprint. RFC 4034: Record Formats and Canonicalization
The DS digest input is the concatenation of the wire-format encoding of the canonicalized owner name and the DNSKEY RDATA, which contains Flags, Protocol, Algorithm, and public key bytes; one cannot hash only the public key, nor even the Base64 text used for display. The digest algorithm is determined by the Digest Type, not all DS records are fixed to SHA-256.
Trust Chain: Do Not Omit Child Zone Keyset Verification
A trust anchor can be represented as pre-trusted DNSKEY or DS-type information. Deployment can establish a global chain from the root, or trust anchors from other zones can be configured; it is not fixed to "a hash of the root DNSKEY." Taking the example from the root to the target zone, repeatedly execute parent zone DS verification, child zone DNSKEY digest matching, and child zone DNSKEY RRset verification, and finally verify the target records.
Directly verifying the signature of A after downloading the child zone DNSKEY only proves that "the private key corresponding to this public key signed it." One must first prove that the public key used has trusted authorization before concluding a secure result. The DS saved in the parent zone is signed by the parent zone, and the child zone DNSKEY RRset is signed by the corresponding child zone key; the responsibilities of the two cannot be reversed. RFC 4035: Verification Process
Verification Status
Explanation
Significance for Applications
Secure
Required authentication chain and related verifications hold
Data authenticated under DNSSEC's trust model
Insecure
There is basis to determine that a signature chain was not established, e.g., authenticated delegation without DS
Not that the signature was broken, nor that authentication succeeded
Bogus
Verification should have succeeded based on trust relationships but failed
Verification resolvers usually refuse to deliver as a normal result
Indeterminate
Unable to determine if a trust chain should exist, etc.
Cannot be forcibly treated as Secure
"Receiving no DS" does not equal having obtained a reliable proof of "DS does not exist"; the former could also be timeout, truncation, or filtering. Similarly, an isolated signed zone that is not connected to an existing trust anchor cannot claim that the entire internet will verify it just because it has an RRSIG.
TTL, Signature Time, and Clocks
If an RRset with TTL=3600 s is received, but the signature expires in only 900 s, even if the signature is currently valid, the verified cache cannot unconditionally be used for another 3600 s. The effective cache lifetime is also constrained by RRSIG TTL, Original TTL, and remaining signature time. RFC 4035: Authenticated Caching
Signature Inception/Expiration are absolute validity intervals, while TTL is the relative cache lifetime; the two cannot reset each other by continuously re-fetching. Early re-signing and reasonable time synchronization affect availability; significant local clock offset can cause multiple normally valid zones to simultaneously appear as signatures not yet effective or expired.
Why is it not Secure if the Signature Verifies?
Keep the target signature correct for now, and separately remove DS matching or keyset verification. Without establishing a trusted path in the last block, it cannot become Secure. Move the time to before expiration; the lifespan is compressed by the remaining signature time; at t=2900, the time condition can still pass, but the cache lifespan upper limit is already zero; only later does it exceed the signature validity period.
Preparing the visual
Why is it not Secure if the Signature Verifies?
A correct target signature is only the last condition. Gaps in the authorization chain, failed keyset verification, or time invalidation cannot be compensated for by the target's own signature.
{"id":"dnssec-chain-and-time","title":"Why is it not Secure if the Signature Verifies?","summary":"A correct target signature is only the last condition. Gaps in the authorization chain, failed keyset verification, or time invalidation cannot be compensated for by the target's own signature.","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><label class=\"check\"><input type=\"checkbox\" id=\"ds\" checked><span data-i18n=\"ds\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"match\" checked><span data-i18n=\"match\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"keys\" checked><span data-i18n=\"keys\"></span></label><label class=\"check\"><input type=\"checkbox\" id=\"rr\" checked><span data-i18n=\"rr\"></span></label><div class=\"control\"><label for=\"time\" data-i18n=\"time\"></label><output for=\"time\" id=\"time-value\"></output><input id=\"time\" type=\"range\" min=\"500\" max=\"3500\" value=\"2000\" step=\"100\"></div><div class=\"track-row\"><span data-i18n=\"state\"></span><div id=\"chain\" class=\"track\"></div></div><div class=\"metrics\"><div><span data-i18n=\"state\"></span><strong id=\"state\"></strong></div><div><span data-i18n=\"life\"></span><strong id=\"life\"></strong></div></div><p id=\"equation\" class=\"formula\"></p><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:500;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:500 20px var(--viz-font-ui)}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:var(--viz-font-mono);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px var(--viz-font-ui);background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 var(--viz-font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px var(--viz-font-ui)}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 var(--viz-font-mono);white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:var(--viz-font-ui)}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px var(--viz-font-ui);padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 var(--viz-font-ui);overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}function draw(){const now=+$('#time').value,checks=['ds','match','keys','rr'].map(id=>$('#'+id).checked);let trusted=true;cells('chain',['DS','DNSKEY','KEYSET','RRset'].map((text,i)=>{trusted=trusted&&checks[i];return{text,cls:trusted?'on':'empty'}}));const valid=trusted&&now>=1000&&now<=2900,life=valid?Math.min(3600,2900-now):0;set('time-value',now);set('state',valid?'Secure':'Bogus');set('life',life);set('equation','1000 ≤ '+now+' ≤ 2900: '+(now>=1000&&now<=2900?'✓':'✗')+'\\nTTL ≤ min(3600, 2900 − '+now+')');$('#state').dataset.secure=String(valid);$('#life').dataset.value=life;}document.querySelectorAll('input').forEach(e=>e.oninput=draw);draw();","audio":false,"strings":{"ds":"Parent Zone DS signature is correct","heading":"Why is it not Secure if the Signature Verifies?","intro":"Break the authorization chain links separately and modify the time. Blue propagates only along established trusted relationships.","keys":"Child Zone Keyset signature is correct","life":"Cacheable Lifespan Upper Limit (s)","match":"DS matches Child Zone DNSKEY","reset":"Reset","rr":"Target RRset signature is correct","scope":"Fixed trusted parent zone anchor, known signed delegation with DS, buttons represent independent verification results, no cryptographic signature verification is performed. TTL/RRSIG TTL/Original TTL are all 3600, signature [1000,2900], ignoring sequence number wraparound.","scopeLabel":"Model Scope and Conventions","state":"Verification Status","time":"Verification Time (s)"}}
KSK, ZSK, and Rollover: Roles Are Not Fixed Algorithm Levels
KSK usually signs the DNSKEY RRset, and ZSK usually signs other authoritative RRsets in the zone; a combined signing key can also be used. The Zone Key mask for DNSKEY is 0x0100, and SEP is 0x0001, leading to common flags=256/257. SEP is a role hint and cannot be treated as a cryptographic permission limit that "this key can only sign DNSKEY."
No protocol stipulates that KSK is always 2048-bit RSA, ZSK is always 1024-bit, or that they must be changed annually/monthly. Key algorithm, signature refresh, and key replacement are different choices: the same key can be re-signed multiple times; a signature nearing expiration does not mean the key must be replaced simultaneously. RFC 6781: DNSSEC Operations
Rollover must consider that old DNSKEY, old DS, and old signatures may still be in different caches. The general approach is to reserve publication and cache propagation time for the new key, allow necessary combinations to verify during the overlap period, and then retire old materials according to the corresponding rollover plan. It cannot be generalized to "delete old key first, then upload new DS"; this would prevent validators still trusting the old DS from matching the child zone key.
Changes to parent zone DS and actual responses from each authoritative node should be recorded, rather than just looking at the management backend showing success. The retirement waiting time is determined by relevant TTLs, signature validity periods, and the plan; this article does not fabricate a fixed hourly table applicable to all operators.
NSEC/NSEC3: Providing Checkable Basis for Negative Answers
Assume the existing names adjacent in DNS specification name order in the zone are a.example. and c.example.. A signed NSEC linking these two names can help prove that there is no b.example. between them. For NODATA where the name exists but a certain type does not, the type bitmap provides different proof information.
This is just interval intuition; complete NXDOMAIN requires correct handling of closest encloser, wildcards, and other conditions; one cannot simply find a string lexicographical interval and declare the proof complete. NSEC uses DNS name specification order, not the default string sorting of any arbitrary language.
NSEC3 hashes canonical names to form corresponding intervals, increasing the cost of reading names directly from the chain, but short, common names may still be guessed via dictionary attacks. Opt-Out allows corresponding unsigned delegations to not enter the hash chain item by item, having specific proof boundaries; it is not a switch for arbitrary record exemption from signing. RFC 5155: NSEC3
Higher iteration counts increase verification workload and cannot be treated as a universal tuning item where "larger is safer." RFC 9276 recommends NSEC3 use zero extra iterations and empty salt settings; parameters still need to be selected based on the support of the signature/verification software used and verification costs. RFC 9276: NSEC3 Parameters
DO, AD, CD: Catching Flags Does Not Equal Self-Verification
The DO bit expresses the capability/requirement for DNSSEC data related to the request; dig +dnssec can display RRSIGs, but this does not automatically make it a complete local validator. AD is the resolver's declaration of authentication status; clients can only accept it according to policy if they trust the resolver and the path to it has corresponding protection. CD requests disable corresponding checks, used to contrast issues, and does not make data trustworthy.
One can separately observe authoritative original records, recursive server results, and local validator detailed diagnostics. When SERVFAIL occurs, it could also be network failure, truncation handling, or resource limits; one cannot assert it is definitely a DNSSEC failure; Extended DNS Errors can supplement reasons, but not every response has them, and they cannot replace one's own trust judgment. RFC 8914: EDE
Phenomenon
Priority Check
DS exists but no matching DNSKEY found
Consistency of parent/child zone publication, cache still holding old values
Key matches but target verification fails
RRset canonicalization, signature, algorithm, and authoritative node consistency
Multiple normal zones suddenly have time errors
Verification end clock and time synchronization
Small answers normal, large DNSSEC answers fail
EDNS, UDP fragmentation, and TCP fallback path
Only one recursive server fails
Anchor, cache, supported algorithms, and specific error messages
DANE: Determining TLS Trust Rules Based on Usage
The owner of TLSA usually contains port and transport protocol, e.g., _443._tcp.example.com.; RDATA contains certificate usage, selector, matching type, and associated data. The selector distinguishes between the full certificate and SubjectPublicKeyInfo, and the matching type distinguishes between plaintext matching and digest matching. RFC 6698: TLSA
usage
Name
General Meaning
0
PKIX-TA
Constrains CA based on PKIX chain verification
1
PKIX-EE
Constrains end certificate based on PKIX verification
2
DANE-TA
Establishes corresponding trust anchor using DNSSEC-authenticated associated information
3
DANE-EE
Constrains end certificate/public key using DNSSEC-authenticated associated information
Therefore, DANE does not uniformly equate to "no longer needing any PKI checks." Applications must also correctly bind the service name, obtain Secure TLSA, and complete TLS's proof of possession of the corresponding private key and the rules for that usage. Simple hash matching is insufficient, and usage=3 cannot be detached from requirements to be claimed as "maximum security."
DANE already has SMTP application specifications; one cannot claim zero adoption rate just because general browser support is limited. How to discover MX, determine TLSA availability, and handle failures in SMTP are supplemented by email scenario specifications. RFC 7672: SMTP DANE
Local Recalculation: DS Digest Input and Time Constraints
importhashlibimportstructdefowner_wire(name):returnb''.join(bytes([len(x)])+x.encode('ascii')forxinname.rstrip('.').lower().split('.'))+bytes(1)# Teaching byte string simulation of 32 B public key field; no private key or real signature generated.
public_bytes=bytes(range(32))rdata=struct.pack('!HBB',257,3,15)+public_bytesowner=owner_wire('Example.COM.')digest=hashlib.sha256(owner+rdata).digest()assertlen(digest)==32assertdigest==hashlib.sha256(owner_wire('example.com.')+rdata).digest()assertdigest!=hashlib.sha256(public_bytes).digest()assertdigest!=hashlib.sha256(owner_wire('other.example.')+rdata).digest()changed_flags=struct.pack('!HBB',256,3,15)+public_bytesassertdigest!=hashlib.sha256(owner+changed_flags).digest()assert257&0x100and257&1assert256&0x100andnot256&1# Teaching values not crossing time sequence wraparound; complete verification has other checks.
now,inception,expiration=2000,1000,2900defsignature_time_valid(at):returninception<=at<=expirationassertsignature_time_valid(now)assertsignature_time_valid(expiration)assertnotsignature_time_valid(expiration+1)assertmin(3600,3600,3600,expiration-now)==900assertmin(3600,3600,3600,expiration-expiration)==0assertnotsignature_time_valid(3000)print('DS input includes owner/flags, public key encoding differences, flags, and validity period constraint checks passed')
The example only verifies encoding dependencies and time budgets; it does not perform RRSIG cryptographic verification or build a real trust chain; no DNSKEY/DS publication, production key rollover, or resolver policy adjustment is done.