diff --git a/backend/package.json b/backend/package.json index 4ba089389b..1e15b47de7 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.85", + "version": "2.14.86", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/parsers/peggy/qx.js b/backend/src/core/proxy-utils/parsers/peggy/qx.js index c99545db69..9fefcb475b 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/qx.js +++ b/backend/src/core/proxy-utils/parsers/peggy/qx.js @@ -43,13 +43,13 @@ start = (trojan/shadowsocks/vmess/http/socks5) { } trojan = "trojan" equals address - (password/over_tls/tls_host/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { + (password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { proxy.type = "trojan"; handleObfs(); } shadowsocks = "shadowsocks" equals address - (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { + (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { if (proxy.protocol) { proxy.type = "ssr"; // handle ssr obfs @@ -80,7 +80,7 @@ shadowsocks = "shadowsocks" equals address } vmess = "vmess" equals address - (uuid/method/over_tls/tls_host/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { + (uuid/method/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { proxy.type = "vmess"; proxy.cipher = proxy.cipher || "none"; if (proxy.aead) { @@ -92,12 +92,12 @@ vmess = "vmess" equals address } http = "http" equals address - (username/password/over_tls/tls_host/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ + (username/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ proxy.type = "http"; } socks5 = "socks5" equals address - (username/password/password/over_tls/tls_host/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { + (username/password/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { proxy.type = "socks5"; } @@ -155,6 +155,14 @@ tls_verification = comma "tls-verification" equals flag:bool { proxy["skip-cert-verify"] = !flag; } tls_fingerprint = comma "tls-cert-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } +tls_pubkey_sha256 = comma "tls-pubkey-sha256" equals param:$[^=,]+ { proxy["tls-pubkey-sha256"] = param; } +tls_alpn = comma "tls-alpn" equals param:$[^=,]+ { proxy["tls-alpn"] = param; } +tls_no_session_ticket = comma "tls-no-session-ticket" equals flag:bool { + proxy["tls-no-session-ticket"] = flag; +} +tls_no_session_reuse = comma "tls-no-session-reuse" equals flag:bool { + proxy["tls-no-session-reuse"] = flag; +} obfs_ss = comma "obfs" equals type:("http"/"tls"/"wss"/"ws"/"over-tls") { obfs.type = type; return type; } obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; return type; } diff --git a/backend/src/core/proxy-utils/parsers/peggy/qx.peg b/backend/src/core/proxy-utils/parsers/peggy/qx.peg index 6e98db747d..4ff940c852 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/qx.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/qx.peg @@ -41,13 +41,13 @@ start = (trojan/shadowsocks/vmess/http/socks5) { } trojan = "trojan" equals address - (password/over_tls/tls_host/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { + (password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/obfs/obfs_host/obfs_uri/tag/udp_relay/udp_over_tcp/fast_open/server_check_url/others)* { proxy.type = "trojan"; handleObfs(); } shadowsocks = "shadowsocks" equals address - (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { + (password/method/obfs_ssr/obfs_ss/obfs_host/obfs_uri/ssr_protocol/ssr_protocol_param/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/udp_relay/udp_over_tcp/fast_open/tag/server_check_url/others)* { if (proxy.protocol) { proxy.type = "ssr"; // handle ssr obfs @@ -78,7 +78,7 @@ shadowsocks = "shadowsocks" equals address } vmess = "vmess" equals address - (uuid/method/over_tls/tls_host/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { + (uuid/method/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/obfs/obfs_host/obfs_uri/udp_relay/udp_over_tcp/fast_open/aead/server_check_url/others)* { proxy.type = "vmess"; proxy.cipher = proxy.cipher || "none"; if (proxy.aead) { @@ -90,12 +90,12 @@ vmess = "vmess" equals address } http = "http" equals address - (username/password/over_tls/tls_host/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ + (username/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)*{ proxy.type = "http"; } socks5 = "socks5" equals address - (username/password/password/over_tls/tls_host/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { + (username/password/password/over_tls/tls_host/tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint/tls_verification/tag/fast_open/udp_relay/udp_over_tcp/server_check_url/others)* { proxy.type = "socks5"; } @@ -152,7 +152,15 @@ tls_host = comma "tls-host" equals sni:domain { proxy.sni = sni; } tls_verification = comma "tls-verification" equals flag:bool { proxy["skip-cert-verify"] = !flag; } -tls_fingerprint = comma "tls-cert-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); } +tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint = comma "tls-cert-sha256" equals tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_pubkey_sha256/tls_alpn/tls_no_session_ticket/tls_no_session_reuse/tls_fingerprint.trim(); } +tls_pubkey_sha256 = comma "tls-pubkey-sha256" equals param:$[^=,]+ { proxy["tls-pubkey-sha256"] = param; } +tls_alpn = comma "tls-alpn" equals param:$[^=,]+ { proxy["tls-alpn"] = param; } +tls_no_session_ticket = comma "tls-no-session-ticket" equals flag:bool { + proxy["tls-no-session-ticket"] = flag; +} +tls_no_session_reuse = comma "tls-no-session-reuse" equals flag:bool { + proxy["tls-no-session-reuse"] = flag; +} obfs_ss = comma "obfs" equals type:("http"/"tls"/"wss"/"ws"/"over-tls") { obfs.type = type; return type; } obfs_ssr = comma "obfs" equals type:("plain"/"http_simple"/"http_post"/"random_head"/"tls1.2_ticket_auth"/"tls1.2_ticket_fastauth") { obfs.type = type; return type; } diff --git a/backend/src/core/proxy-utils/producers/qx.js b/backend/src/core/proxy-utils/producers/qx.js index a00d984760..614f67aba0 100644 --- a/backend/src/core/proxy-utils/producers/qx.js +++ b/backend/src/core/proxy-utils/producers/qx.js @@ -63,6 +63,19 @@ function shadowsocks(proxy) { } if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); // tls fingerprint appendIfPresent( `,tls-cert-sha256=${proxy['tls-fingerprint']}`, @@ -165,6 +178,19 @@ function trojan(proxy) { } if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); // tls fingerprint appendIfPresent( `,tls-cert-sha256=${proxy['tls-fingerprint']}`, @@ -248,6 +274,19 @@ function vmess(proxy) { } if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); // tls fingerprint appendIfPresent( `,tls-cert-sha256=${proxy['tls-fingerprint']}`, @@ -303,6 +342,19 @@ function http(proxy) { appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); // tls fingerprint appendIfPresent( `,tls-cert-sha256=${proxy['tls-fingerprint']}`, @@ -351,6 +403,19 @@ function socks5(proxy) { appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); if (needTls(proxy)) { + appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + appendIfPresent(`,tls-alpn=${proxy['tls-alpn']}`, 'tls-alpn'); + appendIfPresent( + `,tls-no-session-ticket=${proxy['tls-no-session-ticket']}`, + 'tls-no-session-ticket', + ); + appendIfPresent( + `,tls-no-session-reuse=${proxy['tls-no-session-reuse']}`, + 'tls-no-session-reuse', + ); // tls fingerprint appendIfPresent( `,tls-cert-sha256=${proxy['tls-fingerprint']}`,