refactor TLS

This commit is contained in:
smallnest
2017-10-22 17:11:34 +08:00
parent 6801261c2d
commit f0db5e94b5
5 changed files with 40 additions and 24 deletions

View File

@@ -4,6 +4,7 @@
package server package server
import ( import (
"crypto/tls"
"net" "net"
reuseport "github.com/kavu/go_reuseport" reuseport "github.com/kavu/go_reuseport"
@@ -22,7 +23,12 @@ func (s *Server) makeListener(network, address string) (ln net.Listener, err err
ln, err = reuseport.NewReusablePortListener(network, address) ln, err = reuseport.NewReusablePortListener(network, address)
default: //tcp, http default: //tcp, http
ln, err = net.Listen(network, address) if s.TLSConfig == nil {
ln, err = net.Listen(network, address)
} else {
ln, err = tls.Listen(network, address, s.TLSConfig)
}
} }
return ln, err return ln, err

View File

@@ -32,12 +32,16 @@ func (s *Server) makeListener(network, address string) (ln net.Listener, err err
ln, err = reuseport.NewReusablePortListener(network, address) ln, err = reuseport.NewReusablePortListener(network, address)
case "quic": case "quic":
if s.Options == nil || s.Options["QuicConfig"] == nil { if s.TLSConfig == nil {
return nil, errors.New("KCP BlockCrypt must be configured in server.Options") return nil, errors.New("KCP BlockCrypt must be configured in server.Options")
} }
ln, err = quicconn.Listen("udp", address, s.Options["QuicConfig"].(*tls.Config)) ln, err = quicconn.Listen("udp", address, s.TLSConfig)
default: //tcp, http default: //tcp, http
ln, err = net.Listen(network, address) if s.TLSConfig == nil {
ln, err = net.Listen(network, address)
} else {
ln, err = tls.Listen(network, address, s.TLSConfig)
}
} }
return ln, err return ln, err

View File

@@ -1,15 +1,18 @@
// +build windows // +build windows
// +build !udp // +build !udp
package rpcx package server
import ( import (
"errors"
"net" "net"
quicconn "github.com/marten-seemann/quic-conn"
) )
// block can be nil if the caller wishes to skip encryption. // block can be nil if the caller wishes to skip encryption.
// tlsConfig can be nil iff we are not using network "quic". // tlsConfig can be nil iff we are not using network "quic".
func makeListener(network, address string) (ln net.Listener, err error) { func (s *Server) makeListener(network, address string) (ln net.Listener, err error) {
switch network { switch network {
case "reuseport": case "reuseport":
if validIP4(address) { if validIP4(address) {
@@ -20,7 +23,10 @@ func makeListener(network, address string) (ln net.Listener, err error) {
ln, err = net.Listen(network, address) ln, err = net.Listen(network, address)
default: //tcp default: //tcp
ln, err = net.Listen(network, address) if s.TLSConfig == nil {
return nil, errors.New("KCP BlockCrypt must be configured in server.Options")
}
ln, err = quicconn.Listen("udp", address, s.TLSConfig)
} }
return ln, err return ln, err

View File

@@ -1,9 +1,10 @@
// +build windows // +build windows
// +build udp // +build udp
package rpcx package server
import ( import (
"crypto/tls"
"errors" "errors"
"net" "net"
@@ -12,12 +13,12 @@ import (
) )
// block can be nil if the caller wishes to skip encryption. // block can be nil if the caller wishes to skip encryption.
// tlsConfig can be nil iff we are not using network "quic". // tlsConfig can be nil if we are not using network "quic".
func makeListener(network, address string) (ln net.Listener, err error) { func (s *Server) makeListener(network, address string) (ln net.Listener, err error) {
switch network { switch network {
case "kcp": case "kcp":
if s.Options == nil || s.Options["BlockCrypt"] == nil { if s.Options == nil || s.Options["BlockCrypt"] == nil {
return errors.New("KCP BlockCrypt must be configured in server.Options") return nil, errors.New("KCP BlockCrypt must be configured in server.Options")
} }
ln, err = kcp.ListenWithOptions(address, s.Options["BlockCrypt"].(kcp.BlockCrypt), 10, 3) ln, err = kcp.ListenWithOptions(address, s.Options["BlockCrypt"].(kcp.BlockCrypt), 10, 3)
@@ -30,9 +31,16 @@ func makeListener(network, address string) (ln net.Listener, err error) {
ln, err = net.Listen(network, address) ln, err = net.Listen(network, address)
case "quic": case "quic":
ln, err = quicconn.Listen("udp", address, tlsConfig) if s.TLSConfig == nil {
return nil, errors.New("KCP BlockCrypt must be configured in server.Options")
}
ln, err = quicconn.Listen("udp", address, s.TLSConfig)
default: //tcp default: //tcp
ln, err = net.Listen(network, address) if s.TLSConfig == nil {
ln, err = net.Listen(network, address)
} else {
ln, err = tls.Listen(network, address, s.TLSConfig)
}
} }
return ln, err return ln, err

View File

@@ -62,7 +62,9 @@ type Server struct {
inShutdown int32 inShutdown int32
onShutdown []func() onShutdown []func()
// BlockCrypt for kcp.BlockCrypt, QUICConfig for quic TlsConfig, etc. // TLSConfig for creating tls tcp connection.
TLSConfig *tls.Config
// BlockCrypt for kcp.BlockCrypt
Options map[string]interface{} Options map[string]interface{}
// // use for KCP // // use for KCP
// KCPConfig KCPConfig // KCPConfig KCPConfig
@@ -82,16 +84,6 @@ func NewServer(options map[string]interface{}) *Server {
} }
} }
// // KCPConfig is config of KCP.
// type KCPConfig struct {
// BlockCrypt kcp.BlockCrypt
// }
// // QUICConfig is config of QUIC.
// type QUICConfig struct {
// TlsConfig *tls.Config
// }
// Address returns listened address. // Address returns listened address.
func (s *Server) Address() net.Addr { func (s *Server) Address() net.Addr {
if s.ln == nil { if s.ln == nil {