@@ -23,6 +23,51 @@ const ipVersions = {
2323 'ipv6-prefer' : 'prefer-v6' ,
2424} ;
2525
26+ function stripSurgeQuotes ( value ) {
27+ if ( typeof value !== 'string' ) return value ;
28+
29+ const trimmed = value . trim ( ) ;
30+ const quote = trimmed [ 0 ] ;
31+ if (
32+ ( quote === '"' || quote === "'" ) &&
33+ trimmed [ trimmed . length - 1 ] === quote
34+ ) {
35+ return trimmed . slice ( 1 , - 1 ) . replace ( / \\ ( [ " ' \\ ] ) / g, '$1' ) ;
36+ }
37+
38+ return trimmed . replace ( / \\ ( [ " ' \\ ] ) / g, '$1' ) ;
39+ }
40+
41+ function quoteSurgeValue ( value ) {
42+ return `"${ String ( stripSurgeQuotes ( value ) )
43+ . replace ( / \\ / g, '\\\\' )
44+ . replace ( / " / g, '\\"' ) } "`;
45+ }
46+
47+ function appendClientCert ( result , proxy ) {
48+ const clientCert = isPresent ( proxy , 'keystore-client-cert' )
49+ ? proxy [ 'keystore-client-cert' ]
50+ : proxy [ 'client-cert' ] ;
51+ if (
52+ isPresent ( proxy , 'keystore-client-cert' ) ||
53+ isPresent ( proxy , 'client-cert' )
54+ ) {
55+ result . append ( `,client-cert=${ quoteSurgeValue ( clientCert ) } ` ) ;
56+ }
57+ }
58+
59+ function appendSshPrivateKey ( result , proxy ) {
60+ const privateKey = isPresent ( proxy , 'keystore-private-key' )
61+ ? proxy [ 'keystore-private-key' ]
62+ : proxy [ 'private-key' ] ;
63+ if (
64+ isPresent ( proxy , 'keystore-private-key' ) ||
65+ isPresent ( proxy , 'private-key' )
66+ ) {
67+ result . append ( `,private-key=${ quoteSurgeValue ( privateKey ) } ` ) ;
68+ }
69+ }
70+
2671export default function Surge_Producer ( ) {
2772 const produce = ( proxy , type , opts = { } ) => {
2873 if (
@@ -264,6 +309,7 @@ function trojan(proxy) {
264309 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
265310 'skip-cert-verify' ,
266311 ) ;
312+ appendClientCert ( result , proxy ) ;
267313
268314 // tfo
269315 result . appendIfPresent ( `,tfo=${ proxy . tfo } ` , 'tfo' ) ;
@@ -341,6 +387,7 @@ function anytls(proxy) {
341387 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
342388 'skip-cert-verify' ,
343389 ) ;
390+ appendClientCert ( result , proxy ) ;
344391
345392 // tfo
346393 result . appendIfPresent ( `,tfo=${ proxy . tfo } ` , 'tfo' ) ;
@@ -408,6 +455,7 @@ function trusttunnel(proxy) {
408455 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
409456 'skip-cert-verify' ,
410457 ) ;
458+ appendClientCert ( result , proxy ) ;
411459
412460 // tfo
413461 result . appendIfPresent ( `,tfo=${ proxy . tfo } ` , 'tfo' ) ;
@@ -472,6 +520,7 @@ function h2Connect(proxy) {
472520 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
473521 'skip-cert-verify' ,
474522 ) ;
523+ appendClientCert ( result , proxy ) ;
475524
476525 if ( proxy . tfo ) {
477526 $ . info ( `Option tfo is not supported by Surge, thus omitted` ) ;
@@ -556,6 +605,7 @@ function vmess(proxy, includeUnsupportedProxy) {
556605 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
557606 'skip-cert-verify' ,
558607 ) ;
608+ appendClientCert ( result , proxy ) ;
559609
560610 // tfo
561611 result . appendIfPresent ( `,tfo=${ proxy . tfo } ` , 'tfo' ) ;
@@ -617,10 +667,7 @@ function ssh(proxy) {
617667
618668 // https://manual.nssurge.com/policy/ssh.html
619669 // 需配合 Keystore
620- result . appendIfPresent (
621- `,private-key=${ proxy [ 'keystore-private-key' ] } ` ,
622- 'keystore-private-key' ,
623- ) ;
670+ appendSshPrivateKey ( result , proxy ) ;
624671 result . appendIfPresent (
625672 `,idle-timeout=${ proxy [ 'idle-timeout' ] } ` ,
626673 'idle-timeout' ,
@@ -702,6 +749,7 @@ function http(proxy) {
702749 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
703750 'skip-cert-verify' ,
704751 ) ;
752+ appendClientCert ( result , proxy ) ;
705753
706754 // tfo
707755 result . appendIfPresent ( `,tfo=${ proxy . tfo } ` , 'tfo' ) ;
@@ -830,6 +878,7 @@ function socks5(proxy) {
830878 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
831879 'skip-cert-verify' ,
832880 ) ;
881+ appendClientCert ( result , proxy ) ;
833882
834883 // tfo
835884 if ( proxy . tfo ) {
@@ -1029,6 +1078,7 @@ function tuic(proxy) {
10291078 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
10301079 'skip-cert-verify' ,
10311080 ) ;
1081+ appendClientCert ( result , proxy ) ;
10321082
10331083 // tls fingerprint
10341084 result . appendIfPresent (
@@ -1304,6 +1354,7 @@ function hysteria2(proxy) {
13041354 `,skip-cert-verify=${ proxy [ 'skip-cert-verify' ] } ` ,
13051355 'skip-cert-verify' ,
13061356 ) ;
1357+ appendClientCert ( result , proxy ) ;
13071358 result . appendIfPresent (
13081359 `,server-cert-fingerprint-sha256=${ proxy [ 'tls-fingerprint' ] } ` ,
13091360 'tls-fingerprint' ,
0 commit comments