术语表

TLSA 记录 (TLSA Record)

最后核实

定义

TLSA 记录是一种 DNS 记录,声明某个端口和协议上的 TLS 服务必须出示哪张证书或哪个公钥,供 DANE 校验使用。

TLSA 记录挂在由端口和传输协议组成的名字下,例如 _25._tcp.mail.example.com 或 _443._tcp.example.com,包含四个字段。证书用途:0(PKIX-TA)和 1(PKIX-EE)在常规 CA 校验之上增加约束,2(DANE-TA)指定信任锚,3(DANE-EE)直接匹配服务器自己的证书或公钥,不做 CA 校验。选择器:0 表示整张证书,1 表示公钥信息(SubjectPublicKeyInfo)。匹配类型:0 原样比对,1 为 SHA-256,2 为 SHA-512。最后是关联数据本身。TLSA 只有经过 DNSSEC 签名、作为 DANE 的一部分时才有意义。

为什么重要

参数选择决定了证书续签时有多麻烦。普遍推荐的 3 1 1(DANE-EE、公钥、SHA-256)只匹配公钥,续签时沿用同一私钥就不用改 DNS。如果 ACME 客户端每次续签都生成新私钥(certbot 默认如此,除非加 --reuse-key),就必须先更新记录,否则做校验的发信方会拒绝投递邮件。稳妥的轮换方式是:先把新公钥的哈希和旧的一起发布,等 DNS 缓存过期,再切换密钥。在 DNSPod、阿里云解析等服务商添加前,先确认它们支持 TLSA 类型和 DNSSEC。

例子

# 选择器 1 + 匹配类型 1:公钥的 SHA-256
openssl x509 -in cert.pem -noout -pubkey \
  | openssl pkey -pubin -outform der \
  | openssl dgst -sha256 | awk '{print $2}'
_25._tcp.mail.example.com. 3600 IN TLSA 3 1 1 <上面命令输出的 64 位十六进制>

也可以用 TLSA 生成工具直接从证书生成记录。

常见误区

  • 每次续签都必须改 TLSA 记录。 选择器为 1 且私钥不变时不需要。
  • 不开 DNSSEC 也能用 TLSA。 做校验的客户端会忽略未经 DNSSEC 签名的 TLSA 数据。
  • 一条 TLSA 记录覆盖整个域名。 记录名包含端口和协议,每个服务、每台 MX 主机都需要各自的记录。

延伸阅读