mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-11 16:09:07 +02:00
[management] pass tls config for combined server (#7499)
This commit is contained in:
@@ -205,7 +205,7 @@ func createAllServers(ctx context.Context, cfg *CombinedConfig) (*serverInstance
|
|||||||
metricsServer: metricsServer,
|
metricsServer: metricsServer,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, tlsSupport, err := handleTLSConfig(cfg)
|
tlsConfig, tlsSupport, err := handleTLSConfig(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to setup TLS config: %w", err)
|
return nil, fmt.Errorf("failed to setup TLS config: %w", err)
|
||||||
}
|
}
|
||||||
@@ -214,7 +214,7 @@ func createAllServers(ctx context.Context, cfg *CombinedConfig) (*serverInstance
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := servers.createManagementServer(ctx, cfg); err != nil {
|
if err := servers.createManagementServer(ctx, cfg, tlsConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ func (s *serverInstances) createRelayServer(cfg *CombinedConfig, tlsSupport bool
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serverInstances) createManagementServer(ctx context.Context, cfg *CombinedConfig) error {
|
func (s *serverInstances) createManagementServer(ctx context.Context, cfg *CombinedConfig, tlsConfig *tls.Config) error {
|
||||||
if !cfg.Management.Enabled {
|
if !cfg.Management.Enabled {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ func (s *serverInstances) createManagementServer(ctx context.Context, cfg *Combi
|
|||||||
|
|
||||||
LogConfigInfo(mgmtConfig)
|
LogConfigInfo(mgmtConfig)
|
||||||
|
|
||||||
s.mgmtSrv, err = createManagementServer(cfg, mgmtConfig)
|
s.mgmtSrv, err = createManagementServer(cfg, mgmtConfig, tlsConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cleanupSTUNListeners(s.stunListeners)
|
cleanupSTUNListeners(s.stunListeners)
|
||||||
return fmt.Errorf("failed to create management server: %w", err)
|
return fmt.Errorf("failed to create management server: %w", err)
|
||||||
@@ -513,7 +513,7 @@ func handleTLSConfig(cfg *CombinedConfig) (*tls.Config, bool, error) {
|
|||||||
return nil, false, nil
|
return nil, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config) (mgmtServer.Server, error) {
|
func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config, tlsConfig *tls.Config) (mgmtServer.Server, error) {
|
||||||
mgmt := cfg.Management
|
mgmt := cfg.Management
|
||||||
|
|
||||||
// Extract port from listen address
|
// Extract port from listen address
|
||||||
@@ -542,6 +542,7 @@ func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config) (m
|
|||||||
AutoResolveDomains: true,
|
AutoResolveDomains: true,
|
||||||
MgmtPort: mgmtPort,
|
MgmtPort: mgmtPort,
|
||||||
MgmtMetricsPort: cfg.Server.MetricsPort,
|
MgmtMetricsPort: cfg.Server.MetricsPort,
|
||||||
|
TLSConfig: tlsConfig,
|
||||||
DisableMetrics: mgmt.DisableAnonymousMetrics,
|
DisableMetrics: mgmt.DisableAnonymousMetrics,
|
||||||
DisableGeoliteUpdate: mgmt.DisableGeoliteUpdate,
|
DisableGeoliteUpdate: mgmt.DisableGeoliteUpdate,
|
||||||
// Always enable user deletion from IDP in combined server (embedded IdP is always enabled)
|
// Always enable user deletion from IDP in combined server (embedded IdP is always enabled)
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ type BaseServer struct {
|
|||||||
grpcExtensions []GRPCExtension
|
grpcExtensions []GRPCExtension
|
||||||
|
|
||||||
listener net.Listener
|
listener net.Listener
|
||||||
|
tlsConfig *tls.Config
|
||||||
certManager *autocert.Manager
|
certManager *autocert.Manager
|
||||||
update *version.Update
|
update *version.Update
|
||||||
|
|
||||||
@@ -94,6 +95,7 @@ type Config struct {
|
|||||||
DisableGeoliteUpdate bool
|
DisableGeoliteUpdate bool
|
||||||
UserDeleteFromIDPEnabled bool
|
UserDeleteFromIDPEnabled bool
|
||||||
AutoResolveDomains bool
|
AutoResolveDomains bool
|
||||||
|
TLSConfig *tls.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServer initializes and configures a new Server instance
|
// NewServer initializes and configures a new Server instance
|
||||||
@@ -110,6 +112,7 @@ func NewServer(cfg *Config) *BaseServer {
|
|||||||
disableLegacyManagementPort: cfg.DisableLegacyManagementPort,
|
disableLegacyManagementPort: cfg.DisableLegacyManagementPort,
|
||||||
mgmtMetricsPort: cfg.MgmtMetricsPort,
|
mgmtMetricsPort: cfg.MgmtMetricsPort,
|
||||||
autoResolveDomains: cfg.AutoResolveDomains,
|
autoResolveDomains: cfg.AutoResolveDomains,
|
||||||
|
tlsConfig: cfg.TLSConfig,
|
||||||
}
|
}
|
||||||
s.container[ContainerKeyBaseServer] = s
|
s.container[ContainerKeyBaseServer] = s
|
||||||
|
|
||||||
@@ -139,21 +142,9 @@ func (s *BaseServer) Start(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
s.EphemeralManager().LoadInitialPeers(srvCtx)
|
s.EphemeralManager().LoadInitialPeers(srvCtx)
|
||||||
|
|
||||||
var tlsConfig *tls.Config
|
tlsEnabled, err := s.setupTLS(srvCtx)
|
||||||
tlsEnabled := false
|
if err != nil {
|
||||||
if s.Config.HttpConfig.LetsEncryptDomain != "" {
|
return err
|
||||||
s.certManager, err = encryption.CreateCertManager(s.Config.Datadir, s.Config.HttpConfig.LetsEncryptDomain)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed creating LetsEncrypt cert manager: %v", err)
|
|
||||||
}
|
|
||||||
tlsEnabled = true
|
|
||||||
} else if s.Config.HttpConfig.CertFile != "" && s.Config.HttpConfig.CertKey != "" {
|
|
||||||
tlsConfig, err = loadTLSConfig(s.Config.HttpConfig.CertFile, s.Config.HttpConfig.CertKey)
|
|
||||||
if err != nil {
|
|
||||||
log.WithContext(srvCtx).Errorf("cannot load TLS credentials: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
tlsEnabled = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
installationID, err := getInstallationID(srvCtx, s.Store())
|
installationID, err := getInstallationID(srvCtx, s.Store())
|
||||||
@@ -215,8 +206,8 @@ func (s *BaseServer) Start(ctx context.Context) error {
|
|||||||
log.WithContext(ctx).Infof("running HTTP server (LetsEncrypt challenge handler): %s", cml.Addr().String())
|
log.WithContext(ctx).Infof("running HTTP server (LetsEncrypt challenge handler): %s", cml.Addr().String())
|
||||||
s.serveHTTP(ctx, cml, s.certManager.HTTPHandler(nil))
|
s.serveHTTP(ctx, cml, s.certManager.HTTPHandler(nil))
|
||||||
}
|
}
|
||||||
case tlsConfig != nil:
|
case s.tlsConfig != nil:
|
||||||
s.listener, err = tls.Listen("tcp", fmt.Sprintf(":%d", s.mgmtPort), tlsConfig)
|
s.listener, err = tls.Listen("tcp", fmt.Sprintf(":%d", s.mgmtPort), s.tlsConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed creating TLS listener on port %d: %v", s.mgmtPort, err)
|
return fmt.Errorf("failed creating TLS listener on port %d: %v", s.mgmtPort, err)
|
||||||
}
|
}
|
||||||
@@ -240,6 +231,31 @@ func (s *BaseServer) Start(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setupTLS resolves the listener's TLS source: an injected config wins over the HttpConfig certificate settings
|
||||||
|
func (s *BaseServer) setupTLS(ctx context.Context) (bool, error) {
|
||||||
|
switch {
|
||||||
|
case s.tlsConfig != nil:
|
||||||
|
return true, nil
|
||||||
|
case s.Config.HttpConfig.LetsEncryptDomain != "":
|
||||||
|
certManager, err := encryption.CreateCertManager(s.Config.Datadir, s.Config.HttpConfig.LetsEncryptDomain)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed creating LetsEncrypt cert manager: %v", err)
|
||||||
|
}
|
||||||
|
s.certManager = certManager
|
||||||
|
return true, nil
|
||||||
|
case s.Config.HttpConfig.CertFile != "" && s.Config.HttpConfig.CertKey != "":
|
||||||
|
tlsConfig, err := loadTLSConfig(s.Config.HttpConfig.CertFile, s.Config.HttpConfig.CertKey)
|
||||||
|
if err != nil {
|
||||||
|
log.WithContext(ctx).Errorf("cannot load TLS credentials: %v", err)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
s.tlsConfig = tlsConfig
|
||||||
|
return true, nil
|
||||||
|
default:
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Stop attempts a graceful shutdown, waiting up to 5 seconds for active connections to finish
|
// Stop attempts a graceful shutdown, waiting up to 5 seconds for active connections to finish
|
||||||
func (s *BaseServer) Stop() error {
|
func (s *BaseServer) Stop() error {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
|
|||||||
Reference in New Issue
Block a user