util: impersonate chrome TLS fingerprint

This commit is contained in:
stefanodvx 2025-04-18 12:46:26 +02:00
parent ea1451cb97
commit 3b625c8b0a

84
util/fingerprint.go Normal file
View file

@ -0,0 +1,84 @@
package util
import (
"crypto/tls"
"net/http"
)
func ChromeClientHelloSpec() *tls.ClientHelloInfo {
return &tls.ClientHelloInfo{
CipherSuites: []uint16{
tls.TLS_AES_128_GCM_SHA256,
tls.TLS_AES_256_GCM_SHA384,
tls.TLS_CHACHA20_POLY1305_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_RSA_WITH_AES_128_CBC_SHA,
tls.TLS_RSA_WITH_AES_256_CBC_SHA,
},
SupportedVersions: []uint16{tls.VersionTLS13, tls.VersionTLS12},
// chrome prefers X25519, followed by P-256 and P-384
SupportedCurves: []tls.CurveID{
tls.X25519,
tls.CurveP256,
tls.CurveP384,
},
SignatureSchemes: []tls.SignatureScheme{
tls.ECDSAWithP256AndSHA256,
tls.PSSWithSHA256,
tls.PKCS1WithSHA256,
tls.ECDSAWithP384AndSHA384,
tls.PSSWithSHA384,
tls.PKCS1WithSHA384,
tls.PSSWithSHA512,
tls.PKCS1WithSHA512,
tls.PKCS1WithSHA1,
},
}
}
func NewChromeClient() *http.Client {
tlsConfig := &tls.Config{
MinVersion: tls.VersionTLS12,
MaxVersion: tls.VersionTLS13,
// chrome's cipher preferences
CipherSuites: []uint16{
tls.TLS_AES_128_GCM_SHA256,
tls.TLS_AES_256_GCM_SHA384,
tls.TLS_CHACHA20_POLY1305_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
},
CurvePreferences: []tls.CurveID{
tls.X25519,
tls.CurveP256,
tls.CurveP384,
},
// important: chrome uses TLS session tickets
SessionTicketsDisabled: false,
// chrome does support renegotiation but doesn't use it by default
Renegotiation: tls.RenegotiateNever,
}
transport := &http.Transport{
TLSClientConfig: tlsConfig,
// chrome enables HTTP/2
ForceAttemptHTTP2: true,
}
return &http.Client{
Transport: transport,
}
}