Skip to content

Commit 709e24e

Browse files
authored
[signal] Fix HTTP/WebSocket proxy not using custom certificates (#4644)
This pull request fixes a bug where the HTTP/WebSocket proxy server was not using custom TLS certificates when provided via --cert-file and --cert-key flags. Previously, only the gRPC server had TLS enabled with custom certificates, while the HTTP/WebSocket proxy ran without TLS.
1 parent 6654e2d commit 709e24e

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed

infrastructure_files/configure.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,15 @@ if [[ "$NETBIRD_DISABLE_LETSENCRYPT" == "true" ]]; then
185185
echo "You are also free to remove any occurrences of the Letsencrypt-volume $LETSENCRYPT_VOLUMENAME"
186186
echo ""
187187

188-
export NETBIRD_SIGNAL_PROTOCOL="https"
189188
unset NETBIRD_LETSENCRYPT_DOMAIN
190189
unset NETBIRD_MGMT_API_CERT_FILE
191190
unset NETBIRD_MGMT_API_CERT_KEY_FILE
192191
fi
193192

193+
if [[ -n "$NETBIRD_MGMT_API_CERT_FILE" && -n "$NETBIRD_MGMT_API_CERT_KEY_FILE" ]]; then
194+
export NETBIRD_SIGNAL_PROTOCOL="https"
195+
fi
196+
194197
# Check if management identity provider is set
195198
if [ -n "$NETBIRD_MGMT_IDP" ]; then
196199
EXTRA_CONFIG={}

infrastructure_files/docker-compose.yml.tmpl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,21 @@ services:
4040
signal:
4141
<<: *default
4242
image: netbirdio/signal:$NETBIRD_SIGNAL_TAG
43+
depends_on:
44+
- dashboard
4345
volumes:
4446
- $SIGNAL_VOLUMENAME:/var/lib/netbird
47+
- $LETSENCRYPT_VOLUMENAME:/etc/letsencrypt:ro
4548
ports:
4649
- $NETBIRD_SIGNAL_PORT:80
4750
# # port and command for Let's Encrypt validation
4851
# - 443:443
4952
# command: ["--letsencrypt-domain", "$NETBIRD_LETSENCRYPT_DOMAIN", "--log-file", "console"]
53+
command: [
54+
"--cert-file", "$NETBIRD_MGMT_API_CERT_FILE",
55+
"--cert-key", "$NETBIRD_MGMT_API_CERT_KEY_FILE",
56+
"--log-file", "console"
57+
]
5058

5159
# Relay
5260
relay:

signal/cmd/run.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ var (
9494

9595
startPprof()
9696

97-
opts, certManager, err := getTLSConfigurations()
97+
opts, certManager, tlsConfig, err := getTLSConfigurations()
9898
if err != nil {
9999
return err
100100
}
@@ -132,17 +132,18 @@ var (
132132

133133
// Start the main server - always serve HTTP with WebSocket proxy support
134134
// If certManager is configured and signalPort == 443, it's already handled by startServerWithCertManager
135-
if certManager == nil {
135+
if tlsConfig == nil {
136136
// Without TLS, serve plain HTTP
137137
httpListener, err = net.Listen("tcp", fmt.Sprintf(":%d", signalPort))
138138
if err != nil {
139139
return err
140140
}
141141
log.Infof("running HTTP server with WebSocket proxy (no TLS): %s", httpListener.Addr().String())
142142
serveHTTP(httpListener, grpcRootHandler)
143-
} else if signalPort != 443 {
144-
// With TLS but not on port 443, serve HTTPS
145-
httpListener, err = tls.Listen("tcp", fmt.Sprintf(":%d", signalPort), certManager.TLSConfig())
143+
} else if certManager == nil || signalPort != 443 {
144+
// Serve HTTPS if not already handled by startServerWithCertManager
145+
// (custom certificates or Let's Encrypt with custom port)
146+
httpListener, err = tls.Listen("tcp", fmt.Sprintf(":%d", signalPort), tlsConfig)
146147
if err != nil {
147148
return err
148149
}
@@ -202,7 +203,7 @@ func startPprof() {
202203
}()
203204
}
204205

205-
func getTLSConfigurations() ([]grpc.ServerOption, *autocert.Manager, error) {
206+
func getTLSConfigurations() ([]grpc.ServerOption, *autocert.Manager, *tls.Config, error) {
206207
var (
207208
err error
208209
certManager *autocert.Manager
@@ -211,33 +212,33 @@ func getTLSConfigurations() ([]grpc.ServerOption, *autocert.Manager, error) {
211212

212213
if signalLetsencryptDomain == "" && signalCertFile == "" && signalCertKey == "" {
213214
log.Infof("running without TLS")
214-
return nil, nil, nil
215+
return nil, nil, nil, nil
215216
}
216217

217218
if signalLetsencryptDomain != "" {
218219
certManager, err = encryption.CreateCertManager(signalSSLDir, signalLetsencryptDomain)
219220
if err != nil {
220-
return nil, certManager, err
221+
return nil, certManager, nil, err
221222
}
222223
tlsConfig = certManager.TLSConfig()
223224
log.Infof("setting up TLS with LetsEncrypt.")
224225
} else {
225226
if signalCertFile == "" || signalCertKey == "" {
226227
log.Errorf("both cert-file and cert-key must be provided when not using LetsEncrypt")
227-
return nil, certManager, errors.New("both cert-file and cert-key must be provided when not using LetsEncrypt")
228+
return nil, certManager, nil, errors.New("both cert-file and cert-key must be provided when not using LetsEncrypt")
228229
}
229230

230231
tlsConfig, err = loadTLSConfig(signalCertFile, signalCertKey)
231232
if err != nil {
232233
log.Errorf("cannot load TLS credentials: %v", err)
233-
return nil, certManager, err
234+
return nil, certManager, nil, err
234235
}
235236
log.Infof("setting up TLS with custom certificates.")
236237
}
237238

238239
transportCredentials := credentials.NewTLS(tlsConfig)
239240

240-
return []grpc.ServerOption{grpc.Creds(transportCredentials)}, certManager, err
241+
return []grpc.ServerOption{grpc.Creds(transportCredentials)}, certManager, tlsConfig, err
241242
}
242243

243244
func startServerWithCertManager(certManager *autocert.Manager, grpcRootHandler http.Handler) {

0 commit comments

Comments
 (0)