fix: 解决 singbox 导入时关于 client-fingerprint 的报错并优化 tls 转换
This commit is contained in:
+43
-1
@@ -53,6 +53,12 @@ function clashToSingbox(node) {
|
|||||||
if (node.sni) tls.server_name = node.sni;
|
if (node.sni) tls.server_name = node.sni;
|
||||||
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
||||||
if (node.alpn) tls.alpn = node.alpn;
|
if (node.alpn) tls.alpn = node.alpn;
|
||||||
|
if (node['client-fingerprint']) {
|
||||||
|
tls.utls = {
|
||||||
|
enabled: true,
|
||||||
|
fingerprint: node['client-fingerprint']
|
||||||
|
};
|
||||||
|
}
|
||||||
sb.tls = tls;
|
sb.tls = tls;
|
||||||
} else if (t === 'vless') {
|
} else if (t === 'vless') {
|
||||||
sb.type = 'vless';
|
sb.type = 'vless';
|
||||||
@@ -109,6 +115,12 @@ function clashToSingbox(node) {
|
|||||||
if (node.sni) tls.server_name = node.sni;
|
if (node.sni) tls.server_name = node.sni;
|
||||||
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
||||||
if (node.alpn) tls.alpn = node.alpn;
|
if (node.alpn) tls.alpn = node.alpn;
|
||||||
|
if (node['client-fingerprint']) {
|
||||||
|
tls.utls = {
|
||||||
|
enabled: true,
|
||||||
|
fingerprint: node['client-fingerprint']
|
||||||
|
};
|
||||||
|
}
|
||||||
sb.tls = tls;
|
sb.tls = tls;
|
||||||
} else if (t === 'vmess') {
|
} else if (t === 'vmess') {
|
||||||
sb.type = 'vmess';
|
sb.type = 'vmess';
|
||||||
@@ -121,6 +133,12 @@ function clashToSingbox(node) {
|
|||||||
tls.enabled = true;
|
tls.enabled = true;
|
||||||
if (node.servername) tls.server_name = node.servername;
|
if (node.servername) tls.server_name = node.servername;
|
||||||
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
||||||
|
if (node['client-fingerprint']) {
|
||||||
|
tls.utls = {
|
||||||
|
enabled: true,
|
||||||
|
fingerprint: node['client-fingerprint']
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sb.tls = tls;
|
sb.tls = tls;
|
||||||
|
|
||||||
@@ -134,8 +152,32 @@ function clashToSingbox(node) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sb.type = t;
|
sb.type = t;
|
||||||
|
|
||||||
|
// Process generic TLS conversion if any TLS feature is detected
|
||||||
|
const hasTls = node.tls || node.servername || node.sni || node['client-fingerprint'] || node['skip-cert-verify'];
|
||||||
|
if (hasTls) {
|
||||||
|
const tls = { enabled: true };
|
||||||
|
if (node.servername || node.sni) tls.server_name = node.servername || node.sni;
|
||||||
|
if (node.hasOwnProperty('skip-cert-verify')) tls.insecure = !!node['skip-cert-verify'];
|
||||||
|
if (node.alpn) tls.alpn = node.alpn;
|
||||||
|
if (node['client-fingerprint']) {
|
||||||
|
tls.utls = {
|
||||||
|
enabled: true,
|
||||||
|
fingerprint: node['client-fingerprint']
|
||||||
|
};
|
||||||
|
}
|
||||||
|
sb.tls = tls;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy other fields but filter out Clash proprietary/incompatible fields
|
||||||
|
const excludeKeys = [
|
||||||
|
'name', 'port', 'type', 'server', 'tls', 'servername', 'sni',
|
||||||
|
'skip-cert-verify', 'client-fingerprint', 'alpn', 'udp',
|
||||||
|
'reality-opts', 'ws-opts', 'grpc-opts', 'h2-opts', 'http-opts',
|
||||||
|
'packet-encoding'
|
||||||
|
];
|
||||||
for (const k in node) {
|
for (const k in node) {
|
||||||
if (!['name', 'port', 'type', 'server'].includes(k)) {
|
if (!excludeKeys.includes(k)) {
|
||||||
sb[k] = node[k];
|
sb[k] = node[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user