// import tls "github.com/refraction-networking/utls"
tcpConn, err := net.Dial("tcp", "tlsfingerprint.io:443")
if err != nil {
fmt.Printf("net.Dial() failed: %+v\n", err)
return
}
config := tls.Config{ServerName: "tlsfingerprint.io"}
// This fingerprint includes feature(s), not fully supported by TLS.
// uTLS client with this fingerprint will only be able to to talk to servers,
// that also do not support those features.
tlsConn := tls.UClient(tcpConn, &tlsConfig, tls.HelloCustom)
clientHelloSpec := tls.ClientHelloSpec {
CipherSuites: []uint16{
tls.TLS_AES_128_GCM_SHA256,
tls.TLS_AES_256_GCM_SHA384,
tls.TLS_CHACHA20_POLY1305_SHA256,
0x1304,
0x1305,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
0x00a3,
0x009f,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
0xccaa,
0xc0af,
0xc0ad,
0xc0a3,
0xc09f,
0xc05d,
0xc061,
0xc057,
0xc053,
0x00a7,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
0x00a2,
0x009e,
0xc0ae,
0xc0ac,
0xc0a2,
0xc09e,
0xc05c,
0xc060,
0xc056,
0xc052,
0x00a6,
tls.DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
tls.DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
0x006b,
0x006a,
0xc073,
0xc077,
0x00c4,
0x00c3,
0x006d,
0x00c5,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
0x0067,
0x0040,
0xc072,
0xc076,
0x00be,
0x00bd,
0x006c,
0x00bf,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
0x0039,
0x0038,
0x0088,
0x0087,
0xc019,
0x003a,
0x0089,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
0x0033,
0x0032,
0x009a,
0x0099,
0x0045,
0x0044,
0xc018,
0x0034,
0x009b,
0x0046,
tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
0xc0a1,
0xc09d,
0xc051,
tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
0xc0a0,
0xc09c,
0xc050,
tls.DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
0x00c0,
tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
0x00ba,
tls.TLS_RSA_WITH_AES_256_CBC_SHA,
0x0084,
tls.TLS_RSA_WITH_AES_128_CBC_SHA,
0x0096,
0x0041,
0x0007,
0xc006,
0xc010,
0xc015,
0x003b,
0x0002,
0x0001,
0x00ff,
},
CompressionMethods: []byte{
0x00, // compressionNone
},
Extensions: []tls.TLSExtension{
&tls.SupportedPointsExtension{SupportedPoints: []byte{
0x00, // pointFormatUncompressed
0x01
0x02
}},
&tls.SupportedCurvesExtension{[]tls.CurveID{
tls.X25519,
tls.CurveP256,
0x001e,
tls.CurveP521,
tls.CurveP384,
}},
&tls.SessionTicketExtension{},
&tls.GenericExtension {Id: 0x0016}, // WARNING: UNKNOWN EXTENSION, USE AT YOUR OWN RISK
&tls.UtlsExtendedMasterSecretExtension{},
&tls.SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []tls.SignatureScheme{
tls.ECDSAWithP256AndSHA256,
tls.ECDSAWithP384AndSHA384,
tls.ECDSAWithP521AndSHA512,
0x0807,
0x0808,
0x0809,
0x080a,
0x080b,
tls.PSSWithSHA256,
tls.PSSWithSHA384,
tls.PSSWithSHA512,
tls.PKCS1WithSHA256,
tls.PKCS1WithSHA384,
tls.PKCS1WithSHA512,
0x0303,
tls.ECDSAWithSHA1,
0x0301,
tls.PKCS1WithSHA1,
0x0302,
0x0202,
0x0402,
0x0502,
0x0602,
},},
&tls.SupportedVersionsExtension{[]uint16{
tls.VersionTLS13,
tls.VersionTLS12,
tls.VersionTLS11,
tls.VersionTLS10,
}},
&tls.PSKKeyExchangeModesExtension{[]uint8{
tls.PskModeDHE,
}},
&tls.KeyShareExtension{[]tls.KeyShare{
{Group: tls.X25519},
}},
},
}
tlsConn.ApplyPreset(&clientHelloSpec)
n, err = tlsConn.Write([]byte("Hello, World!"))
// or tlsConn.Handshake() for better control