TLS/REALITY: Reclarify serverName and SNI details

This commit is contained in:
风扇滑翔翼
2025-12-19 02:40:18 +08:00
committed by GitHub
parent 841c05e9a5
commit 3acefe8200
+11 -11
View File
@@ -126,21 +126,19 @@ Reality 是目前最安全的传输加密方案, 且外部看来流量类型和
> `serverName`: string
指定服务器端证书的域名,在连接由 IP 建立时有用。
服务器名称,服务器端证书的 SAN 中需要包含该值,可以是域名或者 IP 地址。当为域名时将在 Client Hello 中的 SNI 扩展中发送,IP 地址则不会发送 SNI 扩展(SNI 扩展不允许包含 IP 地址)。如果填入 IPv6 要使用 `[]` 包裹
当留空时,自动使用address中的值(如果是域名),该值同时用于校验服务端证书是否有效
当留空时,自动使用 address 中的值(如果是域名)。
特殊值 `"FromMitM"`, 这会使其使用入来自 dokodemo-door 入站解密的 TLS 中包含的 SNI.
::: tip
如上所述,因为该值同时用于校验服务端证书是否有效,如果出于特殊目的将其修改为与服务端证书域名不一致的需要需要开启 `allowInsecure` 否则会导致证书认证失败。出于安全考虑我们不推荐长期使用这种方法,如果想要安全地伪造SNI,请考虑使用REALITY。
特别地,当客户端设置其为IP地址时,xray不会发送SNI,同样的要使用此功能也必须同时开启 `allowInsecure`
如上所述,因为该值用于校验服务端证书是否有效,如果出于特殊目的将其修改为与服务端证书域名不一致的需要需要开启 `allowInsecure` 否则会导致证书认证失败。出于安全考虑我们不推荐长期使用这种方法,如果想要安全地伪造SNI,请考虑使用REALITY。
:::
> `verifyPeerCertInNames`: \[ string \]
仅客户端,用于校验证书使用的 SNI 列表(只需要证书中有一个 SAN 在该列表中即可), 将会覆盖本用于校验的 `serverName`, 用于域前置等特殊目的。 相较于之前的修改 `serverName` 并开启 `allowInsecure` 更加安全,因为其仍会执行证书签名验证。
仅客户端,用于校验证书使用的 SNI 列表(只需要证书中有一个 SAN 在该列表中即可), 将会覆盖本用于校验的 `serverName`, 用于域前置等特殊目的。 相较于修改 `serverName` 并开启 `allowInsecure` 更加安全,因为其仍会执行证书签名验证。
特殊值 `"FromMitM"`, 这会使其额外加入来自 dokodemo-door 入站解密的 TLS 中包含的 SNI.
@@ -384,11 +382,13 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
> `serverNames` : \[string\]
必填,客户端可用的 `serverName` 列表,不支持 \* 通配符。
必填,客户端可用的 `serverName` 列表,不支持 \* 通配符。
一般与target保持一致即可,实际的可选值为服务器所接受的任何SNI(依据 target 本身的配置有所不同),一参考是所返回证书的 [SAN](https://zh.wikipedia.org/wiki/%E4%B8%BB%E9%A2%98%E5%A4%87%E7%94%A8%E5%90%8D%E7%A7%B0).
一般与 target 保持一致即可,实际的可选值为服务器所接受的任何 SNI(依据 target 本身的配置有所不同),一般是参考是所返回证书的 [SAN](https://zh.wikipedia.org/wiki/%E4%B8%BB%E9%A2%98%E5%A4%87%E7%94%A8%E5%90%8D%E7%A7%B0).
其中可包含空值 `""` 代表接受没有SNI的连接。
其中可包含空值 `""` 代表接受没有SNI的连接。使用此特性不要求 `target` 具有 IP 证书,只需确保在收到无 SNI 的 Client Hello 其不会拒绝连接。使用这一特性时客户端 `serverName` 不能为空,需要填入任意有效 IP 地址占位。
可以使用 `xray tls ping` 观察服务端对无 SNI 请求的响应行为。
> `privateKey` : string
@@ -461,9 +461,9 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
> `serverName` : string
服务端 serverNames 之一。
服务端 `serverNames` 之一。
当服务端 `serverNames` 中包含空值时,与 TLS 类似可以在客户端使用 `"serverName": "0.0.0.0"` 发起无SNI的连接。与TLS不同,REALITY使用这个功能并不需要开启也没有允许不安全选项。当使用此功能时请确保target在接受无SNI的连接时会返回默认证书
特别地,客户端可以将其设置为任意 IP 地址,Xray 将会发送无 SNI 扩展的 Client Hello. 要使用这一特性请确保服务端 `serverNames` 中包含空值 `""`
> `fingerprint` : string