peterzen/goresolver
GitHub: peterzen/goresolver
一个基于 Go 的 DNSSEC 验证解析器库,通过验证 DNS 响应的数字签名和信任链来防止 DNS 欺骗攻击。
Stars: 25 | Forks: 5
# go-resolver
[](https://github.com/peterzen/goresolver/actions/workflows/go-ci.yml)
一个基于 [miekg/dns](https://github.com/miekg/dns) 实现的 Golang DNSSEC 验证解析器库。
本包实现了执行 DNSSEC 验证的 DNS 查找函数。
## 实现说明
在查询启用了 DNSSEC 的区域时,它会全面验证响应中包含的资源记录,并验证信任链:
* 请求所需的 RRset(连同相应的 `RRSIG` 记录)
* 请求包含公共 ZSK 和公共 KSK 的 `DNSKEY` 记录(连同 `DNSKEY` RRset 的 `RRSIG`)
* 使用公共 ZSK 对请求的 RRset 的 `RRSIG` 进行加密验证
* 使用公共 KSK 对 `DNSKEY` RRset 的 `RRSIG` 进行加密验证
* 检查 `RRSIG` 记录的有效期
完成这些加密验证后,本包会向上遍历委派链,将公共 `DNSKEY` RR 与每个父区域中的 `DS` 记录进行比对,直到根区域,以此来验证身份验证链。
### 根区域信任锚点
该库包含官方 IANA 根区域信任锚点(KSK-2017,密钥标签 20326),用于验证根区域的 DNSKEY。这确保了整个信任链都能被验证直至根区域,从而防止行为异常的服务器伪造 DNS 层次结构。
根区域验证遵循用于 DNSSEC 验证的 [RFC 4033](https://tools.ietf.org/html/rfc4033) 和 [RFC 4034](https://tools.ietf.org/html/rfc4034) 规范。
(有关 DNSSEC 如何工作的更深入说明,请参阅[此指南](https://www.cloudflare.com/dns/dnssec/how-dnssec-works/)。)
如果出现任何验证错误,该方法将返回一个非空的 `err` 值以及一个空的结果集。
`goresolver` 尚未实现使用 `NSEC` 或 `NSEC3` 记录的否认存在验证。
## 文档
```
import "github.com/peterzen/goresolver"
result, err := resolver.StrictNSQuery("example.com.", dns.TypeMX)
if err != nil {
// handle validation errors
}
```
`goresolver.LookupIP` 可用作 [net.LookupIP](https://golang.org/pkg/net/#LookupIP) 的直接替代品:
```
import "github.com/peterzen/goresolver"
ips, err := goresolver.LookupIP("www.example.com")
if err != nil {
// handle validation errors
}
```
## 安装说明
```
$ go get -u github.com/peterzen/goresolver
```
欢迎并非常感谢提交针对涵盖较少见 DNSSEC 配置的额外测试用例的 PR。
## 更多信息
* DNS 安全简介和要求 [RFC4033](https://tools.ietf.org/html/rfc4033)
标签:DNS, DNSSEC, DNS欺骗防护, EVTX分析, Golang, Go语言, KSK, miekg/dns, RFC 4033, RFC 4034, UDP扫描, ZSK, 中间人攻击防护, 信任链, 公钥验证, 域名系统安全, 安全编程, 安全解析, 密码学验证, 开发库, 数据完整性验证, 日志审计, 根区信任锚, 程序破解, 网络安全, 网络库, 解析器, 隐私保护