From d5a0d4d696dec06304ca6389275127b71b313e11 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Mon, 17 Jul 2017 14:34:59 -0700 Subject: [PATCH] etcdmain, embed: --auto-peer-tls and --auto-tls for v2 proxy Fixes #7930 --- embed/config.go | 29 +++++++++++++++++++++++++++++ embed/etcd.go | 29 ++++------------------------- etcdmain/etcd.go | 5 +++++ 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/embed/config.go b/embed/config.go index ee5fcce4f..2fb2a3280 100644 --- a/embed/config.go +++ b/embed/config.go @@ -20,6 +20,7 @@ import ( "net" "net/http" "net/url" + "path/filepath" "strings" "github.com/coreos/etcd/etcdserver" @@ -393,6 +394,34 @@ func (cfg Config) defaultClientHost() bool { return len(cfg.ACUrls) == 1 && cfg.ACUrls[0].String() == DefaultAdvertiseClientURLs } +func (cfg *Config) ClientSelfCert() (err error) { + if cfg.ClientAutoTLS && cfg.ClientTLSInfo.Empty() { + chosts := make([]string, len(cfg.LCUrls)) + for i, u := range cfg.LCUrls { + chosts[i] = u.Host + } + cfg.ClientTLSInfo, err = transport.SelfCert(filepath.Join(cfg.Dir, "fixtures", "client"), chosts) + return err + } else if cfg.ClientAutoTLS { + plog.Warningf("ignoring client auto TLS since certs given") + } + return nil +} + +func (cfg *Config) PeerSelfCert() (err error) { + if cfg.PeerAutoTLS && cfg.PeerTLSInfo.Empty() { + phosts := make([]string, len(cfg.LPUrls)) + for i, u := range cfg.LPUrls { + phosts[i] = u.Host + } + cfg.PeerTLSInfo, err = transport.SelfCert(filepath.Join(cfg.Dir, "fixtures", "peer"), phosts) + return err + } else if cfg.PeerAutoTLS { + plog.Warningf("ignoring peer auto TLS since certs given") + } + return nil +} + // UpdateDefaultClusterFromName updates cluster advertise URLs with, if available, default host, // if advertise URLs are default values(localhost:2379,2380) AND if listen URL is 0.0.0.0. // e.g. advertise peer URL localhost:2380 or listen peer URL 0.0.0.0:2380 diff --git a/embed/etcd.go b/embed/etcd.go index c5c0d2d69..b48caa898 100644 --- a/embed/etcd.go +++ b/embed/etcd.go @@ -22,7 +22,6 @@ import ( "net" "net/http" "net/url" - "path/filepath" "sync" "time" @@ -248,19 +247,9 @@ func (e *Etcd) Close() { func (e *Etcd) Err() <-chan error { return e.errc } func startPeerListeners(cfg *Config) (peers []*peerListener, err error) { - if cfg.PeerAutoTLS && cfg.PeerTLSInfo.Empty() { - phosts := make([]string, len(cfg.LPUrls)) - for i, u := range cfg.LPUrls { - phosts[i] = u.Host - } - cfg.PeerTLSInfo, err = transport.SelfCert(filepath.Join(cfg.Dir, "fixtures", "peer"), phosts) - if err != nil { - plog.Fatalf("could not get certs (%v)", err) - } - } else if cfg.PeerAutoTLS { - plog.Warningf("ignoring peer auto TLS since certs given") + if err = cfg.PeerSelfCert(); err != nil { + plog.Fatalf("could not get certs (%v)", err) } - if !cfg.PeerTLSInfo.Empty() { plog.Infof("peerTLS: %s", cfg.PeerTLSInfo) } @@ -302,19 +291,9 @@ func startPeerListeners(cfg *Config) (peers []*peerListener, err error) { } func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) { - if cfg.ClientAutoTLS && cfg.ClientTLSInfo.Empty() { - chosts := make([]string, len(cfg.LCUrls)) - for i, u := range cfg.LCUrls { - chosts[i] = u.Host - } - cfg.ClientTLSInfo, err = transport.SelfCert(filepath.Join(cfg.Dir, "fixtures", "client"), chosts) - if err != nil { - plog.Fatalf("could not get certs (%v)", err) - } - } else if cfg.ClientAutoTLS { - plog.Warningf("ignoring client auto TLS since certs given") + if err = cfg.ClientSelfCert(); err != nil { + plog.Fatalf("could not get certs (%v)", err) } - if cfg.EnablePprof { plog.Infof("pprof is enabled under %s", debugutil.HTTPPrefixPProf) } diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 7c4cef503..f04eb4f8a 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -205,6 +205,8 @@ func startProxy(cfg *config) error { // for both client and peer connections. clientTLSInfo = cfg.PeerTLSInfo } + clientTLSInfo.InsecureSkipVerify = cfg.ClientAutoTLS + cfg.PeerTLSInfo.InsecureSkipVerify = cfg.PeerAutoTLS pt, err := transport.NewTimeoutTransport(clientTLSInfo, time.Duration(cfg.ProxyDialTimeoutMs)*time.Millisecond, time.Duration(cfg.ProxyReadTimeoutMs)*time.Millisecond, time.Duration(cfg.ProxyWriteTimeoutMs)*time.Millisecond) if err != nil { @@ -212,6 +214,9 @@ func startProxy(cfg *config) error { } pt.MaxIdleConnsPerHost = httpproxy.DefaultMaxIdleConnsPerHost + if err = cfg.PeerSelfCert(); err != nil { + plog.Fatalf("could not get certs (%v)", err) + } tr, err := transport.NewTimeoutTransport(cfg.PeerTLSInfo, time.Duration(cfg.ProxyDialTimeoutMs)*time.Millisecond, time.Duration(cfg.ProxyReadTimeoutMs)*time.Millisecond, time.Duration(cfg.ProxyWriteTimeoutMs)*time.Millisecond) if err != nil { return err