From 533d1afb4b4e61dc34282f5be88014f0952c9a00 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Mon, 1 Jul 2019 11:47:46 -0600 Subject: tls: Enable TLS 1.3 by default; set sane defaults on tls.Config structs --- modules/caddytls/connpolicy.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'modules/caddytls/connpolicy.go') diff --git a/modules/caddytls/connpolicy.go b/modules/caddytls/connpolicy.go index 89c91ad..ab0fbca 100644 --- a/modules/caddytls/connpolicy.go +++ b/modules/caddytls/connpolicy.go @@ -132,6 +132,10 @@ func (p *ConnectionPolicy) buildStandardTLSConfig(ctx caddy.Context) error { } tlsApp := tlsAppIface.(*TLS) + // fill in some "easy" default values, but for other values + // (such as slices), we should ensure that they start empty + // so the user-provided config can fill them in; then we will + // fill in a default config at the end if they are still unset cfg := &tls.Config{ NextProtos: p.ALPN, PreferServerCipherSuites: true, @@ -210,11 +214,39 @@ func (p *ConnectionPolicy) buildStandardTLSConfig(ctx caddy.Context) error { // TODO: client auth, and other fields + setDefaultTLSParams(cfg) + p.stdTLSConfig = cfg return nil } +// setDefaultTLSParams sets the default TLS cipher suites, protocol versions, +// and server preferences of cfg if they are not already set; it does not +// overwrite values, only fills in missing values. +func setDefaultTLSParams(cfg *tls.Config) { + if len(cfg.CipherSuites) == 0 { + cfg.CipherSuites = getOptimalDefaultCipherSuites() + } + + // Not a cipher suite, but still important for mitigating protocol downgrade attacks + // (prepend since having it at end breaks http2 due to non-h2-approved suites before it) + cfg.CipherSuites = append([]uint16{tls.TLS_FALLBACK_SCSV}, cfg.CipherSuites...) + + if len(cfg.CurvePreferences) == 0 { + cfg.CurvePreferences = defaultCurves + } + + if cfg.MinVersion == 0 { + cfg.MinVersion = tls.VersionTLS12 + } + if cfg.MaxVersion == 0 { + cfg.MaxVersion = tls.VersionTLS13 + } + + cfg.PreferServerCipherSuites = true +} + // PublicKeyAlgorithm is a JSON-unmarshalable wrapper type. type PublicKeyAlgorithm x509.PublicKeyAlgorithm -- cgit v1.2.3