Skip to content

Commit d5243ad

Browse files
committed
chore: better global-client-fingerprint handle
1 parent 6236cb1 commit d5243ad

File tree

10 files changed

+47
-67
lines changed

10 files changed

+47
-67
lines changed

adapter/outbound/anytls.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/metacubex/mihomo/component/dialer"
1212
"github.com/metacubex/mihomo/component/proxydialer"
1313
"github.com/metacubex/mihomo/component/resolver"
14-
tlsC "github.com/metacubex/mihomo/component/tls"
1514
C "github.com/metacubex/mihomo/constant"
1615
"github.com/metacubex/mihomo/transport/anytls"
1716
"github.com/metacubex/mihomo/transport/vmess"
@@ -115,9 +114,6 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) {
115114
if tlsConfig.Host == "" {
116115
tlsConfig.Host = option.Server
117116
}
118-
if tlsC.HaveGlobalFingerprint() && len(option.ClientFingerprint) == 0 {
119-
tlsConfig.ClientFingerprint = tlsC.GetGlobalFingerprint()
120-
}
121117
tOption.TLSConfig = tlsConfig
122118

123119
outbound := &AnyTLS{

adapter/outbound/trojan.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,7 @@ type TrojanSSOption struct {
6363
}
6464

6565
// StreamConnContext implements C.ProxyAdapter
66-
func (t *Trojan) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (net.Conn, error) {
67-
var err error
68-
69-
if tlsC.HaveGlobalFingerprint() && len(t.option.ClientFingerprint) == 0 {
70-
t.option.ClientFingerprint = tlsC.GetGlobalFingerprint()
71-
}
72-
66+
func (t *Trojan) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) {
7367
switch t.option.Network {
7468
case "ws":
7569
host, port, _ := net.SplitHostPort(t.addr)

adapter/outbound/vless.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,7 @@ type VlessOption struct {
7575
ClientFingerprint string `proxy:"client-fingerprint,omitempty"`
7676
}
7777

78-
func (v *Vless) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (net.Conn, error) {
79-
var err error
80-
81-
if tlsC.HaveGlobalFingerprint() && len(v.option.ClientFingerprint) == 0 {
82-
v.option.ClientFingerprint = tlsC.GetGlobalFingerprint()
83-
}
84-
78+
func (v *Vless) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) {
8579
switch v.option.Network {
8680
case "ws":
8781
host, port, _ := net.SplitHostPort(v.addr)

adapter/outbound/vmess.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,7 @@ type WSOptions struct {
9696
}
9797

9898
// StreamConnContext implements C.ProxyAdapter
99-
func (v *Vmess) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (net.Conn, error) {
100-
var err error
101-
102-
if tlsC.HaveGlobalFingerprint() && (len(v.option.ClientFingerprint) == 0) {
103-
v.option.ClientFingerprint = tlsC.GetGlobalFingerprint()
104-
}
105-
99+
func (v *Vmess) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) {
106100
switch v.option.Network {
107101
case "ws":
108102
host, port, _ := net.SplitHostPort(v.addr)

adapter/parser.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
"github.com/metacubex/mihomo/adapter/outbound"
77
"github.com/metacubex/mihomo/common/structure"
8-
tlsC "github.com/metacubex/mihomo/component/tls"
98
C "github.com/metacubex/mihomo/constant"
109
)
1110

@@ -22,7 +21,7 @@ func ParseProxy(mapping map[string]any) (C.Proxy, error) {
2221
)
2322
switch proxyType {
2423
case "ss":
25-
ssOption := &outbound.ShadowSocksOption{ClientFingerprint: tlsC.GetGlobalFingerprint()}
24+
ssOption := &outbound.ShadowSocksOption{}
2625
err = decoder.Decode(mapping, ssOption)
2726
if err != nil {
2827
break
@@ -55,7 +54,6 @@ func ParseProxy(mapping map[string]any) (C.Proxy, error) {
5554
Method: "GET",
5655
Path: []string{"/"},
5756
},
58-
ClientFingerprint: tlsC.GetGlobalFingerprint(),
5957
}
6058

6159
err = decoder.Decode(mapping, vmessOption)
@@ -64,7 +62,7 @@ func ParseProxy(mapping map[string]any) (C.Proxy, error) {
6462
}
6563
proxy, err = outbound.NewVmess(*vmessOption)
6664
case "vless":
67-
vlessOption := &outbound.VlessOption{ClientFingerprint: tlsC.GetGlobalFingerprint()}
65+
vlessOption := &outbound.VlessOption{}
6866
err = decoder.Decode(mapping, vlessOption)
6967
if err != nil {
7068
break
@@ -78,7 +76,7 @@ func ParseProxy(mapping map[string]any) (C.Proxy, error) {
7876
}
7977
proxy, err = outbound.NewSnell(*snellOption)
8078
case "trojan":
81-
trojanOption := &outbound.TrojanOption{ClientFingerprint: tlsC.GetGlobalFingerprint()}
79+
trojanOption := &outbound.TrojanOption{}
8280
err = decoder.Decode(mapping, trojanOption)
8381
if err != nil {
8482
break

component/tls/reality.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ type RealityConfig struct {
3737
ShortID [RealityMaxShortIDLen]byte
3838
}
3939

40-
func GetRealityConn(ctx context.Context, conn net.Conn, ClientFingerprint string, tlsConfig *tls.Config, realityConfig *RealityConfig) (net.Conn, error) {
40+
func GetRealityConn(ctx context.Context, conn net.Conn, clientFingerprint string, tlsConfig *tls.Config, realityConfig *RealityConfig) (net.Conn, error) {
4141
retry := 0
42-
for fingerprint, exists := GetFingerprint(ClientFingerprint); exists; retry++ {
42+
for fingerprint, exists := GetFingerprint(clientFingerprint); exists; retry++ {
4343
verifier := &realityVerifier{
4444
serverName: tlsConfig.ServerName,
4545
}

transport/gun/gun.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func (g *Conn) SetDeadline(t time.Time) error {
224224
return nil
225225
}
226226

227-
func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, realityConfig *tlsC.RealityConfig) *TransportWrap {
227+
func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, clientFingerprint string, realityConfig *tlsC.RealityConfig) *TransportWrap {
228228
dialFunc := func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) {
229229
ctx, cancel := context.WithTimeout(ctx, C.DefaultTLSTimeout)
230230
defer cancel()
@@ -237,9 +237,13 @@ func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, re
237237
return pconn, nil
238238
}
239239

240-
if len(Fingerprint) != 0 {
240+
clientFingerprint := clientFingerprint
241+
if tlsC.HaveGlobalFingerprint() && len(clientFingerprint) == 0 {
242+
clientFingerprint = tlsC.GetGlobalFingerprint()
243+
}
244+
if len(clientFingerprint) != 0 {
241245
if realityConfig == nil {
242-
if fingerprint, exists := tlsC.GetFingerprint(Fingerprint); exists {
246+
if fingerprint, exists := tlsC.GetFingerprint(clientFingerprint); exists {
243247
utlsConn := tlsC.UClient(pconn, cfg, fingerprint)
244248
if err := utlsConn.HandshakeContext(ctx); err != nil {
245249
pconn.Close()
@@ -253,7 +257,7 @@ func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, re
253257
return utlsConn, nil
254258
}
255259
} else {
256-
realityConn, err := tlsC.GetRealityConn(ctx, pconn, Fingerprint, cfg, realityConfig)
260+
realityConn, err := tlsC.GetRealityConn(ctx, pconn, clientFingerprint, cfg, realityConfig)
257261
if err != nil {
258262
pconn.Close()
259263
return nil, err

transport/sing-shadowtls/shadowtls.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,7 @@ func NewShadowTLS(ctx context.Context, conn net.Conn, option *ShadowTLSOption) (
4545
return nil, err
4646
}
4747

48-
var clientHelloID utls.ClientHelloID
49-
if len(option.ClientFingerprint) != 0 {
50-
if fingerprint, exists := tlsC.GetFingerprint(option.ClientFingerprint); exists {
51-
clientHelloID = *fingerprint.ClientHelloID
52-
}
53-
}
54-
tlsHandshake := uTLSHandshakeFunc(tlsConfig, clientHelloID)
48+
tlsHandshake := uTLSHandshakeFunc(tlsConfig, option.ClientFingerprint)
5549
client, err := shadowtls.NewClient(shadowtls.ClientConfig{
5650
Version: option.Version,
5751
Password: option.Password,
@@ -64,7 +58,7 @@ func NewShadowTLS(ctx context.Context, conn net.Conn, option *ShadowTLSOption) (
6458
return client.DialContextConn(ctx, conn)
6559
}
6660

67-
func uTLSHandshakeFunc(config *tls.Config, clientHelloID utls.ClientHelloID) shadowtls.TLSHandshakeFunc {
61+
func uTLSHandshakeFunc(config *tls.Config, clientFingerprint string) shadowtls.TLSHandshakeFunc {
6862
return func(ctx context.Context, conn net.Conn, sessionIDGenerator shadowtls.TLSSessionIDGeneratorFunc) error {
6963
tlsConfig := &utls.Config{
7064
Rand: config.Rand,
@@ -84,12 +78,18 @@ func uTLSHandshakeFunc(config *tls.Config, clientHelloID utls.ClientHelloID) sha
8478
Renegotiation: utls.RenegotiationSupport(config.Renegotiation),
8579
SessionIDGenerator: sessionIDGenerator,
8680
}
87-
var empty utls.ClientHelloID
88-
if clientHelloID == empty {
89-
tlsConn := utls.Client(conn, tlsConfig)
90-
return tlsConn.Handshake()
81+
clientFingerprint := clientFingerprint
82+
if tlsC.HaveGlobalFingerprint() && len(clientFingerprint) == 0 {
83+
clientFingerprint = tlsC.GetGlobalFingerprint()
84+
}
85+
if len(clientFingerprint) != 0 {
86+
if fingerprint, exists := tlsC.GetFingerprint(clientFingerprint); exists {
87+
clientHelloID := *fingerprint.ClientHelloID
88+
tlsConn := utls.UClient(conn, tlsConfig, clientHelloID)
89+
return tlsConn.HandshakeContext(ctx)
90+
}
9191
}
92-
tlsConn := utls.UClient(conn, tlsConfig, clientHelloID)
92+
tlsConn := utls.Client(conn, tlsConfig)
9393
return tlsConn.HandshakeContext(ctx)
9494
}
9595
}

transport/vmess/tls.go

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,22 @@ func StreamTLSConn(ctx context.Context, conn net.Conn, cfg *TLSConfig) (net.Conn
3232
return nil, err
3333
}
3434

35-
if len(cfg.ClientFingerprint) != 0 {
35+
clientFingerprint := cfg.ClientFingerprint
36+
if tlsC.HaveGlobalFingerprint() && len(clientFingerprint) == 0 {
37+
clientFingerprint = tlsC.GetGlobalFingerprint()
38+
}
39+
if len(clientFingerprint) != 0 {
3640
if cfg.Reality == nil {
37-
utlsConn, valid := GetUTLSConn(conn, cfg.ClientFingerprint, tlsConfig)
38-
if valid {
41+
if fingerprint, exists := tlsC.GetFingerprint(clientFingerprint); exists {
42+
utlsConn := tlsC.UClient(conn, tlsConfig, fingerprint)
3943
err = utlsConn.HandshakeContext(ctx)
40-
return utlsConn, err
44+
if err != nil {
45+
return nil, err
46+
}
47+
return utlsConn, nil
4148
}
4249
} else {
43-
return tlsC.GetRealityConn(ctx, conn, cfg.ClientFingerprint, tlsConfig, cfg.Reality)
50+
return tlsC.GetRealityConn(ctx, conn, clientFingerprint, tlsConfig, cfg.Reality)
4451
}
4552
}
4653
if cfg.Reality != nil {
@@ -52,14 +59,3 @@ func StreamTLSConn(ctx context.Context, conn net.Conn, cfg *TLSConfig) (net.Conn
5259
err = tlsConn.HandshakeContext(ctx)
5360
return tlsConn, err
5461
}
55-
56-
func GetUTLSConn(conn net.Conn, ClientFingerprint string, tlsConfig *tls.Config) (*tlsC.UConn, bool) {
57-
58-
if fingerprint, exists := tlsC.GetFingerprint(ClientFingerprint); exists {
59-
utlsConn := tlsC.UClient(conn, tlsConfig, fingerprint)
60-
61-
return utlsConn, true
62-
}
63-
64-
return nil, false
65-
}

transport/vmess/websocket.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,8 +354,12 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig,
354354
config.ServerName = uri.Host
355355
}
356356

357-
if len(c.ClientFingerprint) != 0 {
358-
if fingerprint, exists := tlsC.GetFingerprint(c.ClientFingerprint); exists {
357+
clientFingerprint := c.ClientFingerprint
358+
if tlsC.HaveGlobalFingerprint() && len(clientFingerprint) == 0 {
359+
clientFingerprint = tlsC.GetGlobalFingerprint()
360+
}
361+
if len(clientFingerprint) != 0 {
362+
if fingerprint, exists := tlsC.GetFingerprint(clientFingerprint); exists {
359363
utlsConn := tlsC.UClient(conn, config, fingerprint)
360364
if err = utlsConn.BuildWebsocketHandshakeState(); err != nil {
361365
return nil, fmt.Errorf("parse url %s error: %w", c.Path, err)

0 commit comments

Comments
 (0)