Skip to content

TLS — Xray-core

Xray 的 TLS 设置位于 streamSettings.tlsSettings 之下,前提是 streamSettings.security"tls"。该结构体还涵盖 ECH 与 uTLS 指纹家族。REALITY 见 REALITY —— 它是与 TLS 并列的 另一种 streamSettings.security 值,拥有自己的块。

TLS 设置

字段类型默认值允许值描述
allowInsecureboolfalsetrue | false跳过服务端证书校验。仅供测试使用 —— 生产配置绝不应启用。
certificates[]*TLSCertConfig[][TLSCertConfig]服务端证书(入站)或受信 CA 校验(出站)。多条目可在入站启用按 SNI 选择证书。
serverNamestring(inferred)<hostname>期望的服务器名。出站时作为发送的 SNI,并用作校验对端 leaf 证书的依据。入站时为 ACME 自动配证时使用的 SNI。
alpn*StringList["h2", "http/1.1"]<ALPN string>向对端宣告的应用层协议协商列表。
enableSessionResumptionboolfalsetrue | false启用 TLS session-ticket 复用(客户端侧)。
disableSystemRootboolfalsetrue | false忽略操作系统根 CA 集合。为 true 时只接受 `verify` 模式下的 `certificates` 条目。
minVersionstring1.21.0 | 1.1 | 1.2 | 1.3可接受的最低 TLS 版本。
maxVersionstring1.31.0 | 1.1 | 1.2 | 1.3可接受的最高 TLS 版本。
cipherSuitesstring(library default)<comma-separated cipher list>覆盖加密套件列表,使用 OpenSSL 风格名(如 `TLS_AES_128_GCM_SHA256:...`)。注意:TLS 1.3 会忽略此字段 —— 仅 TLS 1.2 的加密选择可配置。
fingerprintstring(unset)chrome | firefox | safari | edge | 360 | qq | ios | android | random | randomizeduTLS ClientHello 指纹。会驱动整个 ClientHello 的形态(加密套件、扩展、签名算法),覆盖显式的 `cipherSuites` 字段。
rejectUnknownSniboolfalsetrue | false入站 —— 拒绝 SNI 不匹配任何已配置证书的 TLS 连接。
curvePreferences*StringList(library default)X25519 | P-256 | P-384 | P-521 | X25519MLKEM768覆盖密钥交换曲线偏好列表。顺序敏感。
masterKeyLogstring(unset)<file path>用于抓取 TLS 密钥的 SSLKEYLOGFILE 风格路径(供 Wireshark 解密)。生产环境切勿启用。
pinnedPeerCertSha256string(unset)<base64 SHA-256>锚定对端证书。仅出站 —— leaf 证书的 SHA-256 不匹配则拒绝连接。
verifyPeerCertByNamestring(unset)<hostname>设置后,按该名称校验对端证书的 Subject CN / SAN,而不按 `serverName`。SNI 与规范证书名不同时(REALITY 形态)很有用。
verifyPeerCertInNames[]string[][<hostname>]`verifyPeerCertByName` 的列表形式 —— 列表中任一名称匹配即接受。
echServerKeysstring(unset)<base64 ECHConfigList>入站 —— ECH 服务端密钥集合。
echConfigListstring(unset)<base64 ECHConfigList>出站 —— 锚定的 ECH 配置列表。未设置时通过 HTTPS-record DNS 查询自动发现。
echForceQuerystring(unset)hkdf | dns强制使用特定的 ECH 发现机制。为空则按默认级联回落。
echSockopt*SocketConfig(unset)SocketConfig应用于 ECH 发现 DNS 请求的套接字选项。

源码: infra/conf/transport_internet.go:638-659 · 锚定版本 v26.6.1 (94ffd50)

certificates[]

字段类型默认值允许值描述
certificateFilestring(unset)<PEM file path>PEM 证书文件路径。与 `certificate` 互斥。
certificate[]string(unset)[<PEM line>]内联 PEM 证书,字符串数组形式(每行一个元素,或整个 PEM 作为一个元素)。
keyFilestring(unset)<PEM file path>PEM 私钥文件路径。
key[]string(unset)[<PEM line>]内联 PEM 私钥。
usagestringenciphermentencipherment | verify | issue证书用途:`encipherment`(服务端证书)、`verify`(用于校验对端的受信 CA)、`issue`(在部分转发模式中用作签发每连接证书的 CA)。
ocspStaplinguint643600<seconds>OCSP staple 刷新频率(秒)。0 关闭。
oneTimeLoadingboolfalsetrue | false启动时只读取一次证书与密钥,而不在重载时再次读取。使用内联 `certificate` / `key` 时自动置 true(没有可重读的路径)。
buildChainboolfalsetrue | falsePEM 只含 leaf 时,自动拉取中间 CA 拼接完整链。

源码: infra/conf/transport_internet.go:569-578 · 锚定版本 v26.6.1 (94ffd50)

示例

出站 —— 校验系统根证书、强制 TLS 1.3、锚定 chrome 指纹:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "alpn": ["h2", "http/1.1"],
      "minVersion": "1.3",
      "maxVersion": "1.3",
      "fingerprint": "chrome"
    }
  }
}

入站 —— 部署 Let's Encrypt 证书:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "certificates": [
        {
          "certificateFile": "/etc/ssl/cert.pem",
          "keyFile": "/etc/ssl/key.pem",
          "usage": "encipherment",
          "ocspStapling": 3600
        }
      ],
      "rejectUnknownSni": true
    }
  }
}

锚定证书的出站(绑定到特定 SHA-256):

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "pinnedPeerCertSha256": "<base64-SHA256-of-leaf-cert>"
    }
  }
}

说明

  • fingerprint 走的是 uTLS —— 它会重写整个 ClientHello 来模拟 所选浏览器。设置后 cipherSuitescurvePreferencesminVersion / maxVersion 大多会被忽略,因为 uTLS 自己控制这些。
  • 按 Go 标准库,TLS 1.3 会忽略 cipherSuites —— 只有 TLS 1.2 的加密 选择可配置。要在 TLS 1.3 中影响密钥交换,请使用 curvePreferences
  • certificates[].usage 字段很关键:
    • encipherment —— 普通服务端证书。
    • verify —— 出站侧作为受信 CA 根使用。配合 disableSystemRoot: true 可忽略系统根证书。
    • issue —— 在部分转发模式(MITM HTTPS 直通)中用于签发每连接 证书。
  • verifyPeerCertByName 把 SNI 与被校验的名称解耦 —— 在 REALITY 风 格部署中(SNI 是公共站点而真实证书属于 Xray 服务器时)很有用。
  • masterKeyLog 是调试辅助;文件格式遵循 Wireshark 接受的 SSLKEYLOGFILE 规范。生产环境切勿启用。

跨内核说明

  • sing-box 在每个入站 / 出站上内嵌单一的 tls: { ... } 块。 字段名采用 snake_case(server_namecipher_suites),REALITY / ECH / uTLS 以嵌套子块形式存在。参见 TLS — sing-box
  • mihomo 把 TLS 字段直接散布到每个 proxy 适配器上 —— tlssnialpnskip-cert-verify 等。没有集中化的 TLS 块。参见 TLS — mihomo

源码: infra/conf/transport_internet.go:569-659 · v26.6.1 (94ffd50)

由 Argsment 出品的 Core Tutorial