# TLS-ALPN-01是什么？定义、例子与常见误区

> TLS-ALPN-01 是一种 ACME 验证方式，服务器在 443 端口针对 acme-tls/1 协议出示一张特殊证书来证明域名控制权。

Source: https://ssl.sh/zh/glossary/tls-alpn-01/
Last updated: 2026-11-10

TLS-ALPN-01 由 [RFC 8737](https://www.rfc-editor.org/rfc/rfc8737) 定义，在 TLS 握手内部完成域名验证。CA 连接 443 端口，SNI 设为待验证域名，[ALPN](https://ssl.sh/zh/glossary/alpn/) 只提供 acme-tls/1 这一个协议。服务器必须返回一张针对该域名的自签名证书，其中包含一个关键（critical）的 acmeIdentifier 扩展，取值是密钥授权内容的 SHA-256 摘要。整个过程不发出任何 HTTP 请求。

## 为什么重要
TLS-ALPN-01 适合自己终结 TLS、又不能或不想开放 80 端口的软件，例如 Caddy、Traefik 等[反向代理](https://ssl.sh/zh/glossary/reverse-proxy/)。由于质询依托的是浏览器永远不会请求的协议名，它不会干扰正常流量。它取代了早期的 TLS-SNI-01，后者在共享主机环境下被证明不安全而停用。与 [HTTP-01](https://ssl.sh/zh/glossary/http-01/) 一样，它不能验证通配符证书。国内网站前面若套了 CDN，443 端口由 CDN 节点终结 TLS，源站就无法用这种方式验证。

## 例子
```bash
# acme.sh 独立 ALPN 模式（验证期间 443 端口需空闲）
acme.sh --issue --alpn -d example.com

# 查看服务器针对质询协议返回什么
openssl s_client -connect example.com:443 -servername example.com -alpn acme-tls/1 </dev/null
```

## 常见误区
- **经过任何 CDN 或负载均衡都能用。** 必须由在 443 端口终结 TLS 的那台设备亲自应答，前面套了 CDN 通常就不行。
- **Certbot 开箱即用支持它。** Certbot 的标准插件使用 HTTP-01 和 DNS-01；TLS-ALPN-01 主要见于 Caddy、Traefik、lego 和 acme.sh 等客户端。
- **TLS-ALPN-01 就是 TLS-SNI-01。** TLS-SNI-01 因不安全已被淘汰，TLS-ALPN-01 正是为规避其缺陷而设计的。

## 相关术语

- [ACME](https://ssl.sh/zh/glossary/acme/): ACME 是 IETF 标准协议（RFC 8555），让软件自动向 CA 证明域名控制权，并自动申请、续期和吊销证书。
- [ALPN](https://ssl.sh/zh/glossary/alpn/): ALPN 是一个 TLS 扩展，让客户端和服务器在握手过程中直接商定上层协议，例如 h2 或 http/1.1，不需要额外往返。
- [HTTP-01](https://ssl.sh/zh/glossary/http-01/): HTTP-01 是一种 ACME 验证方式，客户端通过 80 端口以普通 HTTP 提供 CA 指定的令牌内容来证明域名控制权。
- [DNS-01](https://ssl.sh/zh/glossary/dns-01/): DNS-01 是一种 ACME 验证方式，客户端在 _acme-challenge 子域名下发布由 CA 质询计算出的 TXT 记录来证明域名控制权。
- [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/): TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。
- [DCV](https://ssl.sh/zh/glossary/dcv/): DCV 即域名控制权验证，是 CA 在签发证书前确认申请者确实控制证书中每一个域名的检查。
- [反向代理](https://ssl.sh/zh/glossary/reverse-proxy/): 反向代理是代表后端服务器接收客户端连接、再把请求转发给后端的服务器，通常同时承担 TLS 终止。
