// 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{
0x0000,
0x0001,
0x0002,
0x0003,
0x0004,
tls.TLS_RSA_WITH_RC4_128_SHA,
0x0006,
0x0007,
0x0008,
0x0009,
tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
0x000b,
0x000c,
0x000d,
0x000e,
0x000f,
0x0010,
0x0011,
0x0012,
0x0013,
0x0014,
0x0015,
0x0016,
0x0017,
0x0018,
0x0019,
0x001a,
0x001b,
0x001e,
0x001f,
0x0020,
0x0021,
0x0022,
0x0023,
0x0024,
0x0025,
0x0026,
0x0027,
0x0028,
0x0029,
0x002a,
0x002b,
0x002c,
0x002d,
0x002e,
tls.TLS_RSA_WITH_AES_128_CBC_SHA,
0x0030,
0x0031,
0x0032,
0x0033,
0x0034,
tls.TLS_RSA_WITH_AES_256_CBC_SHA,
0x0036,
0x0037,
0x0038,
0x0039,
0x003a,
0x003b,
tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
tls.DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
0x003e,
0x003f,
0x0040,
0x0041,
0x0042,
0x0043,
0x0044,
0x0045,
0x0046,
0x0067,
0x0068,
0x0069,
0x006a,
0x006b,
0x006c,
0x006d,
0x0084,
0x0085,
0x0086,
0x0087,
0x0088,
0x0089,
0x008a,
0x008b,
0x008c,
0x008d,
0x008e,
0x008f,
0x0090,
0x0091,
0x0092,
0x0093,
0x0094,
0x0095,
0x0096,
0x0097,
0x0098,
0x0099,
0x009a,
0x009b,
tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
0x009e,
0x009f,
0x00a0,
0x00a1,
0x00a2,
0x00a3,
0x00a4,
0x00a5,
0x00a6,
0x00a7,
0x00a8,
0x00a9,
0x00aa,
0x00ab,
0x00ac,
0x00ad,
0x00ae,
0x00af,
0x00b0,
0x00b1,
0x00b2,
0x00b3,
0x00b4,
0x00b5,
0x00b6,
0x00b7,
0x00b8,
0x00b9,
0x00ba,
0x00bb,
0x00bc,
0x00bd,
0x00be,
0x00bf,
0x00c0,
0x00c1,
0x00c2,
0x00c3,
0x00c4,
0x00c5,
0x00c6,
0x00c7,
tls.TLS_AES_128_GCM_SHA256,
tls.TLS_AES_256_GCM_SHA384,
tls.TLS_CHACHA20_POLY1305_SHA256,
0x1304,
0x1305,
0xc001,
0xc002,
0xc003,
0xc004,
0xc005,
0xc006,
tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
0xc008,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
0xc00b,
0xc00c,
0xc00d,
0xc00e,
0xc00f,
0xc010,
tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
0xc015,
0xc016,
0xc017,
0xc018,
0xc019,
0xc01a,
0xc01b,
0xc01c,
0xc01d,
0xc01e,
0xc01f,
0xc020,
0xc021,
0xc022,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
tls.DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
0xc025,
0xc026,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
tls.DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
0xc029,
0xc02a,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
0xc02d,
0xc02e,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
0xc031,
0xc032,
0xc033,
0xc034,
0xc035,
0xc036,
0xc037,
0xc038,
0xc039,
0xc03a,
0xc03b,
0xc03c,
0xc03d,
0xc03e,
0xc03f,
0xc040,
0xc041,
0xc042,
0xc043,
0xc044,
0xc045,
0xc046,
0xc047,
0xc048,
0xc049,
0xc04a,
0xc04b,
0xc04c,
0xc04d,
0xc04e,
0xc04f,
0xc050,
0xc051,
0xc052,
0xc053,
0xc054,
0xc055,
0xc056,
0xc057,
0xc058,
0xc059,
0xc05a,
0xc05b,
0xc05c,
0xc05d,
0xc05e,
0xc05f,
0xc060,
0xc061,
0xc062,
0xc063,
0xc064,
0xc065,
0xc066,
0xc067,
0xc068,
0xc069,
0xc06a,
0xc06b,
0xc06c,
0xc06d,
0xc06e,
0xc06f,
0xc070,
0xc071,
0xc072,
0xc073,
0xc074,
0xc075,
0xc076,
0xc077,
0xc078,
0xc079,
0xc07a,
0xc07b,
0xc07c,
0xc07d,
0xc07e,
0xc07f,
0xc080,
0xc081,
0xc082,
0xc083,
0xc084,
0xc085,
0xc086,
0xc087,
0xc088,
0xc089,
0xc08a,
0xc08b,
0xc08c,
0xc08d,
0xc08e,
0xc08f,
0xc090,
0xc091,
0xc092,
0xc093,
0xc094,
0xc095,
0xc096,
0xc097,
0xc098,
0xc099,
0xc09a,
0xc09b,
0xc09c,
0xc09d,
0xc09e,
0xc09f,
0xc0a0,
0xc0a1,
0xc0a2,
0xc0a3,
0xc0a4,
0xc0a5,
0xc0a6,
0xc0a7,
0xc0a8,
0xc0a9,
0xc0aa,
0xc0ab,
0xc0ac,
0xc0ad,
0xc0ae,
0xc0af,
0xc0b0,
0xc0b1,
0xc0b2,
0xc0b3,
0xc0b4,
0xc0b5,
0xc100,
0xc101,
0xc102,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
0xccaa,
0xccab,
0xccac,
0xccad,
0xccae,
0xd001,
0xd002,
0xd003,
0xd005,
},
CompressionMethods: []byte{
0x00, // compressionNone
},
Extensions: []tls.TLSExtension{
&tls.SNIExtension{},
&tls.ALPNExtension{AlpnProtocols: []string{"h2","h2c","http/1.1"}},
&tls.SupportedPointsExtension{SupportedPoints: []byte{
0x00, // pointFormatUncompressed
0x01
0x02
}},
&tls.SessionTicketExtension{},
&tls.SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []tls.SignatureScheme{
tls.PSSWithSHA256,
tls.PSSWithSHA384,
tls.PSSWithSHA512,
0x0807,
0x0808,
0x0809,
0x080a,
0x080b,
tls.PKCS1WithSHA512,
0x0602,
tls.ECDSAWithP521AndSHA512,
tls.PKCS1WithSHA384,
0x0502,
tls.ECDSAWithP384AndSHA384,
tls.PKCS1WithSHA256,
0x0402,
tls.ECDSAWithP256AndSHA256,
0x0301,
0x0302,
0x0303,
tls.PKCS1WithSHA1,
0x0202,
tls.ECDSAWithSHA1,
},},
&tls.SupportedCurvesExtension{[]tls.CurveID{
tls.CurveP256,
tls.CurveP521,
0x001c,
0x001b,
tls.CurveP384,
0x001a,
0x0016,
0x000e,
0x000d,
0x000b,
0x000c,
0x0009,
0x000a,
}},
},
}
tlsConn.ApplyPreset(&clientHelloSpec)
n, err = tlsConn.Write([]byte("Hello, World!"))
// or tlsConn.Handshake() for better control