Attempt to minimize additional cert gens

This commit is contained in:
Darren Shepherd
2019-11-13 06:03:51 +00:00
parent aaa5bc0d2a
commit 02b97e01f1
3 changed files with 44 additions and 8 deletions

View File

@@ -6,6 +6,7 @@ import (
"crypto/x509"
"net"
"net/http"
"strings"
"sync"
"github.com/rancher/dynamiclistener/factory"
@@ -18,6 +19,10 @@ type TLSStorage interface {
Update(secret *v1.Secret) error
}
type SetFactory interface {
SetFactory(tls *factory.TLS)
}
type Config struct {
CN string
Organization []string
@@ -47,6 +52,10 @@ func NewListener(l net.Listener, storage TLSStorage, caCert *x509.Certificate, c
}
dynamicListener.tlsConfig.GetCertificate = dynamicListener.getCertificate
if setter, ok := storage.(SetFactory); ok {
setter.SetFactory(dynamicListener.factory)
}
return tls.NewListener(dynamicListener, &dynamicListener.tlsConfig), dynamicListener.cacheHandler(), nil
}
@@ -60,9 +69,16 @@ type listener struct {
tlsConfig tls.Config
cert *tls.Certificate
sans []string
init sync.Once
}
func (l *listener) Accept() (net.Conn, error) {
l.init.Do(func() {
if len(l.sans) > 0 {
l.updateCert(l.sans...)
}
})
conn, err := l.Listener.Accept()
if err != nil {
return conn, err
@@ -96,7 +112,7 @@ func (l *listener) getCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate,
return l.loadCert()
}
func (l *listener) updateCert(cn string) error {
func (l *listener) updateCert(cn ...string) error {
l.RLock()
defer l.RUnlock()
@@ -105,7 +121,7 @@ func (l *listener) updateCert(cn string) error {
return err
}
if !factory.NeedsUpdate(secret, append(l.sans, cn)...) {
if !factory.NeedsUpdate(secret, cn...) {
return nil
}
@@ -114,7 +130,7 @@ func (l *listener) updateCert(cn string) error {
defer l.RLock()
defer l.Unlock()
secret, updated, err := l.factory.AddCN(secret, append(l.sans, cn)...)
secret, updated, err := l.factory.AddCN(secret, append(l.sans, cn...)...)
if err != nil {
return err
}