内容提要
本文介绍为启用DNSSEC的域名生成TLSA和SSHFP记录的方法。TLSA用于DANE,推荐参数3 1 1(或3 1 2),从证书或私钥提取SPKI计算SHA-256/512散列,主要保护SMTP的25端口;续期须沿用私钥,轮换时先预发布新旧记录。SSHFP可用ssh-keygen -r生成,保留SHA-256记录,客户端需启用VerifyHostKeyDNS并确保解析器支持DNSSEC验证。
延伸解读
TLSA 的实用边界:主要保护 SMTP 而非 Web
文章明确指出,TLSA 目前最主要的实用场景是邮件服务器之间的传输加密。SMTP 的 STARTTLS 是机会性加密,中间人可剥离能力声明将连接降级为明文;支持 DANE 的发送方 MTA 查到 TLSA 记录后会强制 TLS 并校验证书。而主流浏览器基本不支持 DANE,Web 服务发布 TLSA 记录实际意义不大。读者应据此分配精力,优先保障 25 端口。
续期沿用私钥是 TLSA 生效的关键前提
选择 3 1 1 或 3 1 2 时,TLSA 记录匹配的是公钥而非整张证书,因此续期只要沿用同一私钥,记录便无需更新。但文章警告,这并非所有 ACME 客户端的默认行为:acme.sh 默认复用私钥,Certbot 需加 --reuse-key,lego 需在 renew 时指定 --reuse-key。若私钥被悄悄更换而 TLSA 未同步,支持 DANE 的发信方会直接拒绝投递。
密钥轮换需预发布并等待缓存过期
更换私钥时,文章建议按 RFC 7671 第 8.1 节操作:先在新证书启用前同时发布新旧公钥的 TLSA 记录,等待至少一个 TTL(原始 TTL 与剩余缓存时间中的较大者)后再切换证书,最后删除旧记录。若新记录尚未在各处缓存生效就上线新证书,部分客户端可能因拿到旧 TLSA 记录而无法连接。这与 DNSSEC 密钥轮转的预发布做法类似。
SSHFP 生效依赖客户端与解析器双重配置
SSHFP 可让客户端自动核对主机密钥,避免首次连接即遭中间人。但 OpenSSH 默认不查询 SSHFP,需在 ssh_config 中启用 VerifyHostKeyDNS;且客户端只信任带 AD 标志的 DNSSEC 验证通过响应,因此本机解析器须支持 DNSSEC 验证。glibc 2.31 及以后还需在 resolv.conf 加 options trust-ad,否则 AD 标志会被丢弃,ssh 仍要求手工确认。
Q&A
TLSA记录应该选什么参数?3 1 1是什么意思?
TLSA记录格式为_端口._协议.主机名 IN TLSA 用途 选择器 匹配方式 关联数据。推荐使用3 1 1或3 1 2:用途3表示DANE-EE,由DNSSEC直接认证终端证书或公钥,不依赖CA;选择器1表示匹配SPKI(仅公钥),续期时沿用私钥即可保持记录有效;匹配方式1为SHA-256,2为SHA-512。不特别讲究时只发布3 1 1也够用,兼容性最好。
怎么从证书或私钥计算TLSA记录需要的散列值?
从证书生成(推荐,不接触私钥):openssl x509 -in 证书 -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -r,将sha256换成sha512可得SHA-512值。从私钥生成:openssl pkey -in 私钥 -pubout -outform DER | openssl dgst -sha256 -r。输出即为TLSA关联数据。
TLSA记录在密钥轮换时怎么操作才不会导致邮件投递失败?
按RFC 7671第8.1节,先在新证书启用前于DNS同时发布新旧两个公钥的TLSA记录,等待至少一个TLSA记录的TTL(原始TTL与剩余缓存时间中的较大者)后再切换证书,最后删除旧记录。另外续期时必须沿用私钥,注意Certbot需加--reuse-key,lego需在renew时指定--reuse-key,否则私钥更换而TLSA未更新会导致支持DANE的发信方拒绝投递。
SSHFP记录怎么生成?客户端如何启用验证?
在服务器上用ssh-keygen -r $(hostname)或ssh-keygen -r 主机FQDN生成BIND格式记录,输出中第二个数字为2的是SHA-256记录,可用awk '$5 == 2'只保留它(SHA-1已不推荐)。客户端需在~/.ssh/config或/etc/ssh/ssh_config中设置VerifyHostKeyDNS yes,并且本机解析器要支持DNSSEC验证;glibc 2.31及以后还需在/etc/resolv.conf加options trust-ad,否则AD标志会被丢弃。
TLSA记录主要能保护什么?浏览器支持DANE吗?
TLSA配合DANE最主要的实用场景是邮件服务器之间的传输加密(SMTP 25端口),支持DANE的发送方MTA查到TLSA记录后会强制TLS并校验对方证书,防止STARTTLS被剥离降级为明文。主流浏览器基本不支持DANE,Web服务发布TLSA记录实际意义不大。587、465、993等面向邮件客户端的端口记录主要为了完整性,保护作用有限。
TLSA记录应该发布在哪个主机名下?
应发布在客户端实际连接的主机名下。对于SMTP,是MX记录指向的主机名(如mx1.example.net),而不是邮件地址中的域名。如果主机名是CNAME,RFC 7671第7节规定在CNAME链整体通过DNSSEC验证时,客户端优先在CNAME展开后的最终主机名下查询TLSA,因此建议把记录放在最终A/AAAA记录所在的主机名下。