课题研究 DNS解析安全 子课题02 · 第2页 / 共8页
02六大核心研究子课题 · DNSSEC部署与验证

密码学与资源记录模型

DNSSEC的本质是将"经典DNS数据 + 公钥签名"绑定,使验证方可在不依赖传输加密的前提下确认数据来源与完整性。本页深入解析其公钥密码学基础、四类核心资源记录(DNSKEY/RRSIG/DS/NSEC-NSEC3)及其自声明变体CDS/CDNSKEY,并给出算法与摘要的选用状态(RFC 8624/9904)与NSEC/NSEC3的选型决策,为后续部署与验证奠定统一的"语言基础"。

公钥签名DNSKEY/RRSIGDS委托NSEC3算法状态研究状态:深度研究中
所属课题DNS解析安全 · 子课题02
聚焦密码学模型 / 记录语义 / 算法状态
核心依据RFC 4034/5155/7344/8624/9904

01 · 公钥密码学基础

1.1 签名而非加密:DNSSEC的密码学选择

DNSSEC采用数字签名而非加密来保障安全。其逻辑是:区持有者用私钥对数据的摘要(哈希)签名,任何验证方用公开的公钥验证签名,从而确认"数据确实由持有者签发且未被篡改"。DNS的解析数据本身仍是明文(可被缓存、被观察),但每一条被签名的RRset都附带一个RRSIG,使伪造应答因缺省有效签名而被判定Bogus。

这一设计与TLS不同:TLS在传输层加密会话,DNSSEC在数据层绑定真实性。二者正交,因此"开启DNSSEC"并不等于"DNS流量被加密"——机密性仍需DoT/DoH提供(见子课题03)。

1.2 哈希、签名与RRSIG的构成要素

验证链路依赖两个密码学原语:哈希(摘要)将任意长度数据压缩为定长指纹;非对称签名用私钥对指纹签名、公钥验证。RRSIG记录本身携带"被签RRset类型、算法、标签数、原始TTL、签名有效期(inception/expiration)、key tag(密钥指纹)、签名者名、签名值"等字段(见§2.2)。这些字段使验证方能精确复现"应该被验证的数据窗口",并拒绝过期或越界的签名。

为何按RRset而非单记录签名:DNS常以集合(如某名下所有A记录)形式应答。DNSSEC对"同名的同类型记录集合(RRset)"整体签名,既减少签名数量,也避免攻击者拼接不同来源记录绕过验证。这也是为何验证器验证的是RRset而非单条记录。

1.3 密钥强度与选择原则

RFC 8624给出明确指引:新部署首选ECDSAP256SHA256(算法13)或RSASHA256(算法8),并建议逐步过渡到Ed25519(算法15);RSA密钥长度推荐≥2048位(历史2048位为常见实践,早期1024位KSK已被认为偏弱)。椭圆曲线算法以更短签名提供同等/更高强度,显著降低UDP分片与TCP回退概率——这对受限网络尤为关键。

02 · 核心资源记录解析

2.1 DNSKEY —— 区的公钥

每个签名区在其区内发布一个或多个DNSKEY记录,携带区的公钥。关键字段:flags(256=ZSK区签名密钥;257=KSK密钥签名密钥/SEP)、protocol(固定为3)、algorithm(算法编号)、public key。区的DNSKEY RRset本身也被签名——由KSK签名,形成"密钥自证"闭环。父区则通过DS记录"背书"子区的KSK(flag 257)。

2.2 RRSIG —— RRset的数字签名

