TLSA 是什么
TLSA(TYPE 52)把 TLS 证书或公钥的哈希绑定到域名上,配合 DNSSEC 形成 DANE:客户端拿到服务端证书后,用 DNS 中的 TLSA 记录校验它是否就是域名所有者声明的那一份。这样服务端认证就不再完全依赖 CA 体系,但前提是 DNS 侧确实可信——没有 DNSSEC 的 TLSA 没有任何安全意义(RFC 6698)。
基本信息
| 类型 | TLSA(TYPE 52) |
|---|---|
| 字段 | usage、selector、matching type 与证书关联数据 |
| 命名 | _端口._协议.域名,如 _443._tcp.example.com |
| 规范 | RFC 6698(DANE);用法建议见 RFC 7671 |
| 前提 | 必须先启用 DNSSEC |
| 常见用途 | SMTP DANE、自建服务与高价值服务的证书绑定 |
典型使用场景
- 邮件投递(SMTP DANE):强制校验对端证书,抵御降级与伪造
- 自建服务:不依赖公共 CA 也能让客户端信任你的证书
- 安全加固:为内部系统或高价值服务做证书绑定
- 排障:证书轮换后确认 TLSA 记录是否同步更新
- 合规审计:核对对外服务的 DNS 记录与证书是否一致
- 迁移演练:更换证书前先并行发布新旧两条记录
查看与计算匹配值
查看与计算匹配值
# 查看某个端口的 TLSA 记录
dig +short _443._tcp.example.com TLSA
# 3 1 1 <sha256-hash>
# usage=3(域颁发证书)selector=1(公钥)matching=1(SHA-256)
# 计算当前证书的匹配值,与记录逐字节对比
openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256三个字段怎么读
| 字段 | 取值 | 含义 |
|---|---|---|
| usage | 0 到 3 | 0 为 CA 约束、1 为服务端证书、2 为信任锚、3 为域颁发证书 |
| selector | 0 为整张证书,1 为公钥 | 用公钥可减轻证书轮换带来的记录变更 |
| matching | 0 完整、1 为 SHA-256、2 为 SHA-512 | 实践中 1 最常用 |
| 命名 | _端口._协议.主机 | 端口写错就查不到记录 |
没有 DNSSEC 的 TLSA 记录没有安全意义:攻击者可以伪造 DNS 应答,把哈希换成自己证书的值,绑定的意义就消失了。
证书轮换后必须同步更新 TLSA,否则启用 DANE 的客户端会直接拒绝连接;建议在新旧证书上并行发布一段时间作为过渡。
用 selector=1(公钥)而不是 selector=0(整张证书),可以在证书续期但密钥不变时避免修改记录。
TLSA 的校验发生在客户端,服务端感知不到拒绝原因,排障时要同时查看客户端日志与 DNS 记录是否一致。