rpcsrv: Allow to enable mTLS
If RootCA setting is enabled in the configuration, use it to verify client certificate. Signed-off-by: Evgenii Stratonikov <fyfyrchik@runbox.com>
This commit is contained in:
parent
5cbfe215a4
commit
90efaa4771
2 changed files with 28 additions and 3 deletions
|
@ -29,8 +29,10 @@ type (
|
||||||
|
|
||||||
// TLS describes SSL/TLS configuration.
|
// TLS describes SSL/TLS configuration.
|
||||||
TLS struct {
|
TLS struct {
|
||||||
BasicService `yaml:",inline"`
|
BasicService `yaml:",inline"`
|
||||||
CertFile string `yaml:"CertFile"`
|
RootCA []string `yaml:"RootCAs"`
|
||||||
KeyFile string `yaml:"KeyFile"`
|
InsecureSkipVerify bool `yaml:"InsecureSkipVerify"`
|
||||||
|
CertFile string `yaml:"CertFile"`
|
||||||
|
KeyFile string `yaml:"KeyFile"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,6 +4,8 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
@ -13,6 +15,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -409,7 +412,27 @@ func (s *Server) Start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg := s.config.TLSConfig; cfg.Enabled {
|
if cfg := s.config.TLSConfig; cfg.Enabled {
|
||||||
|
caCertPool := x509.NewCertPool()
|
||||||
|
for _, f := range cfg.RootCA {
|
||||||
|
data, err := os.ReadFile(f)
|
||||||
|
if err != nil {
|
||||||
|
s.errChan <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
caCertPool.AppendCertsFromPEM(data)
|
||||||
|
}
|
||||||
|
|
||||||
for _, srv := range s.https {
|
for _, srv := range s.https {
|
||||||
|
if len(cfg.RootCA) == 0 {
|
||||||
|
s.log.Warn("client CAs are not provided, mTLS is disabled")
|
||||||
|
cfg.InsecureSkipVerify = true
|
||||||
|
}
|
||||||
|
srv.TLSConfig = &tls.Config{
|
||||||
|
ClientCAs: caCertPool,
|
||||||
|
ClientAuth: tls.RequireAndVerifyClientCert,
|
||||||
|
InsecureSkipVerify: cfg.InsecureSkipVerify,
|
||||||
|
}
|
||||||
srv.Handler = http.HandlerFunc(s.handleHTTPRequest)
|
srv.Handler = http.HandlerFunc(s.handleHTTPRequest)
|
||||||
s.log.Info("starting rpc-server (https)", zap.String("endpoint", srv.Addr))
|
s.log.Info("starting rpc-server (https)", zap.String("endpoint", srv.Addr))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue