首页/安全/加密与证书速查/ALPN 应用层协议协商
TLS 与 HTTPS60 条

ALPN 应用层协议协商

RFC 7301 定义的扩展:在 TLS 握手中协商应用层协议(如 h2、http/1.1),避免额外往返;HTTP/2 强制使用 ALPN。

加密与证书速查安全更新于 2026-10-13

ALPN 是什么

ALPN(应用层协议协商,RFC 7301)让客户端在 TLS 握手阶段就告知自己支持的 HTTP 版本,服务端挑一个并在握手中确认,从而省掉一次额外的探测往返。HTTP/2 强制要求通过 ALPN 协商出 h2;HTTP/3 走 QUIC,用 h3 标识。整个过程对上层透明,所以配置缺失时往往没有任何报错,只是协议版本悄悄退回。

基本信息

标准RFC 7301
常见取值h2(HTTP/2)、http/1.1、h3(HTTP/3 经 QUIC)
作用在握手中确定应用层协议版本
启用方式Nginx 在 listen 上带 http2 参数,较新版本用 http2 on 指令
失败表现协商不一致时回退到 http/1.1 或产生握手告警
中间设备反向代理、负载均衡与 CDN 需正确透传协商结果

典型使用场景

  • 启用 HTTP/2:升级后必须确认协商出 h2,否则多路复用等收益无从体现
  • 排查「HTTP/2 没生效」:把命令行协商结果与浏览器表现对照
  • 网关与 CDN 排障:客户端看到的协议版本与源站不一致时先查这里
  • 灰度切换 HTTP/2 或 HTTP/3:按域名或 SNI 分批开启并观察协商情况

查看协商结果

查看协商结果
# 只声明 h2,观察服务端是否接受并回选
openssl s_client -connect example.com:443 -alpn h2 </dev/null 2>&1 | grep -i alpn
# 同时声明多个协议,观察最终选中哪一个
openssl s_client -connect example.com:443 -alpn 'h2,http/1.1' </dev/null 2>&1 | grep -i 'ALPN protocol'
# 从客户端侧确认实际使用的 HTTP 版本
curl -sI --http2 https://example.com | head -1

观察点与含义

现象含义处置
ALPN protocol: h2协商成功升级到 HTTP/2继续确认配置覆盖范围
ALPN protocol: http/1.1未选中 h2检查服务端是否启用了 h2 支持
No ALPN negotiated双方都没有进行协商客户端或服务端一侧未提供 ALPN
握手失败或告警协议组合不被接受核对 TLS 版本与套件要求
关闭 ALPN 或未配置会导致 HTTP/2 无法启用,浏览器会静默回退到 HTTP/1.1,性能优化随之失效。
协商失败通常是静默的:用户看不到报错,只会感觉变慢。把 ALPN 结果纳入例行巡检,比等故障上报更有效。
中间设备要单独验证:反向代理、负载均衡与 CDN 需要正确透传或重新发起协商,源站配置正确并不代表客户端能拿到 h2。

易错点

  • HTTP/2 与旧版 TLS 组合可能触发客户端拒绝(浏览器要求较新 TLS 版本与特定套件)
  • 网关或 CDN 未透传 ALPN,会让源站误判为 HTTP/1.1 请求
  • 只改服务端就以为升级完成,实际客户端或中间设备不支持,必须两侧验证
  • 关闭 ALPN 后性能优化失效却不易被发现,因为没有错误只有变慢
  • 排查时只看浏览器表现,不用命令行确认协商结果,容易把问题归错方向

数据来源与参考

  • RFC 7301(ALPN)
  • RFC 7540(HTTP/2)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