Skip to content

Commit 873f7f5

Browse files
committed
feat: allow configuring min tls for grpc
Signed-off-by: Or Shachar <[email protected]>
1 parent 5c52d03 commit 873f7f5

File tree

5 files changed

+146
-70
lines changed

5 files changed

+146
-70
lines changed

pkg/common/tls/tls.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package tls
2+
3+
import (
4+
ctls "crypto/tls"
5+
"fmt"
6+
"os"
7+
)
8+
9+
type tlsVersion string
10+
11+
const (
12+
TLS10 tlsVersion = "TLS10"
13+
TLS11 tlsVersion = "TLS11"
14+
TLS12 tlsVersion = "TLS12"
15+
TLS13 tlsVersion = "TLS13"
16+
)
17+
18+
type tlsEnvVariableName string
19+
20+
const (
21+
minHTTPTLSVersionEnv tlsEnvVariableName = "KEDA_HTTP_MIN_TLS_VERSION"
22+
minGrpcTLSVersionEnv tlsEnvVariableName = "KEDA_GRPC_MIN_TLS_VERSION"
23+
)
24+
25+
const (
26+
defaultMinHTTPTLSVersion = TLS12
27+
defaultMinGrpcTLSVersion = TLS13
28+
)
29+
30+
func getMinTLSVersion(envKey tlsEnvVariableName, defaultVal tlsVersion) (uint16, error) {
31+
version := string(defaultVal)
32+
if val, ok := os.LookupEnv(string(envKey)); ok {
33+
version = val
34+
}
35+
mapping := map[string]uint16{
36+
string(TLS10): ctls.VersionTLS10,
37+
string(TLS11): ctls.VersionTLS11,
38+
string(TLS12): ctls.VersionTLS12,
39+
string(TLS13): ctls.VersionTLS13,
40+
}
41+
if v, ok := mapping[version]; ok {
42+
return v, nil
43+
}
44+
fallback := mapping[string(defaultVal)]
45+
return fallback, fmt.Errorf("invalid TLS version: %s, using %s", version, defaultVal)
46+
}
47+
48+
func GetMinHTTPTLSVersion() (uint16, error) {
49+
return getMinTLSVersion(minHTTPTLSVersionEnv, defaultMinHTTPTLSVersion)
50+
}
51+
52+
func GetMinGrpcTLSVersion() (uint16, error) {
53+
return getMinTLSVersion(minGrpcTLSVersionEnv, defaultMinGrpcTLSVersion)
54+
}

pkg/common/tls/tls_test.go

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package tls
2+
3+
import (
4+
"crypto/tls"
5+
"fmt"
6+
"os"
7+
"testing"
8+
)
9+
10+
type minTLSVersionTestData struct {
11+
name string
12+
envSet bool
13+
envValue string
14+
expectedVersion uint16
15+
shouldError bool
16+
}
17+
18+
var minTLSVersionTestDatas = []minTLSVersionTestData{
19+
{
20+
name: "Set to TLS10",
21+
envSet: true,
22+
envValue: "TLS10",
23+
expectedVersion: tls.VersionTLS10,
24+
},
25+
{
26+
name: "Set to TLS11",
27+
envSet: true,
28+
envValue: "TLS11",
29+
expectedVersion: tls.VersionTLS11,
30+
},
31+
{
32+
name: "Set to TLS12",
33+
envSet: true,
34+
envValue: "TLS12",
35+
expectedVersion: tls.VersionTLS12,
36+
},
37+
{
38+
name: "Set to TLS13",
39+
envSet: true,
40+
envValue: "TLS13",
41+
expectedVersion: tls.VersionTLS13,
42+
},
43+
{
44+
name: "No setting",
45+
envSet: false,
46+
},
47+
{
48+
name: "Invalid settings",
49+
envSet: true,
50+
envValue: "TLS9",
51+
shouldError: true,
52+
},
53+
}
54+
55+
func testResolveMinTLSVersion(t *testing.T, minVersionFunc func() (uint16, error), envName string, defaultVersion uint16) {
56+
defer os.Unsetenv(envName)
57+
for _, testData := range minTLSVersionTestDatas {
58+
name := fmt.Sprintf("%s: %s", envName, testData.name)
59+
t.Run(name, func(t *testing.T) {
60+
os.Unsetenv(envName)
61+
expectedVersion := defaultVersion
62+
if testData.expectedVersion != 0 {
63+
expectedVersion = testData.expectedVersion
64+
}
65+
if testData.envSet {
66+
os.Setenv(envName, testData.envValue)
67+
}
68+
minVersion, err := minVersionFunc()
69+
if testData.shouldError && err == nil {
70+
t.Error("Expected error but got none")
71+
}
72+
if expectedVersion != minVersion {
73+
t.Error("Failed to resolve minTLSVersion correctly", "wants", testData.expectedVersion, "got", minVersion)
74+
}
75+
})
76+
}
77+
}
78+
func TestResolveMinTLSVersion(t *testing.T) {
79+
testResolveMinTLSVersion(t, GetMinHTTPTLSVersion, "KEDA_HTTP_MIN_TLS_VERSION", tls.VersionTLS12)
80+
testResolveMinTLSVersion(t, GetMinGrpcTLSVersion, "KEDA_GRPC_MIN_TLS_VERSION", tls.VersionTLS13)
81+
}

