From 9e921ce16c6bf63d7af188fc0102decbbe57aa42 Mon Sep 17 00:00:00 2001 From: Fangliding Date: Fri, 15 May 2026 23:41:30 +0800 Subject: [PATCH] TLS: Behavior of ALPN in uTLS --- docs/config/transports/tls.md | 11 ++++++++--- docs/en/config/transports/tls.md | 11 ++++++++--- docs/ru/config/transports/tls.md | 11 ++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/docs/config/transports/tls.md b/docs/config/transports/tls.md index 192e6b72..b8651aac 100644 --- a/docs/config/transports/tls.md +++ b/docs/config/transports/tls.md @@ -142,9 +142,14 @@ CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之 ::: ::: tip -当使用此功能时,TLS 的部分影响TLS指纹的选项将被 utls 库覆盖不再生效,列如ALPN。 -会被传递的参数有 -`"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"` +当使用此功能时,TLS 的部分影响TLS指纹的选项将被 utls 库覆盖不再生效。 +会被传递的参数有:`"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"` + +针对 ALPN 则有特殊行为。 + +默认强制使用最常见的 `h2,http/1.1` 作为 ALPN。对于 WebSocket 和 HttpUpgrade 传输则默认使用 `http/1.1`, 否则协商到 `h2` 会导致无法连接,但允许手动设置到 `h2,http/1.1`,如果确信服务器支持使用这个 ALPN 完成握手。 + +如果 ECH 启用,则 outer 无论如何都会显示为 `h2,http/1.1`,而 inner 如果是 WebSocket 或 HttpUpgrade 则会强制置 `http/1.1` 以便完成握手,其他协议则会尊重用户配置的 ALPN。 ::: > `pinnedPeerCertSha256`: string diff --git a/docs/en/config/transports/tls.md b/docs/en/config/transports/tls.md index fb5c12e6..2e13f18b 100644 --- a/docs/en/config/transports/tls.md +++ b/docs/en/config/transports/tls.md @@ -140,9 +140,14 @@ This feature only **simulates** the `TLS Client Hello` fingerprint. Behavior and ::: ::: tip -When this feature is enabled, some TLS options that affect TLS fingerprints are overridden by the uTLS library and stop taking effect, such as ALPN. -The parameters still passed through are: -`"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"` +When this feature is enabled, some TLS options that affect TLS fingerprints are overridden by the uTLS library and stop taking effect. +The parameters still passed through are: `"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"`. + +ALPN has special behavior. + +By default, the most common `h2,http/1.1` is forced as ALPN. For WebSocket and HttpUpgrade transports, `http/1.1` is used by default — otherwise negotiating to `h2` would prevent the connection from succeeding — but you may manually set it to `h2,http/1.1` if you are sure the server supports completing the handshake with this ALPN. + +If ECH is enabled, the outer ALPN is always shown as `h2,http/1.1`. The inner ALPN is forced to `http/1.1` for WebSocket or HttpUpgrade transports to allow the handshake to complete; for other protocols the user-configured ALPN is honored. ::: > `pinnedPeerCertSha256`: string diff --git a/docs/ru/config/transports/tls.md b/docs/ru/config/transports/tls.md index c8655c92..7966e0d4 100644 --- a/docs/ru/config/transports/tls.md +++ b/docs/ru/config/transports/tls.md @@ -140,9 +140,14 @@ TLS — это обычный механизм защиты транспорта ::: ::: tip -При использовании этой функции некоторые TLS-параметры, влияющие на отпечаток, будут перезаписаны библиотекой uTLS и перестанут действовать, например ALPN. -Параметры, которые все равно передаются: -`"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"` +При использовании этой функции некоторые TLS-параметры, влияющие на отпечаток, будут перезаписаны библиотекой uTLS и перестанут действовать. +Параметры, которые все равно передаются: `"serverName" "disableSystemRoot" "pinnedPeerCertSha256" "masterKeyLog"`. + +Для ALPN действует особое поведение. + +По умолчанию принудительно используется самый распространенный `h2,http/1.1`. Для транспортов WebSocket и HttpUpgrade по умолчанию используется `http/1.1`, иначе согласование `h2` приведет к невозможности подключения. При желании можно вручную установить `h2,http/1.1`, если вы уверены, что сервер поддерживает завершение рукопожатия с таким ALPN. + +Если включен ECH, внешний ALPN всегда отображается как `h2,http/1.1`. Внутренний ALPN для WebSocket и HttpUpgrade принудительно устанавливается в `http/1.1`, чтобы рукопожатие могло завершиться; для остальных протоколов соблюдается заданный пользователем ALPN. ::: > `pinnedPeerCertSha256`: string