diff --git a/internal/sub/service.go b/internal/sub/service.go index 3df68744c..d1b062240 100644 --- a/internal/sub/service.go +++ b/internal/sub/service.go @@ -1625,12 +1625,6 @@ func applyExternalProxyTLSToStream(ep map[string]any, stream map[string]any, sec } if fp, ok := ep["fingerprint"].(string); ok && fp != "" { tlsSettings["fingerprint"] = fp - settings, _ := tlsSettings["settings"].(map[string]any) - if settings == nil { - settings = map[string]any{} - tlsSettings["settings"] = settings - } - settings["fingerprint"] = fp } if alpn, ok := externalProxyALPNList(ep["alpn"]); ok { tlsSettings["alpn"] = alpn diff --git a/internal/sub/service_test.go b/internal/sub/service_test.go index 32f9ebe87..7754cd4f3 100644 --- a/internal/sub/service_test.go +++ b/internal/sub/service_test.go @@ -775,6 +775,26 @@ func TestApplyExternalProxyTLSToStream_DoesNotLeakAcrossProxies(t *testing.T) { } } +func TestApplyExternalProxyTLSToStream_FingerprintNotDuplicated(t *testing.T) { + stream := map[string]any{ + "security": "tls", + "tlsSettings": map[string]any{}, + } + ep := map[string]any{"dest": "proxy.example.com", "fingerprint": "chrome"} + + applyExternalProxyTLSToStream(ep, stream, "tls") + + ts, _ := stream["tlsSettings"].(map[string]any) + if ts["fingerprint"] != "chrome" { + t.Fatalf("tlsSettings.fingerprint = %v, want %q", ts["fingerprint"], "chrome") + } + if settings, ok := ts["settings"].(map[string]any); ok { + if got, dup := settings["fingerprint"]; dup { + t.Fatalf("fingerprint must not be duplicated into tlsSettings.settings, got %v", got) + } + } +} + func TestApplyExternalProxyTLSParams_SetsPinnedPeerCert(t *testing.T) { params := map[string]string{"security": "tls"} ep := map[string]any{