# TLSA 记录（TLSA Record）是什么？

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

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

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](https://ssl.sh/zh/glossary/dnssec/) 签名、作为 [DANE](https://ssl.sh/zh/glossary/dane/) 的一部分时才有意义。

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

## 例子
```bash
# 选择器 1 + 匹配类型 1：公钥的 SHA-256
openssl x509 -in cert.pem -noout -pubkey \
  | openssl pkey -pubin -outform der \
  | openssl dgst -sha256 | awk '{print $2}'
```

```text
_25._tcp.mail.example.com. 3600 IN TLSA 3 1 1 <上面命令输出的 64 位十六进制>
```

也可以用 [TLSA 生成工具](https://ssl.sh/zh/tools/tlsa-generator/)直接从证书生成记录。

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

## 相关术语

- [DANE](https://ssl.sh/zh/glossary/dane/): DANE 是一种利用经 DNSSEC 签名的 TLSA 记录，把 TLS 服务器的证书或公钥与其域名绑定起来的协议。
- [DNSSEC](https://ssl.sh/zh/glossary/dnssec/): DNSSEC 是一组 DNS 扩展，让解析器能沿着从根区开始的签名链，验证 DNS 应答确实来自权威方且未被篡改。
- [STARTTLS](https://ssl.sh/zh/glossary/starttls/): STARTTLS 是一条协议命令，用于把 SMTP、IMAP、POP3 等协议中已建立的明文连接，在同一端口上升级为 TLS 加密连接。
- [公钥](https://ssl.sh/zh/glossary/public-key/): 公钥是非对称密钥对中可以公开的一半，写在证书里，供他人验证由对应私钥生成的签名。
- [证书指纹](https://ssl.sh/zh/glossary/certificate-fingerprint/): 证书指纹是对证书 DER 编码计算出的哈希值（通常用 SHA-256），用来唯一标识一张证书，它本身并不存储在证书里。
- [密钥轮换](https://ssl.sh/zh/glossary/key-rotation/): 密钥轮换是按计划或在安全事件后，用新生成的密钥替换旧密钥，以限制密钥泄露造成损失的做法。