RRSIG记录覆盖一个RRset,字段含:被签类型(type covered)、算法、标签数(labels,用于通配符验证)、原始TTL、签名有效期(inception/expiration)、key tag(用于快速匹配签名所用DNSKEY)、签名者名(signer's name,即归属区)、以及二进制签名值。验证器用匹配DNSKEY重新计算并比对签名,同时检查有效期窗口。

2.3 DS —— 父区对子区KSK的委托摘要

DS(Delegation Signer)记录存放于父区,内容是对子区KSK的哈希摘要(含key tag、算法、digest type、digest),而非公钥本身。它把信任从父区"交接"到子区:验证器在父区看到DS,即可确认子区DNSKEY RRset中对应KSK是经父区认可的,从而延续链式信任。DS本身由父区用其KSK签名(在父区的RRSIG下)。

2.4 NSEC / NSEC3 —— 经认证的否定存在证明

经典DNS用"NXDOMAIN/No Data"表示"不存在",但攻击者可以伪造否定应答实施"拒绝存在"攻击。DNSSEC必须能证明某名下确实不存在,即"经认证的否定存在证明(Authenticated Denial of Existence)":

  • NSEC(RFC 4034):以有序链指向下一个存在的域名,并列出该名下所有记录类型,从而可证明"某域名/某类型不存在"。代价是会明文枚举整个区的所有域名。
  • NSEC3(RFC 5155):对域名做加盐哈希后再串链,缓解枚举,并支持Opt-Out(仅覆盖已签名的委托点),适合含大量未签名子委托的大型区。
  • NSEC3PARAM:携带哈希算法、盐值、迭代次数等参数,供验证方复现哈希。

NSEC3强度警示:NSEC3仅"掩盖"而非"消除"枚举风险。若盐值固定、迭代次数过低(如历史常见的15次以下)且域名空间可预测,攻击者可离线字典/暴破还原域名。RFC 5155与后续运维建议强调合理设置迭代次数与盐值;对强隐私需求应考虑NSEC3 Opt-Out或动态在线签名方案。本课题不提供暴破实现,仅提示风险与参数配置原则。

2.5 CDS / CDNSKEY —— 自动维护父区DS(RFC 7344/8078)

CDS与CDNSKEY是子区在自己区内发布的"自声明"记录,语义分别是"我希望父区发布的DS"和"对应的DNSKEY"。父区(或注册局自动化系统)读取子区CDS/CDNSKEY并据此增删改其DS,从而实现无需人工干预的密钥滚动——这是现代DNSSEC能"自动滚密钥"的核心机制(第4页详述)。RFC 8078进一步定义"this registry"(digest type 0的CDS)用于请求删除DS。

2.6 DLV(历史性,已不推荐)

DLV(DNSSEC Lookaside Validation,RFC 4431/5074)是早期在"父区未签名"时、通过独立信任锚旁路验证的过渡机制。随着根与主流TLD完成签名,DLV已退出主流实践,本课题仅作历史注记,不建议新部署采用。

$ dig +dnssec example.com DNSKEY | grep -E "DNSKEY|RRSIG" | head
example.com.      3600 IN DNSKEY 257 3 13 ( KSK, flag=257, alg=13 )
example.com.      3600 IN DNSKEY 256 3 13 ( ZSK, flag=256, alg=13 )
example.com.      3600 IN RRSIG  DNSKEY 13 2 3600 ( ... inception/exp ... keytag=12345 )
$ dig +dnssec com DS example.com
example.com. 86400 IN DS 12345 13 2 ( SHA-256 digest of KSK )

示例为说明性命令行与输出结构,实际值以真实区数据为准;生产环境应以 delv 做端到端验证(见第5、6页)。

03 · 算法与摘要状态(RFC 8624 / 9904)

RFC 8624(2019)给出了DNSSEC算法与DS摘要的"实现/使用"推荐;RFC 9904(2025)将这些状态纳入IANA注册表治理流程。下表汇总关键算法在当前注册表中的状态("实现"指解析器/签名软件是否必须支持;"使用"指是否推荐用于新签名):

编号算法实现(签/验)使用(签/验)实践建议
13ECDSAP256SHA256MUST / MUSTRECOMMENDED / RECOMMENDED新部署首选:短签名、低开销、强安全(约128位)。
8RSASHA256MUST / MUSTRECOMMENDED / RECOMMENDED兼容性最佳,RSA≥2048位;存量系统平滑之选。
15ED25519RECOMMENDED / RECOMMENDEDRECOMMENDED / RECOMMENDED确定性签名、抗侧信道、签名最短;被视为未来默认。
14ECDSAP384SHA384MAY / RECOMMENDEDMAY / RECOMMENDED约192位强度,签名略长。
16ED448MAY / RECOMMENDEDMAY / RECOMMENDED高强EdDSA变体。
10RSASHA512NOT REC. / MUSTNOT REC. / MUST验证须支持,新签名不建议(签名过长)。
5,7RSASHA1 / NSEC3-SHA1NOT REC. / MUSTNOT REC. / MUSTSHA-1已不安全;仅保留验证旧数据,严禁新签。
1,3,6RSAMD5 / DSA / DSA-NSEC3MUST NOTMUST NOT已废弃,禁止实现与使用。
17SM2SM3MAY / MAYMAY / MAY国密SM2/SM3,由RFC 9563(CNNIC,2024)定义算法号17与SM3摘要类型6;独立提交、生态支持有限。

DS摘要算法:SHA-1(1)MUST NOT用于新生成(验证仍须支持旧数据);SHA-256(2)RECOMMENDED/MUST;SHA-384(4)MAY/RECOMMENDED。来源:RFC 8624 §3、IANA DNSSEC Algorithm Numbers 与 DS Digest Algorithms 注册表。注意:RFC 9904(2025-11)已废弃8624并将上述状态迁入IANA注册表治理,原有状态未变;引用时建议直接标注IANA注册表。算法淘汰须缓慢进行,避免整区退化为"等效未签名"。

DNSSEC 算法推荐强度概览(实现级状态)
ECDSA P-256 与 RSA/SHA-256 为当前实现级 MUST;SHA-1 系仅保留验证、禁止新签
数值为本课题为直观呈现"推荐强度"构造的相对示意(非注册表原始分值);原始状态以RFC 8624/IANA注册表为准。

04 · 签名与验证流程

验证一个RRset是否可信,验证器(递归解析器或终端)执行如下链路;任何一环失败即判Bogus:

验证一个 RRset 的端到端流程
从根信任锚出发,逐级用 DNSKEY 验证 RRSIG,并用 DS 衔接父子信任
说明:流程对应RFC 4035验证器算法;否定应答另需NSEC/NSEC3链验证(见§2.4)。

4.1 关键匹配:Key Tag 与 Signer Name

RRSIG中的key tag是DNSKEY的简短指纹,用于快速定位"应由哪把公钥验证此签名";signer name指明签名归属区,避免跨区误用。验证器必须确认RRSIG的签名者名与所验RRset所属区一致,且key tag指向的DNSKEY确实存在于该区并被相应KSK"背书"。

Key Tag碰撞:key tag仅为16位,存在碰撞概率(不同密钥产生相同tag)。验证器不得仅凭key tag匹配,必须对所有匹配tag的候选DNSKEY逐一尝试验证;这点是实现正确性的常见坑(RFC 4034也提示了tag计算的简化算法可能碰撞)。

02B · RRSIG 字段结构详解(RFC 4034 §3)

RRSIG的报文字段顺序与语义必须精确掌握——故障排查(第6页)与实现审计都依赖对字段的逐项判读。RRSIG RDATA依次包含以下字段:

字段类型/长度语义与判读要点
type covered16位整数被签RRset的RR类型(如A=1、DNSKEY=48)。验证器据此把签名与数据集合配对。
algorithm8位整数签名算法编号(13/15/8等),必须与签名所用DNSKEY的algorithm一致。
labels8位整数签名者名中除根外的标签数;用于通配符证明。通配符签名此处少1(不含被展开的最左标签),是实现常见错点。
original TTL32位整数签名时该RRset的TTL。验证时需把应答RRset的TTL钳制(cap)到此值再计算哈希(RFC 4034 §3.1.3),防TTL操纵攻击。
sig expiration32位时间签名失效时间(Unix秒)。过期即判Bogus——监测的核心字段(第6页)。
sig inception32位时间签名生效时间。时钟快于inception会触发"未来签名"误判,NTP同步不可省。
key tag16位整数DNSKEY的校验和指纹,用于快速索引候选密钥;存在碰撞,须回退全量尝试(见§4.1)。
signer's name域名签名者区名。验证器据此把RRSIG归到正确区,防跨区签名冒用。
signatureBase64对"RRSIG RDATA前8字段 + 被签RRset规范化数据"的签名值。

字段定义与"TTL钳制"规则见RFC 4034 §3;通配符labels语义见RFC 4035 §5.3.2。这两处是部署工具输出与手工排障时最易误读的位置。

05 · NSEC 与 NSEC3 的选型决策

NSEC与NSEC3各有取舍,选型取决于"隐私/区规模/运维复杂度"的权衡:

维度NSEC(RFC 4034)NSEC3(RFC 5155)
域名枚举明文有序链,可完整枚举区加盐哈希链,缓解枚举(但弱参仍可被暴破)
适用区规模中小区、无需隐藏大型区、含大量未签名子委托(Opt-Out)
验证复杂度低,无需哈希计算较高,须复现哈希与盐值/迭代
Wildcard处理标准支持须配合NSEC3覆盖区间证明通配符不存在
推荐场景一般企业区、对枚举不敏感大型运营商/注册局区、重视枚举缓解

决策原则:在满足枚举缓解需求的前提下优先简单(NSEC);若区含大量未签名委托或强枚举隐私要求,则采用NSEC3并务必配置充足的迭代次数与随机盐值。无论哪种,否定应答验证均依赖Aggressive NSEC缓存(RFC 8198)以提升性能。

06 · 实现要点与陷阱

  • 通配符记录:*.example.com 的签名需按NSEC/NSEC3规则证明"更具体的名称不存在",验证器据此接受通配符应答;配置错误会导致合法通配符被判Bogus。
  • CNAME/DNAME:指向目标的记录须在同一验证域内被签名;跨区CNAME链每段都需各自验证。注意:CNAME与同名其他类型记录(RFC 4035 §2.4、RFC 6840 §4.4的约束)混存会导致验证失败,权威侧应保持"CNAME独占"规则。
  • 标签计数(labels):RRSIG的labels字段用于通配符与大小写/标签边界判定,膨胀(如国际化域名punycode)须正确计算。
  • 签名有效期窗口:RRSIG inception/expiration须覆盖重签周期并有余量;时钟不同步的验证器可能误判过期。
  • EDNS0缓冲区与分片:DNSSEC应答更大,易触发UDP分片与TCP回退;过短的EDNS0 UDP size或中间设备丢弃大包会导致验证失败(第6页故障排查重点)。
  • 算法一致性:区签名算法与DS摘要算法须匹配;双算法过渡须先升DS摘要再滚KSK(RFC 8624/9904运维提示)。

本节参考来源(第2页)

以下为真实可查的权威来源,支撑本页关于记录语义、算法状态与NSEC/NSEC3的事实表述。

[1]

RFC 4034 — Resource Records for the DNS Security Extensions(DNSKEY/RRSIG/DS/NSEC):rfc-editor.org/rfc/rfc4034

[2]

RFC 5155 — DNS Security (DNSSEC) Hashed Authenticated Denial of Existence(NSEC3):rfc-editor.org/rfc/rfc5155

[3]

RFC 7344 — Automating DNSSEC Delegation Trust Maintenance(CDS/CDNSKEY):rfc-editor.org/rfc/rfc7344

[4]

RFC 8078 — Managing DS Records from the Parent via CDS/CDNSKEY:rfc-editor.org/rfc/rfc8078

[5]

RFC 8624 — Algorithm Implementation Requirements and Usage Guidance for DNSSEC:rfc-editor.org/rfc/rfc8624

[6]

RFC 9904 — DNSSEC Cryptographic Algorithm Recommendation Update Process(2025):rfc-editor.org/rfc/rfc9904

[7]

RFC 8198 — Aggressive Use of DNSSEC-Validated Cache(NSEC缓存):rfc-editor.org/rfc/rfc8198

[8]

IANA — DNSSEC Algorithm Numbers / DS Digest Algorithms:iana.org/assignments/dnssec-algorithms