Only use safe ciphers in HTTPS server
This commit is contained in:
@@ -19,6 +19,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
goLog "log"
|
goLog "log"
|
||||||
"net"
|
"net"
|
||||||
@@ -85,14 +86,17 @@ func (s Server) Serve(
|
|||||||
handlerBuilder HandlerBuilder,
|
handlerBuilder HandlerBuilder,
|
||||||
) *Serving {
|
) *Serving {
|
||||||
ssCfg := serverCfg.WithDefault()
|
ssCfg := serverCfg.WithDefault()
|
||||||
|
|
||||||
l := s.logger.Context(
|
l := s.logger.Context(
|
||||||
"Server (%s:%d)", ssCfg.ListenInterface, ssCfg.ListenPort)
|
"Server (%s:%d)", ssCfg.ListenInterface, ssCfg.ListenPort)
|
||||||
|
cipherSuites := tls.CipherSuites() // only return secure ciphers
|
||||||
|
selectedCipherSuites := make([]uint16, 0, len(cipherSuites))
|
||||||
|
for _, s := range cipherSuites {
|
||||||
|
selectedCipherSuites = append(selectedCipherSuites, s.ID)
|
||||||
|
}
|
||||||
ss := &Serving{
|
ss := &Serving{
|
||||||
server: http.Server{
|
server: http.Server{
|
||||||
Handler: handlerBuilder(commonCfg, ssCfg, l),
|
Handler: handlerBuilder(commonCfg, ssCfg, l),
|
||||||
TLSConfig: nil,
|
TLSConfig: &tls.Config{CipherSuites: selectedCipherSuites},
|
||||||
ReadTimeout: ssCfg.ReadTimeout,
|
ReadTimeout: ssCfg.ReadTimeout,
|
||||||
ReadHeaderTimeout: ssCfg.InitialTimeout,
|
ReadHeaderTimeout: ssCfg.InitialTimeout,
|
||||||
WriteTimeout: ssCfg.WriteTimeout,
|
WriteTimeout: ssCfg.WriteTimeout,
|
||||||
@@ -102,11 +106,8 @@ func (s Server) Serve(
|
|||||||
},
|
},
|
||||||
shutdownWait: s.shutdownWait,
|
shutdownWait: s.shutdownWait,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.shutdownWait.Add(1)
|
s.shutdownWait.Add(1)
|
||||||
|
|
||||||
go ss.run(l, ssCfg, closeCallback)
|
go ss.run(l, ssCfg, closeCallback)
|
||||||
|
|
||||||
return ss
|
return ss
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,26 +123,19 @@ func (s *Serving) buildListener(
|
|||||||
writeTimeout time.Duration,
|
writeTimeout time.Duration,
|
||||||
) (listener, error) {
|
) (listener, error) {
|
||||||
ipAddr := net.ParseIP(ip)
|
ipAddr := net.ParseIP(ip)
|
||||||
|
|
||||||
if ipAddr == nil {
|
if ipAddr == nil {
|
||||||
return listener{}, ErrInvalidIPAddress
|
return listener{}, ErrInvalidIPAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
ipPort := net.JoinHostPort(
|
ipPort := net.JoinHostPort(
|
||||||
ipAddr.String(), strconv.FormatInt(int64(port), 10))
|
ipAddr.String(), strconv.FormatInt(int64(port), 10))
|
||||||
|
|
||||||
addr, addrErr := net.ResolveTCPAddr("tcp", ipPort)
|
addr, addrErr := net.ResolveTCPAddr("tcp", ipPort)
|
||||||
|
|
||||||
if addrErr != nil {
|
if addrErr != nil {
|
||||||
return listener{}, addrErr
|
return listener{}, addrErr
|
||||||
}
|
}
|
||||||
|
|
||||||
ll, llErr := net.ListenTCP("tcp", addr)
|
ll, llErr := net.ListenTCP("tcp", addr)
|
||||||
|
|
||||||
if llErr != nil {
|
if llErr != nil {
|
||||||
return listener{}, llErr
|
return listener{}, llErr
|
||||||
}
|
}
|
||||||
|
|
||||||
return listener{
|
return listener{
|
||||||
TCPListener: ll,
|
TCPListener: ll,
|
||||||
readTimeout: readTimeout,
|
readTimeout: readTimeout,
|
||||||
@@ -156,53 +150,33 @@ func (s *Serving) run(
|
|||||||
closeCallback CloseCallback,
|
closeCallback CloseCallback,
|
||||||
) error {
|
) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err == nil || err == http.ErrServerClosed {
|
if err == nil || err == http.ErrServerClosed {
|
||||||
logger.Info("Closed")
|
logger.Info("Closed")
|
||||||
} else {
|
} else {
|
||||||
logger.Warning("Failed to serve due to error: %s", err)
|
logger.Warning("Failed to serve due to error: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.shutdownWait.Done()
|
s.shutdownWait.Done()
|
||||||
|
|
||||||
closeCallback(err)
|
closeCallback(err)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ls, err := s.buildListener(
|
ls, err := s.buildListener(
|
||||||
cfg.ListenInterface,
|
cfg.ListenInterface,
|
||||||
cfg.ListenPort,
|
cfg.ListenPort,
|
||||||
cfg.ReadTimeout,
|
cfg.ReadTimeout,
|
||||||
cfg.WriteTimeout,
|
cfg.WriteTimeout,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer ls.Close()
|
defer ls.Close()
|
||||||
|
|
||||||
if !cfg.IsTLS() {
|
if !cfg.IsTLS() {
|
||||||
logger.Info("Serving")
|
logger.Info("Serving")
|
||||||
|
|
||||||
err = s.server.Serve(ls)
|
err = s.server.Serve(ls)
|
||||||
|
} else {
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Info("Serving TLS")
|
logger.Info("Serving TLS")
|
||||||
|
|
||||||
err = s.server.ServeTLS(
|
err = s.server.ServeTLS(
|
||||||
ls, cfg.TLSCertificateFile, cfg.TLSCertificateKeyFile)
|
ls, cfg.TLSCertificateFile, cfg.TLSCertificateKeyFile)
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user