mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
pkg, clientv3, etcdmain: let grpcproxy rise an error when its cert has non empty CN
Fix https://github.com/etcd-io/etcd/issues/9521
This commit is contained in:
parent
fa521f4e00
commit
65887ae1b4
@ -307,7 +307,7 @@ func newTLS(ca, cert, key string) *transport.TLSInfo {
|
|||||||
if ca == "" && cert == "" && key == "" {
|
if ca == "" && cert == "" && key == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &transport.TLSInfo{TrustedCAFile: ca, CertFile: cert, KeyFile: key}
|
return &transport.TLSInfo{TrustedCAFile: ca, CertFile: cert, KeyFile: key, EmptyCN: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mustListenCMux(lg *zap.Logger, tlsinfo *transport.TLSInfo) cmux.CMux {
|
func mustListenCMux(lg *zap.Logger, tlsinfo *transport.TLSInfo) cmux.CMux {
|
||||||
|
@ -41,6 +41,7 @@ func NewCertPool(CAFiles []string) (*x509.CertPool, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
certPool.AddCert(cert)
|
certPool.AddCert(cert)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,6 +91,10 @@ type TLSInfo struct {
|
|||||||
// Logger logs TLS errors.
|
// Logger logs TLS errors.
|
||||||
// If nil, all logs are discarded.
|
// If nil, all logs are discarded.
|
||||||
Logger *zap.Logger
|
Logger *zap.Logger
|
||||||
|
|
||||||
|
// EmptyCN indicates that the cert must have empty CN.
|
||||||
|
// If true, ClientConfig() will return an error for a cert with non empty CN.
|
||||||
|
EmptyCN bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (info TLSInfo) String() string {
|
func (info TLSInfo) String() string {
|
||||||
@ -378,6 +382,28 @@ func (info TLSInfo) ClientConfig() (*tls.Config, error) {
|
|||||||
if info.selfCert {
|
if info.selfCert {
|
||||||
cfg.InsecureSkipVerify = true
|
cfg.InsecureSkipVerify = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if info.EmptyCN {
|
||||||
|
hasNonEmptyCN := false
|
||||||
|
cn := ""
|
||||||
|
tlsutil.NewCert(info.CertFile, info.KeyFile, func(certPEMBlock []byte, keyPEMBlock []byte) (tls.Certificate, error) {
|
||||||
|
var block *pem.Block
|
||||||
|
block, _ = pem.Decode(certPEMBlock)
|
||||||
|
cert, err := x509.ParseCertificate(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return tls.Certificate{}, err
|
||||||
|
}
|
||||||
|
if len(cert.Subject.CommonName) != 0 {
|
||||||
|
hasNonEmptyCN = true
|
||||||
|
cn = cert.Subject.CommonName
|
||||||
|
}
|
||||||
|
return tls.X509KeyPair(certPEMBlock, keyPEMBlock)
|
||||||
|
})
|
||||||
|
if hasNonEmptyCN {
|
||||||
|
return nil, fmt.Errorf("cert has non empty Common Name (%s)", cn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return cfg, nil
|
return cfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user