Skip to content

Commit 7cf3d40

Browse files
committed
feat: use centralized TLS configuration from knative/pkg/tls
Bump knative.dev/pkg to pick up the new knative.dev/pkg/tls package and replace the hardcoded TLS server config in eventingtls with the shared DefaultConfigFromEnv utility. This enables environment-based control of MinVersion, MaxVersion, CipherSuites, and CurvePreferences for all eventing TLS servers (broker filter/ingress, IMC dispatcher, job sink, auth proxy, request-reply). Since DefaultConfigFromEnv defaults to TLS 1.3 but eventing historically defaults to TLS 1.2, GetTLSServerConfig falls back to 1.2 unless TLS_MIN_VERSION is explicitly set. Also wires up TLS for the RequestReply data plane, which previously had a TODO placeholder. Signed-off-by: Mikhail Fedosin <mfedosin@redhat.com>
1 parent 3acf87a commit 7cf3d40

3 files changed

Lines changed: 145 additions & 5 deletions

File tree

cmd/requestreply/main.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ package main
1818

1919
import (
2020
"context"
21+
"crypto/tls"
2122
"log"
2223

2324
"github.com/kelseyhightower/envconfig"
2425
"go.uber.org/zap"
2526
apierrs "k8s.io/apimachinery/pkg/api/errors"
2627
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/apimachinery/pkg/types"
2729

2830
"knative.dev/eventing/pkg/eventingtls"
2931
"knative.dev/eventing/pkg/kncloudevents"
@@ -34,6 +36,7 @@ import (
3436
configmap "knative.dev/pkg/configmap/informer"
3537
"knative.dev/pkg/controller"
3638
"knative.dev/pkg/injection"
39+
secretinformer "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret"
3740
"knative.dev/pkg/logging"
3841
"knative.dev/pkg/signals"
3942
"knative.dev/pkg/system"
@@ -109,9 +112,15 @@ func main() {
109112
env.PodIdx,
110113
)
111114

115+
tlsConfig, err := getServerTLSConfig(ctx)
116+
if err != nil {
117+
logger.Fatal("failed to get TLS server config", zap.Error(err))
118+
}
119+
112120
sm, err := eventingtls.NewServerManager(ctx,
113121
kncloudevents.NewHTTPEventReceiver(env.HttpPort),
114-
kncloudevents.NewHTTPEventReceiver(env.HttpsPort), // TODO: add tls config when we have it
122+
kncloudevents.NewHTTPEventReceiver(env.HttpsPort,
123+
kncloudevents.WithTLSConfig(tlsConfig)),
115124
handler,
116125
configMapWatcher,
117126
)
@@ -135,6 +144,17 @@ func flush(sl *zap.SugaredLogger) {
135144
_ = sl.Sync()
136145
}
137146

147+
func getServerTLSConfig(ctx context.Context) (*tls.Config, error) {
148+
secret := types.NamespacedName{
149+
Namespace: system.Namespace(),
150+
Name: eventingtls.RequestReplyServerTLSSecretName,
151+
}
152+
153+
serverTLSConfig := eventingtls.NewDefaultServerConfig()
154+
serverTLSConfig.GetCertificate = eventingtls.GetCertificateFromSecret(ctx, secretinformer.Get(ctx), kubeclient.Get(ctx), secret)
155+
return eventingtls.GetTLSServerConfig(serverTLSConfig)
156+
}
157+
138158
func getLoggingConfig(ctx context.Context, namespace, loggingConfigMapName string) (*logging.Config, error) {
139159
loggingConfigMap, err := kubeclient.Get(ctx).CoreV1().ConfigMaps(namespace).Get(ctx, loggingConfigMapName, metav1.GetOptions{})
140160
if apierrs.IsNotFound(err) {

pkg/eventingtls/eventingtls.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
duckv1 "knative.dev/pkg/apis/duck/v1"
4040
"knative.dev/pkg/controller"
4141
"knative.dev/pkg/logging"
42+
pkgtls "knative.dev/pkg/tls"
4243
)
4344

4445
const (
@@ -58,6 +59,8 @@ const (
5859
BrokerFilterServerTLSSecretName = "mt-broker-filter-server-tls" //nolint:gosec // This is not a hardcoded credential
5960
// BrokerIngressServerTLSSecretName is the name of the tls secret for the broker ingress server
6061
BrokerIngressServerTLSSecretName = "mt-broker-ingress-server-tls" //nolint:gosec // This is not a hardcoded credential
62+
// RequestReplyServerTLSSecretName is the name of the tls secret for the request reply server
63+
RequestReplyServerTLSSecretName = "request-reply-server-tls" //nolint:gosec // This is not a hardcoded credential
6164
)
6265

6366
type ClientConfig struct {
@@ -181,10 +184,19 @@ func NewDefaultServerConfig() ServerConfig {
181184
}
182185

183186
func GetTLSServerConfig(config ServerConfig) (*tls.Config, error) {
184-
return &tls.Config{
185-
MinVersion: DefaultMinTLSVersion,
186-
GetCertificate: config.GetCertificate,
187-
}, nil
187+
cfg, err := pkgtls.DefaultConfigFromEnv("")
188+
if err != nil {
189+
return nil, fmt.Errorf("failed to load TLS config from env: %w", err)
190+
}
191+
192+
// DefaultConfigFromEnv defaults to TLS 1.3, but eventing defaults to TLS 1.2.
193+
// Only keep TLS 1.3 if explicitly set via environment variable.
194+
if os.Getenv(pkgtls.MinVersionEnvKey) == "" {
195+
cfg.MinVersion = DefaultMinTLSVersion
196+
}
197+
198+
cfg.GetCertificate = config.GetCertificate
199+
return cfg, nil
188200
}
189201

190202
// IsHttpsSink returns true if the sink has scheme equal to https.

pkg/eventingtls/eventingtls_test.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"testing"
2323

2424
"k8s.io/utils/pointer"
25+
pkgtls "knative.dev/pkg/tls"
2526
)
2627

2728
func TestGetClientConfig(t *testing.T) {
@@ -129,3 +130,110 @@ func WithCerts(pool *x509.CertPool, caCerts string) *x509.CertPool {
129130
}
130131
return pool
131132
}
133+
134+
func TestGetTLSServerConfig(t *testing.T) {
135+
t.Run("defaults to TLS 1.2 when env not set", func(t *testing.T) {
136+
t.Setenv(pkgtls.MinVersionEnvKey, "")
137+
138+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
139+
if err != nil {
140+
t.Fatal("unexpected error:", err)
141+
}
142+
if cfg.MinVersion != tls.VersionTLS12 {
143+
t.Fatalf("want MinVersion TLS 1.2 (%d), got %d", tls.VersionTLS12, cfg.MinVersion)
144+
}
145+
})
146+
147+
t.Run("uses TLS 1.3 when explicitly set via env", func(t *testing.T) {
148+
t.Setenv(pkgtls.MinVersionEnvKey, "1.3")
149+
150+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
151+
if err != nil {
152+
t.Fatal("unexpected error:", err)
153+
}
154+
if cfg.MinVersion != tls.VersionTLS13 {
155+
t.Fatalf("want MinVersion TLS 1.3 (%d), got %d", tls.VersionTLS13, cfg.MinVersion)
156+
}
157+
})
158+
159+
t.Run("uses TLS 1.2 when explicitly set via env", func(t *testing.T) {
160+
t.Setenv(pkgtls.MinVersionEnvKey, "1.2")
161+
162+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
163+
if err != nil {
164+
t.Fatal("unexpected error:", err)
165+
}
166+
if cfg.MinVersion != tls.VersionTLS12 {
167+
t.Fatalf("want MinVersion TLS 1.2 (%d), got %d", tls.VersionTLS12, cfg.MinVersion)
168+
}
169+
})
170+
171+
t.Run("reads MaxVersion from env", func(t *testing.T) {
172+
t.Setenv(pkgtls.MaxVersionEnvKey, "1.3")
173+
174+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
175+
if err != nil {
176+
t.Fatal("unexpected error:", err)
177+
}
178+
if cfg.MaxVersion != tls.VersionTLS13 {
179+
t.Fatalf("want MaxVersion TLS 1.3 (%d), got %d", tls.VersionTLS13, cfg.MaxVersion)
180+
}
181+
})
182+
183+
t.Run("reads CipherSuites from env", func(t *testing.T) {
184+
t.Setenv(pkgtls.CipherSuitesEnvKey, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
185+
186+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
187+
if err != nil {
188+
t.Fatal("unexpected error:", err)
189+
}
190+
if len(cfg.CipherSuites) != 1 || cfg.CipherSuites[0] != tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 {
191+
t.Fatalf("want CipherSuites [%d], got %v", tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cfg.CipherSuites)
192+
}
193+
})
194+
195+
t.Run("reads CurvePreferences from env", func(t *testing.T) {
196+
t.Setenv(pkgtls.CurvePreferencesEnvKey, "X25519,CurveP256")
197+
198+
cfg, err := GetTLSServerConfig(NewDefaultServerConfig())
199+
if err != nil {
200+
t.Fatal("unexpected error:", err)
201+
}
202+
if len(cfg.CurvePreferences) != 2 {
203+
t.Fatalf("want 2 CurvePreferences, got %d", len(cfg.CurvePreferences))
204+
}
205+
if cfg.CurvePreferences[0] != tls.X25519 || cfg.CurvePreferences[1] != tls.CurveP256 {
206+
t.Fatalf("want CurvePreferences [X25519, CurveP256], got %v", cfg.CurvePreferences)
207+
}
208+
})
209+
210+
t.Run("returns error on invalid env value", func(t *testing.T) {
211+
t.Setenv(pkgtls.MinVersionEnvKey, "invalid")
212+
213+
_, err := GetTLSServerConfig(NewDefaultServerConfig())
214+
if err == nil {
215+
t.Fatal("expected error for invalid TLS_MIN_VERSION, got nil")
216+
}
217+
})
218+
219+
t.Run("preserves GetCertificate callback", func(t *testing.T) {
220+
called := false
221+
sc := ServerConfig{
222+
GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
223+
called = true
224+
return nil, nil
225+
},
226+
}
227+
cfg, err := GetTLSServerConfig(sc)
228+
if err != nil {
229+
t.Fatal("unexpected error:", err)
230+
}
231+
if cfg.GetCertificate == nil {
232+
t.Fatal("GetCertificate should not be nil")
233+
}
234+
_, _ = cfg.GetCertificate(nil)
235+
if !called {
236+
t.Fatal("GetCertificate callback was not invoked")
237+
}
238+
})
239+
}

0 commit comments

Comments
 (0)