# DNSSEC（DNS 安全扩展）是什么？定义、例子与常见误区

> DNSSEC 是一组 DNS 扩展，让解析器能沿着从根区开始的签名链，验证 DNS 应答确实来自权威方且未被篡改。

Source: https://ssl.sh/zh/glossary/dnssec/
Last updated: 2026-11-10

DNSSEC 由 RFC 4033 至 4035 规定，为 DNS 加上数字签名。每个签名区用 DNSKEY 记录发布公钥，用 RRSIG 记录为各组记录签名；父区发布 DS 记录（子区密钥的哈希），于是信任从根区（2010 年起签名）经顶级域一路传到你的域名。NSEC 或 NSEC3 记录则对“该名字不存在”给出带签名的证明。做校验的解析器验证完整条链后，会把应答标记为已认证。

## 为什么重要
普通 DNS 应答可以被伪造或篡改，攻击者借此把流量引到别处。对 HTTPS 来说，证书仍负责认证服务器，但不少与证书相关的机制依赖 DNS 的真实性：[DANE](https://ssl.sh/zh/glossary/dane/) 和 [TLSA](https://ssl.sh/zh/glossary/tlsa/) 记录离开 DNSSEC 就毫无意义；CA 查询 [CAA](https://ssl.sh/zh/glossary/caa/) 记录、做 DNS 方式的域名验证也依赖 DNS，签名的区能让这些检查更难被绕过。DNSSEC 只保证完整性，不提供机密性，查询和应答在传输中依然可见。最大的运维风险是把解析搞挂：比如更换 DNS 服务商或轮换密钥时没有同步更新注册商处的 DS 记录，做校验的解析器就会对整个域名返回 SERVFAIL。启用前要确认 DNS 服务商（如 DNSPod、阿里云解析）和域名注册商都支持 DNSSEC 并能提交 DS 记录。

## 例子
```bash
dig +dnssec example.com A     # 查看 RRSIG 记录和 ad 标志
dig +short DS example.com     # 父区中发布的 DS 记录
delv example.com A            # BIND 自带的校验查询工具，成功时输出 "; fully validated"
```

## 常见误区
- **DNSSEC 会加密 DNS。** 它只做签名。加密查询是 DNS over TLS 或 DNS over HTTPS 的事。
- **有了 DNSSEC 就不需要 HTTPS 证书。** 浏览器不使用 DNSSEC 认证网站服务器，证书依然必不可少。
- **在 DNS 服务商那里打开开关就够了。** 只有在注册商处提交了 DS 记录，信任链才完整。迁移 DNS 服务商时要规划好密钥和 DS 的切换，否则对做校验的解析器来说域名会直接无法解析。

## 相关术语

- [DANE](https://ssl.sh/zh/glossary/dane/): DANE 是一种利用经 DNSSEC 签名的 TLSA 记录，把 TLS 服务器的证书或公钥与其域名绑定起来的协议。
- [TLSA 记录](https://ssl.sh/zh/glossary/tlsa/): TLSA 记录是一种 DNS 记录，声明某个端口和协议上的 TLS 服务必须出示哪张证书或哪个公钥，供 DANE 校验使用。
- [CAA 记录](https://ssl.sh/zh/glossary/caa/): CAA 记录是一种 DNS 记录，用来声明哪些证书颁发机构可以为该域名签发证书，所有公共 CA 签发前都必须检查。
- [DCV](https://ssl.sh/zh/glossary/dcv/): DCV 即域名控制权验证，是 CA 在签发证书前确认申请者确实控制证书中每一个域名的检查。
- [DNS-01](https://ssl.sh/zh/glossary/dns-01/): DNS-01 是一种 ACME 验证方式，客户端在 _acme-challenge 子域名下发布由 CA 质询计算出的 TXT 记录来证明域名控制权。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
