|
|
@@ -115,8 +115,7 @@ type MeekServer struct {
|
|
|
skipExtendedTurnAroundThreshold int
|
|
|
maxSessionStaleness time.Duration
|
|
|
httpClientIOTimeout time.Duration
|
|
|
- tlsConfig *tls.Config
|
|
|
- tlsExtraConfig *tls.ExtraConfig
|
|
|
+ tlsConfig *tls.ExtendedTLSConfig
|
|
|
obfuscatorSeedHistory *obfuscator.SeedHistory
|
|
|
clientHandler func(clientConn net.Conn, data *additionalTransportData)
|
|
|
openConns *common.Conns
|
|
|
@@ -233,13 +232,12 @@ func NewMeekServer(
|
|
|
}
|
|
|
|
|
|
if useTLS {
|
|
|
- tlsConfig, extraConfig, err := meekServer.makeMeekTLSConfig(
|
|
|
+ tlsConfig, err := meekServer.makeMeekTLSConfig(
|
|
|
isFronted, useObfuscatedSessionTickets)
|
|
|
if err != nil {
|
|
|
return nil, errors.Trace(err)
|
|
|
}
|
|
|
meekServer.tlsConfig = tlsConfig
|
|
|
- meekServer.tlsExtraConfig = extraConfig
|
|
|
}
|
|
|
|
|
|
if useHTTPNormalizer && protocol.TunnelProtocolUsesMeekHTTPNormalizer(listenerTunnelProtocol) {
|
|
|
@@ -315,7 +313,7 @@ func (server *MeekServer) Run() error {
|
|
|
var err error
|
|
|
if server.tlsConfig != nil {
|
|
|
httpsServer := HTTPSServer{Server: httpServer}
|
|
|
- err = httpsServer.ServeTLS(server.listener, server.tlsConfig, server.tlsExtraConfig)
|
|
|
+ err = httpsServer.ServeTLS(server.listener, server.tlsConfig)
|
|
|
} else {
|
|
|
err = httpServer.Serve(server.listener)
|
|
|
}
|
|
|
@@ -1221,17 +1219,17 @@ func (server *MeekServer) getMeekCookiePayload(
|
|
|
// of the connection is non-circumvention; it's optimized for performance
|
|
|
// assuming the peer is an uncensored CDN.
|
|
|
func (server *MeekServer) makeMeekTLSConfig(
|
|
|
- isFronted bool, useObfuscatedSessionTickets bool) (*tls.Config, *tls.ExtraConfig, error) {
|
|
|
+ isFronted bool, useObfuscatedSessionTickets bool) (*tls.ExtendedTLSConfig, error) {
|
|
|
|
|
|
certificate, privateKey, err := common.GenerateWebServerCertificate(values.GetHostName())
|
|
|
if err != nil {
|
|
|
- return nil, nil, errors.Trace(err)
|
|
|
+ return nil, errors.Trace(err)
|
|
|
}
|
|
|
|
|
|
tlsCertificate, err := tls.X509KeyPair(
|
|
|
[]byte(certificate), []byte(privateKey))
|
|
|
if err != nil {
|
|
|
- return nil, nil, errors.Trace(err)
|
|
|
+ return nil, errors.Trace(err)
|
|
|
}
|
|
|
|
|
|
// Vary the minimum version to frustrate scanning/fingerprinting of unfronted servers.
|
|
|
@@ -1239,14 +1237,15 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
minVersionCandidates := []uint16{tls.VersionTLS10, tls.VersionTLS11, tls.VersionTLS12}
|
|
|
minVersion := minVersionCandidates[prng.Intn(len(minVersionCandidates))]
|
|
|
|
|
|
- config := &tls.Config{
|
|
|
- Certificates: []tls.Certificate{tlsCertificate},
|
|
|
- NextProtos: []string{"http/1.1"},
|
|
|
- MinVersion: minVersion,
|
|
|
+ config := &tls.ExtendedTLSConfig{
|
|
|
+ TLSConfig: &tls.Config{
|
|
|
+ Certificates: []tls.Certificate{tlsCertificate},
|
|
|
+ NextProtos: []string{"http/1.1"},
|
|
|
+ MinVersion: minVersion,
|
|
|
+ },
|
|
|
+ ExtraConfig: &tls.ExtraConfig{},
|
|
|
}
|
|
|
|
|
|
- extraConfig := &tls.ExtraConfig{}
|
|
|
-
|
|
|
if isFronted {
|
|
|
// This is a reordering of the supported CipherSuites in golang 1.6[*]. Non-ephemeral key
|
|
|
// CipherSuites greatly reduce server load, and we try to select these since the meek
|
|
|
@@ -1259,7 +1258,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
// unfronted cases we prefer a more natural TLS handshake.
|
|
|
//
|
|
|
// [*] the list has since been updated, removing CipherSuites using RC4 and 3DES.
|
|
|
- config.CipherSuites = []uint16{
|
|
|
+ config.TLSConfig.CipherSuites = []uint16{
|
|
|
tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
|
|
|
tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
|
|
|
tls.TLS_RSA_WITH_AES_128_CBC_SHA,
|
|
|
@@ -1273,7 +1272,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
|
|
|
tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
|
|
|
}
|
|
|
- config.PreferServerCipherSuites = true
|
|
|
+ config.TLSConfig.PreferServerCipherSuites = true
|
|
|
}
|
|
|
|
|
|
if useObfuscatedSessionTickets {
|
|
|
@@ -1281,7 +1280,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
// See obfuscated session ticket overview
|
|
|
// in NewObfuscatedClientSessionState.
|
|
|
|
|
|
- extraConfig.UseObfuscatedSessionTickets = true
|
|
|
+ config.ExtraConfig.UseObfuscatedSessionTickets = true
|
|
|
|
|
|
var obfuscatedSessionTicketKey [32]byte
|
|
|
key, err := hex.DecodeString(server.support.Config.MeekObfuscatedKey)
|
|
|
@@ -1289,21 +1288,21 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
err = std_errors.New("invalid obfuscated session key length")
|
|
|
}
|
|
|
if err != nil {
|
|
|
- return nil, nil, errors.Trace(err)
|
|
|
+ return nil, errors.Trace(err)
|
|
|
}
|
|
|
copy(obfuscatedSessionTicketKey[:], key)
|
|
|
|
|
|
var standardSessionTicketKey [32]byte
|
|
|
_, err = rand.Read(standardSessionTicketKey[:])
|
|
|
if err != nil {
|
|
|
- return nil, nil, errors.Trace(err)
|
|
|
+ return nil, errors.Trace(err)
|
|
|
}
|
|
|
|
|
|
// Note: SessionTicketKey needs to be set, or else, it appears,
|
|
|
// tris.Config.serverInit() will clobber the value set by
|
|
|
// SetSessionTicketKeys.
|
|
|
- config.SessionTicketKey = obfuscatedSessionTicketKey
|
|
|
- config.SetSessionTicketKeys([][32]byte{
|
|
|
+ config.TLSConfig.SessionTicketKey = obfuscatedSessionTicketKey
|
|
|
+ config.TLSConfig.SetSessionTicketKeys([][32]byte{
|
|
|
standardSessionTicketKey,
|
|
|
obfuscatedSessionTicketKey})
|
|
|
}
|
|
|
@@ -1321,9 +1320,9 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
|
|
|
if server.passthroughAddress != "" {
|
|
|
|
|
|
- extraConfig.PassthroughAddress = server.passthroughAddress
|
|
|
+ config.ExtraConfig.PassthroughAddress = server.passthroughAddress
|
|
|
|
|
|
- extraConfig.PassthroughVerifyMessage = func(
|
|
|
+ config.ExtraConfig.PassthroughVerifyMessage = func(
|
|
|
message []byte) bool {
|
|
|
|
|
|
return obfuscator.VerifyTLSPassthroughMessage(
|
|
|
@@ -1332,7 +1331,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
message)
|
|
|
}
|
|
|
|
|
|
- extraConfig.PassthroughLogInvalidMessage = func(
|
|
|
+ config.ExtraConfig.PassthroughLogInvalidMessage = func(
|
|
|
clientIP string) {
|
|
|
|
|
|
logIrregularTunnel(
|
|
|
@@ -1344,7 +1343,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
nil)
|
|
|
}
|
|
|
|
|
|
- extraConfig.PassthroughHistoryAddNew = func(
|
|
|
+ config.ExtraConfig.PassthroughHistoryAddNew = func(
|
|
|
clientIP string,
|
|
|
clientRandom []byte) bool {
|
|
|
|
|
|
@@ -1379,7 +1378,7 @@ func (server *MeekServer) makeMeekTLSConfig(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return config, extraConfig, nil
|
|
|
+ return config, nil
|
|
|
}
|
|
|
|
|
|
// makeMeekHTTPNormalizerListener returns the meek server listener wrapped in
|