pkg/metricsservice/utils/tls.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import (
2424
"path"
2525

2626
"google.golang.org/grpc/credentials"
27+
ctrl "sigs.k8s.io/controller-runtime"
28+
29+
kedatls "github.com/kedacore/keda/v2/pkg/common/tls"
2730
)
2831

2932
// LoadGrpcTLSCredentials reads the certificate from the given path and returns TLS transport credentials
@@ -50,8 +53,12 @@ func LoadGrpcTLSCredentials(certDir string, server bool) (credentials.TransportC
5053
}
5154

5255
// Create the credentials and return it
56+
minTLSVersion, err := kedatls.GetMinGrpcTLSVersion()
57+
if err != nil {
58+
ctrl.Log.WithName("grpc_tls_setup").Info(err.Error())
59+
}
5360
config := &tls.Config{
54-
MinVersion: tls.VersionTLS13,
61+
MinVersion: minTLSVersion,
5562
Certificates: []tls.Certificate{cert},
5663
}
5764
if server {

pkg/util/tls_config.go

+3-19
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ import (
2121
"crypto/x509"
2222
"encoding/pem"
2323
"fmt"
24-
"os"
2524

2625
"github.com/youmark/pkcs8"
2726
ctrl "sigs.k8s.io/controller-runtime"
27+
28+
kedatls "github.com/kedacore/keda/v2/pkg/common/tls"
2829
)
2930

3031
var minTLSVersion uint16
@@ -89,24 +90,7 @@ func GetMinTLSVersion() uint16 {
8990
}
9091

9192
func initMinTLSVersion() (uint16, error) {
92-
version, _ := os.LookupEnv("KEDA_HTTP_MIN_TLS_VERSION")
93-
94-
switch version {
95-
case "":
96-
minTLSVersion = tls.VersionTLS12
97-
case "TLS10":
98-
minTLSVersion = tls.VersionTLS10
99-
case "TLS11":
100-
minTLSVersion = tls.VersionTLS11
101-
case "TLS12":
102-
minTLSVersion = tls.VersionTLS12
103-
case "TLS13":
104-
minTLSVersion = tls.VersionTLS13
105-
default:
106-
return tls.VersionTLS12, fmt.Errorf("%s is not a valid value, using `TLS12`. Allowed values are: `TLS13`,`TLS12`,`TLS11`,`TLS10`", version)
107-
}
108-
109-
return minTLSVersion, nil
93+
return kedatls.GetMinHTTPTLSVersion()
11094
}
11195

11296
func decryptClientKey(clientKey, clientKeyPassword string) ([]byte, error) {

pkg/util/tls_config_test.go

-50
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ limitations under the License.
1717
package util
1818

1919
import (
20-
"crypto/tls"
2120
"crypto/x509"
22-
"os"
2321
"strings"
2422
"testing"
2523
)
@@ -252,51 +250,3 @@ func TestNewTLSConfig_WithPassword(t *testing.T) {
252250
})
253251
}
254252
}
255-
256-
type minTLSVersionTestData struct {
257-
envSet bool
258-
envValue string
259-
expectedVersion uint16
260-
}
261-
262-
var minTLSVersionTestDatas = []minTLSVersionTestData{
263-
{
264-
envSet: true,
265-
envValue: "TLS10",
266-
expectedVersion: tls.VersionTLS10,
267-
},
268-
{
269-
envSet: true,
270-
envValue: "TLS11",
271-
expectedVersion: tls.VersionTLS11,
272-
},
273-
{
274-
envSet: true,
275-
envValue: "TLS12",
276-
expectedVersion: tls.VersionTLS12,
277-
},
278-
{
279-
envSet: true,
280-
envValue: "TLS13",
281-
expectedVersion: tls.VersionTLS13,
282-
},
283-
{
284-
envSet: false,
285-
expectedVersion: tls.VersionTLS12,
286-
},
287-
}
288-
289-
func TestResolveMinTLSVersion(t *testing.T) {
290-
defer os.Unsetenv("KEDA_HTTP_MIN_TLS_VERSION")
291-
for _, testData := range minTLSVersionTestDatas {
292-
os.Unsetenv("KEDA_HTTP_MIN_TLS_VERSION")
293-
if testData.envSet {
294-
os.Setenv("KEDA_HTTP_MIN_TLS_VERSION", testData.envValue)
295-
}
296-
minVersion, _ := initMinTLSVersion()
297-
298-
if testData.expectedVersion != minVersion {
299-
t.Error("Failed to resolve minTLSVersion correctly", "wants", testData.expectedVersion, "got", minVersion)
300-
}
301-
}
302-
}

0 commit comments

Comments
 (0)