54
vendor/k8s.io/apiserver/pkg/server/secure_serving.go
generated
vendored
54
vendor/k8s.io/apiserver/pkg/server/secure_serving.go
generated
vendored
@@ -20,14 +20,20 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"golang.org/x/net/http2"
|
||||
"k8s.io/klog"
|
||||
"k8s.io/component-base/cli/flag"
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||
"k8s.io/apiserver/pkg/endpoints/metrics"
|
||||
"k8s.io/apiserver/pkg/server/dynamiccertificates"
|
||||
)
|
||||
|
||||
@@ -56,6 +62,14 @@ func (s *SecureServingInfo) tlsConfig(stopCh <-chan struct{}) (*tls.Config, erro
|
||||
}
|
||||
if len(s.CipherSuites) > 0 {
|
||||
tlsConfig.CipherSuites = s.CipherSuites
|
||||
insecureCiphers := flag.InsecureTLSCiphers()
|
||||
for i := 0; i < len(s.CipherSuites); i++ {
|
||||
for cipherName, cipherID := range insecureCiphers {
|
||||
if s.CipherSuites[i] == cipherID {
|
||||
klog.Warningf("Use of insecure cipher '%s' detected.", cipherName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if s.ClientCA != nil {
|
||||
@@ -175,6 +189,11 @@ func (s *SecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Dur
|
||||
}
|
||||
}
|
||||
|
||||
// use tlsHandshakeErrorWriter to handle messages of tls handshake error
|
||||
tlsErrorWriter := &tlsHandshakeErrorWriter{os.Stderr}
|
||||
tlsErrorLogger := log.New(tlsErrorWriter, "", 0)
|
||||
secureServer.ErrorLog = tlsErrorLogger
|
||||
|
||||
klog.Infof("Serving securely on %s", secureServer.Addr)
|
||||
return RunServer(secureServer, s.Listener, shutdownTimeout, stopCh)
|
||||
}
|
||||
@@ -209,7 +228,7 @@ func RunServer(
|
||||
defer utilruntime.HandleCrash()
|
||||
|
||||
var listener net.Listener
|
||||
listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
|
||||
listener = tcpKeepAliveListener{ln}
|
||||
if server.TLSConfig != nil {
|
||||
listener = tls.NewListener(listener, server.TLSConfig)
|
||||
}
|
||||
@@ -235,15 +254,36 @@ func RunServer(
|
||||
//
|
||||
// Copied from Go 1.7.2 net/http/server.go
|
||||
type tcpKeepAliveListener struct {
|
||||
*net.TCPListener
|
||||
net.Listener
|
||||
}
|
||||
|
||||
func (ln tcpKeepAliveListener) Accept() (net.Conn, error) {
|
||||
tc, err := ln.AcceptTCP()
|
||||
c, err := ln.Listener.Accept()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tc.SetKeepAlive(true)
|
||||
tc.SetKeepAlivePeriod(defaultKeepAlivePeriod)
|
||||
return tc, nil
|
||||
if tc, ok := c.(*net.TCPConn); ok {
|
||||
tc.SetKeepAlive(true)
|
||||
tc.SetKeepAlivePeriod(defaultKeepAlivePeriod)
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// tlsHandshakeErrorWriter writes TLS handshake errors to klog with
|
||||
// trace level - V(5), to avoid flooding of tls handshake errors.
|
||||
type tlsHandshakeErrorWriter struct {
|
||||
out io.Writer
|
||||
}
|
||||
|
||||
const tlsHandshakeErrorPrefix = "http: TLS handshake error"
|
||||
|
||||
func (w *tlsHandshakeErrorWriter) Write(p []byte) (int, error) {
|
||||
if strings.Contains(string(p), tlsHandshakeErrorPrefix) {
|
||||
klog.V(5).Info(string(p))
|
||||
metrics.TLSHandshakeErrors.Inc()
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
// for non tls handshake error, log it as usual
|
||||
return w.out.Write(p)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user