diff --git a/configuration/configuration.go b/configuration/configuration.go index 47899bd9e..5f745b647 100644 --- a/configuration/configuration.go +++ b/configuration/configuration.go @@ -207,6 +207,11 @@ func (gc *GlobalConfiguration) SetEffectiveConfiguration(configFile string) { entryPoint.WhitelistSourceRange = nil } } + + if entryPoint.TLS != nil && entryPoint.TLS.DefaultCertificate == nil && len(entryPoint.TLS.Certificates) > 0 { + log.Infof("No tls.defaultCertificate given for %s: using the first item in tls.certificates as a fallback.", entryPointName) + entryPoint.TLS.DefaultCertificate = &entryPoint.TLS.Certificates[0] + } } // Make sure LifeCycle isn't nil to spare nil checks elsewhere. diff --git a/integration/etcd_test.go b/integration/etcd_test.go index 80dcf0b40..1da3f7408 100644 --- a/integration/etcd_test.go +++ b/integration/etcd_test.go @@ -315,13 +315,13 @@ func (s *EtcdSuite) TestCertificatesContentWithSNIConfigHandshake(c *check.C) { snitestOrgKey, err := ioutil.ReadFile("fixtures/https/snitest.org.key") c.Assert(err, checker.IsNil) - globalConfig := map[string]string{ - "/traefik/entrypoints/https/address": ":4443", - "/traefik/entrypoints/https/tls/certificates/0/certfile": string(snitestComCert), - "/traefik/entrypoints/https/tls/certificates/0/keyfile": string(snitestComKey), - "/traefik/entrypoints/https/tls/certificates/1/certfile": string(snitestOrgCert), - "/traefik/entrypoints/https/tls/certificates/1/keyfile": string(snitestOrgKey), - "/traefik/defaultentrypoints/0": "https", + globalConfig := map[string][]byte{ + "/traefik/entrypoints/https/address": []byte(":4443"), + "/traefik/entrypoints/https/tls/certificates/0/certfile": snitestComCert, + "/traefik/entrypoints/https/tls/certificates/0/keyfile": snitestComKey, + "/traefik/entrypoints/https/tls/certificates/1/certfile": snitestOrgCert, + "/traefik/entrypoints/https/tls/certificates/1/keyfile": snitestOrgKey, + "/traefik/defaultentrypoints/0": []byte("https"), } backend1 := map[string]string{ @@ -351,7 +351,7 @@ func (s *EtcdSuite) TestCertificatesContentWithSNIConfigHandshake(c *check.C) { "/traefik/frontends/frontend2/routes/test_2/rule": "Host:snitest.org", } for key, value := range globalConfig { - err := s.kv.Put(key, []byte(value), nil) + err := s.kv.Put(key, value, nil) c.Assert(err, checker.IsNil) } for key, value := range backend1 { diff --git a/server/server_configuration.go b/server/server_configuration.go index eec23f8f3..164048bcd 100644 --- a/server/server_configuration.go +++ b/server/server_configuration.go @@ -590,13 +590,17 @@ func (s *Server) buildServerEntryPoints() map[string]*serverEntryPoint { serverEntryPoints[entryPointName].certs.SniStrict = entryPoint.Configuration.TLS.SniStrict if entryPoint.Configuration.TLS.DefaultCertificate != nil { - cert, err := tls.LoadX509KeyPair(entryPoint.Configuration.TLS.DefaultCertificate.CertFile.String(), entryPoint.Configuration.TLS.DefaultCertificate.KeyFile.String()) + cert, err := buildDefaultCertificate(entryPoint.Configuration.TLS.DefaultCertificate) if err != nil { + log.Error(err) + continue } - serverEntryPoints[entryPointName].certs.DefaultCertificate = &cert + serverEntryPoints[entryPointName].certs.DefaultCertificate = cert } else { cert, err := generate.DefaultCertificate() if err != nil { + log.Errorf("failed to generate default certificate: %v", err) + continue } serverEntryPoints[entryPointName].certs.DefaultCertificate = cert } @@ -611,6 +615,24 @@ func (s *Server) buildServerEntryPoints() map[string]*serverEntryPoint { return serverEntryPoints } +func buildDefaultCertificate(defaultCertificate *traefiktls.Certificate) (*tls.Certificate, error) { + certFile, err := defaultCertificate.CertFile.Read() + if err != nil { + return nil, fmt.Errorf("failed to get cert file content: %v", err) + } + + keyFile, err := defaultCertificate.KeyFile.Read() + if err != nil { + return nil, fmt.Errorf("failed to get key file content: %v", err) + } + + cert, err := tls.X509KeyPair(certFile, keyFile) + if err != nil { + return nil, fmt.Errorf("failed to load X509 key pair: %v", err) + } + return &cert, nil +} + func (s *Server) buildDefaultHTTPRouter() *mux.Router { rt := mux.NewRouter() rt.NotFoundHandler = s.wrapHTTPHandlerWithAccessLog(http.HandlerFunc(http.NotFound), "backend not found")