TLS-ALPN-01 (TLS-ALPN-01 验证)
定义
TLS-ALPN-01 是一种 ACME 验证方式,服务器在 443 端口针对 acme-tls/1 协议出示一张特殊证书来证明域名控制权。
TLS-ALPN-01 由 RFC 8737 定义,在 TLS 握手内部完成域名验证。CA 连接 443 端口,SNI 设为待验证域名,ALPN 只提供 acme-tls/1 这一个协议。服务器必须返回一张针对该域名的自签名证书,其中包含一个关键(critical)的 acmeIdentifier 扩展,取值是密钥授权内容的 SHA-256 摘要。整个过程不发出任何 HTTP 请求。
为什么重要
TLS-ALPN-01 适合自己终结 TLS、又不能或不想开放 80 端口的软件,例如 Caddy、Traefik 等反向代理。由于质询依托的是浏览器永远不会请求的协议名,它不会干扰正常流量。它取代了早期的 TLS-SNI-01,后者在共享主机环境下被证明不安全而停用。与 HTTP-01 一样,它不能验证通配符证书。国内网站前面若套了 CDN,443 端口由 CDN 节点终结 TLS,源站就无法用这种方式验证。
例子
# 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 正是为规避其缺陷而设计的。