Only use safe ciphers in HTTPS server

This commit is contained in:
NI
2021-12-16 19:28:51 +08:00
parent 3bb232845b
commit 5d4c3873fd

View File

@@ -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
} }