(
固定服务器证书
Xray-core已经于26.2.6版本移除出站streamSettings→tlsSettings对象中的allowInsecure字段,被26.1.23版本推出的pinnedPeerCertSha256与verifyCertByName字段取代。此变更意味着Xray-core已经无法关闭对TLS证书的验证。
此更改将影响“服务器正在使用自签名证书”用户与部分机场节点用户(部分机场节点需求用户开启allowInsecure)。它并不意味着“完全禁止自签名证书”,而是提供1种更加安全的路径,以防止潜在的中间人攻击。
TLS证书的签发与验证
于“配置”部分之前,了解TLS证书的签发与验证流程,或许更易于理解呀。
当需要签发1个证书,首先需要自行生成1对密钥,即“私钥”与“公钥”;而后需要生成“证书签名请求(Certificate Signing Request)”(通常为.csr文件),并寻找1个“证书权威机构(Certificate Authority)”为它签名。“证书权威机构”将使用“请求”中的信息并附加其它信息(例如“证书过期时间”),根据以上信息生成散列值,再使用“证书权威机构”自身私钥对此散列值进行加密,与以上信息一同置入最终的“叶子证书(Leaf Certificate)”中(通常为.pem文件)。
当客户端需要验证1个证书时,它能够将证书信息与已签名的散列值分离,并计算前者的散列值,并根据自身所拥有“证书权威机构”的“根证书(Root Certificate)”/“中间证书(Intermediate Certificate)”验证(解密)后者,若能够解密且与前者的散列值匹配成功,则意味着验证成功。
配置
pinnedPeerCertSha256与verifyCertByName分别用于指定“单个或多个证书的SHA256散列值”与“叶子证书签发的域名”,它们是单独的字段,无需同时使用。
[!attention] 注意
对于前者,若服务器提供证书链,则对其中每个叶子证书进行验证,任意叶子证书的散列值匹配便意味着验证成功。若此字段包含根证书的散列值,将不再使用系统CA证书进行验证。
为使用pinnedPeerCertSha256,需要得知证书的SHA256。假设拥有任意类型证书cert.pem,可通过以下命令计算其散列值:
> xray tls leafCertHash --cert cert.pem
f4c9c39e7a0718d80b5b8eacf1d86d3d94ddd2f17a7ec127369352f8b9003e13
若本地没有存储证书而位于服务器(此处的示例域名为abc.edu),则可通过此命令得到其证书的散列值:
> xray tls ping abc.edu
TLS ping: abc.edu
Using IP: 18.244.214.51:443
-------------------
Pinging without SNI
Handshake failure: remote error: tls: handshake failure
-------------------
Pinging with SNI
Handshake succeeded
TLS Version: TLS 1.3
TLS Post-Quantum key exchange: true (X25519MLKEM768)
Certificate chain's total length: 3767 (certs count: 3)
Cert's signature algorithm: SHA256-RSA
Cert's publicKey algorithm: RSA
Cert's allowed domains: [abc.edu *.abc.edu]
Cert's leaf SHA256: e6ae979404739f57ed5400ed9afa6df4f5cc5e162d88a57c9e03e5670d1e9484
-------------------
TLS ping finished
通常地,只需使用Pinging with SNI中Cert's leaf SHA256后的散列值呀。
若需要固定多个证书,则需要使用,分隔:
{
"security": "tls",
"tlsSettings": {
"pinnedPeerCertSha256": "f4c9c39e7a0718d80b5b8eacf1d86d3d94ddd2f17a7ec127369352f8b9003e13,e6ae979404739f57ed5400ed9afa6df4f5cc5e162d88a57c9e03e5670d1e9484"
}
}
更改XHTTP填充查询参数名称
自26.2.6版本开始,Xray-core允许用户更改XHTTP传输方式中,URL中用于填充的查询参数名称,以防止部分CDN对XHTTP传输方式的检测(检查是否存在查询参数x_padding)。
此特性由俄罗斯贡献者@paqx提出,因为位于俄罗斯的部分CDN已经开始检测并封锁XHTTP传输方式:
paqx:
CDNVideo started to block any POST requests whose query string matches the patternx_padding=XXXXX. Also, some requests included an X-Padding header. Both the query param and header have a very unusual name and can be easily spotted.CDNVideo已经开始封锁 包含
x_padding=XXXXX...查询参数模式的POST请求,以及包含X-Padding请求头的请求。它们两者均拥有十分不常见的名称。
配置
于xhttpSettings→extra对象中配置xPaddingQueryParam即可:
{
"network": "xhttp",
"xhttpSettings": {
"extra": {
"xPaddingQueryParam": "password"
}
}
}
路由规则缓存
Xray-core于26.2.6版本允许预先构建路由规则缓存,并于实际路由规则匹配中使用缓存,而非于Xray-core开启时构建。基本上,“使用缓存”能够减少Xray-core的内存占用,对于大规模路由规则与大型GeoSite文件尤为显著。
该特性主要考虑路由器与iOS操作系统,前者通常仅拥有少量内存,而后者赋予Network Extension进程的内存极其有限(iOS 15前为15MB,iOS 15后为50MB)。
使用
以如下示例配置文件开始:
{
"log": {
"loglevel": "info"
},
"dns": {
"hosts": {
"doh.pub": [
"1.12.12.12",
"120.53.53.53"
],
"dns.cloudflare.com": [
"1.1.1.1",
"1.0.0.1",
"2606:4700:4700::1111",
"2606:4700:4700::1001"
],
"dns.google": [
"8.8.8.8",
"8.8.4.4",
"2001:4860:4860::8888",
"2001:4860:4860::8844"
]
},
"servers": [
{
"tag": "doh_pub",
"address": "https://doh.pub/dns-query",
"domains": [
"geosite:cn"
],
"expectedIPs": [
"geoip:cn"
]
},
{
"tag": "dns_cloudflare_com",
"address": "https://dns.cloudflare.com/dns-query"
},
{
"tag": "dns_google",
"address": "https://dns.google/dns-query"
}
],
"enableParallelQuery": true
},
"routing": {
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "freedom"
},
{
"ruleTag": "direct_domains_local_ips_resolved",
"type": "field",
"domain": [
"geosite:private"
],
"outboundTag": "freedom"
},
{
"type": "field",
"network": "udp",
"port": 443,
"outboundTag": "blackhole"
},
{
"ruleTag": "block_ad_domains",
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "blackhole"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "freedom"
},
{
"ruleTag": "direct_china_domains",
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "freedom"
}
]
},
"outbounds": [
{
"tag": "freedom",
"protocol": "freedom"
},
{
"tag": "blackhole",
"protocol": "blackhole"
}
]
}
应当能够注意到,所有包含domain数组的路由规则已经被ruleTag字段命名,而所有DNS服务器亦被tag字段命名,此步骤是使用与构建缓存之前必要的。
使用此命令,从配置文件config.json构建GeoSite缓存至domain.cache文件:
xray buildMphCache -c config.json -o domain.cache
欲使用缓存,需要于XRAY_MPH_CACHE环境变量指定domain.cache的路径(相对路径的起点为Xray-core所在文件夹):
export XRAY_MPH_CACHE="/home/xray/domain.cache"
# $env:XRAY_MPH_CACHE="C:/ProgramData/xray-core/domain.cache"
而后启动Xray-core便可呀。
)