Skip to content

Commit 5132947

Browse files
committed
feat: Surfboard 支持 block-quic, server-cert-fingerprint-sha256, Snell version 4/5; 优化 Surge, Surfboard TLS 相关字段
1 parent 9da0630 commit 5132947

4 files changed

Lines changed: 348 additions & 137 deletions

File tree

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sub-store",
3-
"version": "2.24.8",
3+
"version": "2.24.9",
44
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket.",
55
"main": "src/main.js",
66
"packageManager": "pnpm@11.0.9",

backend/src/core/proxy-utils/producers/surfboard.js

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ function hasNonBlankValue(value) {
88
return value != null && `${value}`.trim().length > 0;
99
}
1010

11+
function appendTlsProxyParams(result, proxy, enabled = true) {
12+
if (!enabled) {
13+
return;
14+
}
15+
16+
result.appendIfPresent(
17+
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
18+
'tls-fingerprint',
19+
);
20+
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
21+
result.appendIfPresent(
22+
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
23+
'skip-cert-verify',
24+
);
25+
}
26+
1127
export default function Surfboard_Producer() {
1228
const produce = (proxy) => {
1329
if (
@@ -77,11 +93,7 @@ function hysteria2(proxy) {
7793
}
7894

7995
// tls verification
80-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
81-
result.appendIfPresent(
82-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
83-
'skip-cert-verify',
84-
);
96+
appendTlsProxyParams(result, proxy);
8597

8698
// download-bandwidth
8799
result.appendIfPresent(
@@ -92,6 +104,8 @@ function hysteria2(proxy) {
92104
// udp
93105
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
94106

107+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
108+
95109
return result.toString();
96110
}
97111
function anytls(proxy) {
@@ -100,11 +114,7 @@ function anytls(proxy) {
100114
result.appendIfPresent(`,password="${proxy.password}"`, 'password');
101115

102116
// tls verification
103-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
104-
result.appendIfPresent(
105-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
106-
'skip-cert-verify',
107-
);
117+
appendTlsProxyParams(result, proxy);
108118

109119
// tfo
110120
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -115,10 +125,15 @@ function anytls(proxy) {
115125
// reuse
116126
result.appendIfPresent(`,reuse=${proxy['reuse']}`, 'reuse');
117127

128+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
129+
118130
return result.toString();
119131
}
120132
function snell(proxy) {
121-
if (proxy.version > 3) {
133+
if (
134+
isPresent(proxy, 'version') &&
135+
![1, 2, 3, 4, 5].includes(Number(proxy.version))
136+
) {
122137
throw new Error(
123138
`Platform ${targetPlatform} does not support snell version ${proxy.version}`,
124139
);
@@ -150,6 +165,8 @@ function snell(proxy) {
150165
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
151166
}
152167

168+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
169+
153170
return result.toString();
154171
}
155172
function shadowsocks(proxy) {
@@ -206,6 +223,8 @@ function shadowsocks(proxy) {
206223
// udp
207224
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
208225

226+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
227+
209228
return result.toString();
210229
}
211230

@@ -221,18 +240,16 @@ function trojan(proxy) {
221240
result.appendIfPresent(`,tls=${proxy.tls}`, 'tls');
222241

223242
// tls verification
224-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
225-
result.appendIfPresent(
226-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
227-
'skip-cert-verify',
228-
);
243+
appendTlsProxyParams(result, proxy);
229244

230245
// tfo
231246
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
232247

233248
// udp
234249
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
235250

251+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
252+
236253
return result.toString();
237254
}
238255

@@ -255,15 +272,13 @@ function vmess(proxy) {
255272
result.appendIfPresent(`,tls=${proxy.tls}`, 'tls');
256273

257274
// tls verification
258-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
259-
result.appendIfPresent(
260-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
261-
'skip-cert-verify',
262-
);
275+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
263276

264277
// udp
265278
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
266279

280+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
281+
267282
return result.toString();
268283
}
269284

@@ -275,15 +290,13 @@ function http(proxy) {
275290
result.appendIfPresent(`,${proxy.password}`, 'password');
276291

277292
// tls verification
278-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
279-
result.appendIfPresent(
280-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
281-
'skip-cert-verify',
282-
);
293+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
283294

284295
// udp
285296
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
286297

298+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
299+
287300
return result.toString();
288301
}
289302

@@ -295,15 +308,13 @@ function socks5(proxy) {
295308
result.appendIfPresent(`,${proxy.password}`, 'password');
296309

297310
// tls verification
298-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
299-
result.appendIfPresent(
300-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
301-
'skip-cert-verify',
302-
);
311+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
303312

304313
// udp
305314
result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp');
306315

316+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
317+
307318
return result.toString();
308319
}
309320

@@ -317,6 +328,8 @@ function wireguard(proxy) {
317328
'section-name',
318329
);
319330

331+
result.appendIfPresent(`,block-quic=${proxy['block-quic']}`, 'block-quic');
332+
320333
return result.toString();
321334
}
322335

backend/src/core/proxy-utils/producers/surge.js

Lines changed: 23 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,20 @@ function hasNonBlankValue(value) {
4848
return value != null && `${value}`.trim().length > 0;
4949
}
5050

51-
function appendClientCert(result, proxy) {
51+
function appendTlsProxyParams(result, proxy, enabled = true) {
52+
if (!enabled) {
53+
return;
54+
}
55+
56+
result.appendIfPresent(
57+
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
58+
'tls-fingerprint',
59+
);
60+
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
61+
result.appendIfPresent(
62+
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
63+
'skip-cert-verify',
64+
);
5265
const clientCert = isPresent(proxy, 'keystore-client-cert')
5366
? proxy['keystore-client-cert']
5467
: proxy['client-cert'];
@@ -312,19 +325,8 @@ function trojan(proxy) {
312325
// tls
313326
result.appendIfPresent(`,tls=${proxy.tls}`, 'tls');
314327

315-
// tls fingerprint
316-
result.appendIfPresent(
317-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
318-
'tls-fingerprint',
319-
);
320-
321328
// tls verification
322-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
323-
result.appendIfPresent(
324-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
325-
'skip-cert-verify',
326-
);
327-
appendClientCert(result, proxy);
329+
appendTlsProxyParams(result, proxy);
328330

329331
// tfo
330332
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -390,19 +392,8 @@ function anytls(proxy) {
390392
'no-error-alert',
391393
);
392394

393-
// tls fingerprint
394-
result.appendIfPresent(
395-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
396-
'tls-fingerprint',
397-
);
398-
399395
// tls verification
400-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
401-
result.appendIfPresent(
402-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
403-
'skip-cert-verify',
404-
);
405-
appendClientCert(result, proxy);
396+
appendTlsProxyParams(result, proxy);
406397

407398
// tfo
408399
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -463,19 +454,8 @@ function trusttunnel(proxy) {
463454
'no-error-alert',
464455
);
465456

466-
// tls fingerprint
467-
result.appendIfPresent(
468-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
469-
'tls-fingerprint',
470-
);
471-
472457
// tls verification
473-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
474-
result.appendIfPresent(
475-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
476-
'skip-cert-verify',
477-
);
478-
appendClientCert(result, proxy);
458+
appendTlsProxyParams(result, proxy);
479459

480460
// tfo
481461
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -536,16 +516,7 @@ function h2Connect(proxy) {
536516
'no-error-alert',
537517
);
538518

539-
result.appendIfPresent(
540-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
541-
'tls-fingerprint',
542-
);
543-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
544-
result.appendIfPresent(
545-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
546-
'skip-cert-verify',
547-
);
548-
appendClientCert(result, proxy);
519+
appendTlsProxyParams(result, proxy);
549520

550521
if (proxy.tfo) {
551522
$.info(`Option tfo is not supported by Surge, thus omitted`);
@@ -619,22 +590,11 @@ function vmess(proxy, includeUnsupportedProxy) {
619590
result.append(`,vmess-aead=${proxy.alterId === 0}`);
620591
}
621592

622-
// tls fingerprint
623-
result.appendIfPresent(
624-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
625-
'tls-fingerprint',
626-
);
627-
628593
// tls
629594
result.appendIfPresent(`,tls=${proxy.tls}`, 'tls');
630595

631596
// tls verification
632-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
633-
result.appendIfPresent(
634-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
635-
'skip-cert-verify',
636-
);
637-
appendClientCert(result, proxy);
597+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
638598

639599
// tfo
640600
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -766,19 +726,8 @@ function http(proxy) {
766726
'no-error-alert',
767727
);
768728

769-
// tls fingerprint
770-
result.appendIfPresent(
771-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
772-
'tls-fingerprint',
773-
);
774-
775729
// tls verification
776-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
777-
result.appendIfPresent(
778-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
779-
'skip-cert-verify',
780-
);
781-
appendClientCert(result, proxy);
730+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
782731

783732
// tfo
784733
result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo');
@@ -895,19 +844,8 @@ function socks5(proxy) {
895844
'no-error-alert',
896845
);
897846

898-
// tls fingerprint
899-
result.appendIfPresent(
900-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
901-
'tls-fingerprint',
902-
);
903-
904847
// tls verification
905-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
906-
result.appendIfPresent(
907-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
908-
'skip-cert-verify',
909-
);
910-
appendClientCert(result, proxy);
848+
appendTlsProxyParams(result, proxy, Boolean(proxy.tls));
911849

912850
// tfo
913851
if (proxy.tfo) {
@@ -1103,18 +1041,7 @@ function tuic(proxy) {
11031041
);
11041042

11051043
// tls verification
1106-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
1107-
result.appendIfPresent(
1108-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
1109-
'skip-cert-verify',
1110-
);
1111-
appendClientCert(result, proxy);
1112-
1113-
// tls fingerprint
1114-
result.appendIfPresent(
1115-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
1116-
'tls-fingerprint',
1117-
);
1044+
appendTlsProxyParams(result, proxy);
11181045

11191046
// tfo
11201047
if (isPresent(proxy, 'tfo')) {
@@ -1380,16 +1307,7 @@ function hysteria2(proxy) {
13801307
);
13811308

13821309
// tls verification
1383-
result.appendIfPresent(`,sni="${proxy.sni}"`, 'sni');
1384-
result.appendIfPresent(
1385-
`,skip-cert-verify=${proxy['skip-cert-verify']}`,
1386-
'skip-cert-verify',
1387-
);
1388-
appendClientCert(result, proxy);
1389-
result.appendIfPresent(
1390-
`,server-cert-fingerprint-sha256=${proxy['tls-fingerprint']}`,
1391-
'tls-fingerprint',
1392-
);
1310+
appendTlsProxyParams(result, proxy);
13931311

13941312
// tfo
13951313
if (isPresent(proxy, 'tfo')) {

0 commit comments

Comments
 (0)