Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions app/subscription/clash.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def _mihomo_download_settings_from_xray(self, download_settings: dict) -> dict:
"alpn": tls_settings.get("alpn"),
"skip-cert-verify": tls_settings.get("allowInsecure"),
"servername": tls_settings.get("serverName"),
"client-fingerprint": tls_settings.get("fingerprint"),
"client-fingerprint": self._mihomo_client_fingerprint(tls_settings.get("fingerprint")),
"reality-opts": {
"public-key": tls_settings.get("publicKey"),
"short-id": tls_settings.get("shortId") or "",
Expand Down Expand Up @@ -292,6 +292,10 @@ def _select_address(address: list[str] | str) -> str:
return address[0]
return ""

@staticmethod
def _mihomo_client_fingerprint(fingerprint: str | None) -> str | None:
return "chrome" if fingerprint == "unsafe" else fingerprint

def _apply_mihomo_download_tls(self, node: dict, tls_config: TLSConfig):
if not tls_config.tls:
return
Expand All @@ -306,7 +310,7 @@ def _apply_mihomo_download_tls(self, node: dict, tls_config: TLSConfig):
node["skip-cert-verify"] = tls_config.allowinsecure

if tls_config.fingerprint:
node["client-fingerprint"] = tls_config.fingerprint
node["client-fingerprint"] = self._mihomo_client_fingerprint(tls_config.fingerprint)

if tls_config.tls == "reality" and tls_config.reality_public_key:
# Do not map mldsa65Verify → support-x25519mlkem768; those are different PQ features.
Expand Down Expand Up @@ -609,7 +613,7 @@ def _apply_tls(self, node: dict, tls_config: TLSConfig, protocol: str):

# Add fingerprint
if tls_config.fingerprint:
node["client-fingerprint"] = tls_config.fingerprint
node["client-fingerprint"] = self._mihomo_client_fingerprint(tls_config.fingerprint)

# Add Reality opts
if tls_config.tls == "reality" and tls_config.reality_public_key:
Expand Down
8 changes: 5 additions & 3 deletions app/subscription/singbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ def _apply_transport(self, network: str, inbound: SubscriptionInboundData, path:

def _apply_tls(self, tls_config: TLSConfig, fragment_settings: dict | None = None) -> dict:
"""Apply TLS settings - receives TLS config and optional fragment settings"""
fingerprint = "chrome" if tls_config.fingerprint == "unsafe" else tls_config.fingerprint

config = {
"enabled": tls_config.tls in ("tls", "reality"),
"server_name": tls_config.sni
Expand All @@ -225,10 +227,10 @@ def _apply_tls(self, tls_config: TLSConfig, fragment_settings: dict | None = Non
if tls_config.pinned_peer_cert_sha256
else None,
"utls": {
"enabled": bool(tls_config.fingerprint) or tls_config.tls == "reality",
"fingerprint": tls_config.fingerprint,
"enabled": bool(fingerprint) or tls_config.tls == "reality",
"fingerprint": fingerprint,
}
if tls_config.fingerprint or tls_config.tls == "reality"
if fingerprint or tls_config.tls == "reality"
else None,
"alpn": tls_config.alpn_singbox, # Pre-formatted for sing-box!
"ech": {
Expand Down