From cb0714665707691fff9a160ab806e872ca371217 Mon Sep 17 00:00:00 2001 From: superabbite1 <79433125+superabbite1@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:35:44 +0800 Subject: [PATCH 1/3] Update General.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vless+ws+tls协议新增fingerprint指纹参数;v2rayN新增tuic协议订阅 --- app/Protocols/General.php | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/app/Protocols/General.php b/app/Protocols/General.php index 9945926..bf8ad72 100644 --- a/app/Protocols/General.php +++ b/app/Protocols/General.php @@ -18,6 +18,7 @@ class General extends AbstractProtocol Server::TYPE_TROJAN, Server::TYPE_HYSTERIA, Server::TYPE_SOCKS, + Server::TYPE_TUIC, ]; protected $protocolRequirements = [ @@ -39,6 +40,7 @@ class General extends AbstractProtocol Server::TYPE_TROJAN => self::buildTrojan($item['password'], $item), Server::TYPE_HYSTERIA => self::buildHysteria($item['password'], $item), Server::TYPE_SOCKS => self::buildSocks($item['password'], $item), + Server::TYPE_TUIC => self::buildTuic($item['password'], $item), default => '', }; } @@ -135,6 +137,7 @@ class General extends AbstractProtocol $config['security'] = "tls"; if ($serverName = data_get($protocol_settings, 'tls_settings.server_name')) { $config['sni'] = $serverName; + $config['fp'] = Helper::getRandFingerprint(); } break; case 2: //reality @@ -254,6 +257,59 @@ class General extends AbstractProtocol return $uri; } + + + public static function buildTuic($password, $server) + { + $protocol_settings = data_get($server, 'protocol_settings', []); + $name = rawurlencode($server['name']); + $addr = Helper::wrapIPv6($server['host']); + $port = $server['port']; + $uuid = $password; // v2rayN格式里,uuid和password都是密码部分 + $pass = $password; + + $queryParams = []; + + // 填充sni参数 + if ($sni = data_get($protocol_settings, 'tls.server_name')) { + $queryParams['sni'] = $sni; + } + + // alpn参数,支持多值时用逗号连接 + if ($alpn = data_get($protocol_settings, 'alpn')) { + if (is_array($alpn)) { + $queryParams['alpn'] = implode(',', $alpn); + } else { + $queryParams['alpn'] = $alpn; + } + } + + // congestion_controller参数,默认cubic + $congestion = data_get($protocol_settings, 'congestion_control', 'cubic'); + $queryParams['congestion_control'] = $congestion; + + // udp_relay_mode参数,默认native + $udpRelay = data_get($protocol_settings, 'udp_relay_mode', 'native'); + $queryParams['udp-relay-mode'] = $udpRelay; + + $query = http_build_query($queryParams); + + // 构造完整URI,格式: + // Tuic://uuid:password@host:port?sni=xxx&alpn=xxx&congestion_controller=xxx&udp_relay_mode=xxx#别名 + $uri = "tuic://{$uuid}:{$pass}@{$addr}:{$port}"; + + if (!empty($query)) { + $uri .= "?{$query}"; + } + + $uri .= "#{$name}\r\n"; + + return $uri; + } + + + + public static function buildSocks($password, $server) { From 3406448475c2a25a9bd90bd2fc06dcdfe000f3b2 Mon Sep 17 00:00:00 2001 From: superabbite1 <79433125+superabbite1@users.noreply.github.com> Date: Tue, 9 Sep 2025 16:42:11 +0800 Subject: [PATCH 2/3] Update ClashMeta.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增vless+ws+tls协议Fingerprint指纹参数 --- app/Protocols/ClashMeta.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Protocols/ClashMeta.php b/app/Protocols/ClashMeta.php index 3fc1b10..f356c76 100644 --- a/app/Protocols/ClashMeta.php +++ b/app/Protocols/ClashMeta.php @@ -309,6 +309,7 @@ class ClashMeta extends AbstractProtocol if ($serverName = data_get($protocol_settings, 'tls_settings.server_name')) { $array['servername'] = $serverName; } + $array['client-fingerprint'] = Helper::getRandFingerprint(); break; case 2: $array['tls'] = true; From fa4a84b3e2f52614397da6ae31564d2dc189aae0 Mon Sep 17 00:00:00 2001 From: superabbite1 <79433125+superabbite1@users.noreply.github.com> Date: Tue, 9 Sep 2025 16:43:42 +0800 Subject: [PATCH 3/3] Update Shadowrocket.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增Vless+ws+tls协议 Fingerprint指纹参数 --- app/Protocols/Shadowrocket.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Protocols/Shadowrocket.php b/app/Protocols/Shadowrocket.php index 7fdf5fc..655bbbe 100644 --- a/app/Protocols/Shadowrocket.php +++ b/app/Protocols/Shadowrocket.php @@ -165,6 +165,7 @@ class Shadowrocket extends AbstractProtocol if ($serverName = data_get($protocol_settings, 'tls_settings.server_name')) { $config['peer'] = $serverName; } + $config['fp'] = Helper::getRandFingerprint(); break; case 2: $config['tls'] = 1;