@@ -12,6 +12,40 @@ import (
12
12
"github.com/hashicorp/nomad/nomad/structs/config"
13
13
)
14
14
15
+ // supportedTLSVersions are the current TLS versions that Nomad supports
16
+ var supportedTLSVersions = map [string ]uint16 {
17
+ "tls10" : tls .VersionTLS10 ,
18
+ "tls11" : tls .VersionTLS11 ,
19
+ "tls12" : tls .VersionTLS12 ,
20
+ }
21
+
22
+ // supportedTLSCiphers are the complete list of TLS ciphers supported by Nomad
23
+ var supportedTLSCiphers = map [string ]uint16 {
24
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305" : tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 ,
25
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305" : tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 ,
26
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" : tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
27
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
28
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" : tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
29
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" : tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
30
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" : tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ,
31
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" : tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ,
32
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ,
33
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ,
34
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" : tls .TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ,
35
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" : tls .TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ,
36
+ "TLS_RSA_WITH_AES_128_GCM_SHA256" : tls .TLS_RSA_WITH_AES_128_GCM_SHA256 ,
37
+ "TLS_RSA_WITH_AES_256_GCM_SHA384" : tls .TLS_RSA_WITH_AES_256_GCM_SHA384 ,
38
+ "TLS_RSA_WITH_AES_128_CBC_SHA256" : tls .TLS_RSA_WITH_AES_128_CBC_SHA256 ,
39
+ "TLS_RSA_WITH_AES_128_CBC_SHA" : tls .TLS_RSA_WITH_AES_128_CBC_SHA ,
40
+ "TLS_RSA_WITH_AES_256_CBC_SHA" : tls .TLS_RSA_WITH_AES_256_CBC_SHA ,
41
+ }
42
+
43
+ // defaultTLSCiphers are the TLS Ciphers that are supported by default
44
+ var defaultTLSCiphers = []string {"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305" ,
45
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" ,
46
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" ,
47
+ }
48
+
15
49
// RegionSpecificWrapper is used to invoke a static Region and turns a
16
50
// RegionWrapper into a Wrapper type.
17
51
func RegionSpecificWrapper (region string , tlsWrap RegionWrapper ) Wrapper {
@@ -70,6 +104,9 @@ type Config struct {
70
104
// CipherSuites have a default safe configuration, or operators can override
71
105
// these values for acceptable safe alternatives.
72
106
CipherSuites []uint16
107
+
108
+ // MinVersion contains the minimum SSL/TLS version that is accepted.
109
+ MinVersion uint16
73
110
}
74
111
75
112
func NewTLSConfiguration (newConf * config.TLSConfig ) (* Config , error ) {
@@ -78,6 +115,11 @@ func NewTLSConfiguration(newConf *config.TLSConfig) (*Config, error) {
78
115
return nil , err
79
116
}
80
117
118
+ minVersion , err := ParseMinVersion (newConf .TLSMinVersion )
119
+ if err != nil {
120
+ return nil , err
121
+ }
122
+
81
123
return & Config {
82
124
VerifyIncoming : true ,
83
125
VerifyOutgoing : true ,
@@ -87,6 +129,7 @@ func NewTLSConfiguration(newConf *config.TLSConfig) (*Config, error) {
87
129
KeyFile : newConf .KeyFile ,
88
130
KeyLoader : newConf .GetKeyLoader (),
89
131
CipherSuites : ciphers ,
132
+ MinVersion : minVersion ,
90
133
}, nil
91
134
}
92
135
@@ -144,6 +187,7 @@ func (c *Config) OutgoingTLSConfig() (*tls.Config, error) {
144
187
RootCAs : x509 .NewCertPool (),
145
188
InsecureSkipVerify : true ,
146
189
CipherSuites : c .CipherSuites ,
190
+ MinVersion : c .MinVersion ,
147
191
}
148
192
if c .VerifyServerHostname {
149
193
tlsConfig .InsecureSkipVerify = false
@@ -263,6 +307,7 @@ func (c *Config) IncomingTLSConfig() (*tls.Config, error) {
263
307
ClientCAs : x509 .NewCertPool (),
264
308
ClientAuth : tls .NoClientCert ,
265
309
CipherSuites : c .CipherSuites ,
310
+ MinVersion : c .MinVersion ,
266
311
}
267
312
268
313
// Parse the CA cert if any
@@ -302,42 +347,32 @@ func ParseCiphers(cipherStr string) ([]uint16, error) {
302
347
303
348
var ciphers []string
304
349
if cipherStr == "" {
305
- // Set strong default values
306
- ciphers = []string {"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305" ,
307
- "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" ,
308
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" ,
309
- }
350
+ ciphers = defaultTLSCiphers
310
351
311
352
} else {
312
353
ciphers = strings .Split (cipherStr , "," )
313
354
}
314
-
315
- cipherMap := map [string ]uint16 {
316
- "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305" : tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 ,
317
- "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305" : tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 ,
318
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" : tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
319
- "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
320
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" : tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
321
- "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" : tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
322
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" : tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ,
323
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" : tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ,
324
- "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ,
325
- "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" : tls .TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ,
326
- "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" : tls .TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ,
327
- "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" : tls .TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ,
328
- "TLS_RSA_WITH_AES_128_GCM_SHA256" : tls .TLS_RSA_WITH_AES_128_GCM_SHA256 ,
329
- "TLS_RSA_WITH_AES_256_GCM_SHA384" : tls .TLS_RSA_WITH_AES_256_GCM_SHA384 ,
330
- "TLS_RSA_WITH_AES_128_CBC_SHA256" : tls .TLS_RSA_WITH_AES_128_CBC_SHA256 ,
331
- "TLS_RSA_WITH_AES_128_CBC_SHA" : tls .TLS_RSA_WITH_AES_128_CBC_SHA ,
332
- "TLS_RSA_WITH_AES_256_CBC_SHA" : tls .TLS_RSA_WITH_AES_256_CBC_SHA ,
333
- }
334
355
for _ , cipher := range ciphers {
335
- if v , ok := cipherMap [cipher ]; ok {
336
- suites = append (suites , v )
337
- } else {
338
- return suites , fmt .Errorf ("unsupported cipher %q" , cipher )
356
+ c , ok := supportedTLSCiphers [cipher ]
357
+ if ! ok {
358
+ return suites , fmt .Errorf ("unsupported TLS cipher %q" , cipher )
339
359
}
360
+ suites = append (suites , c )
340
361
}
341
362
342
363
return suites , nil
343
364
}
365
+
366
+ // ParseMinVersion parses the specified minimum TLS version for the Nomad agent
367
+ func ParseMinVersion (version string ) (uint16 , error ) {
368
+ if version == "" {
369
+ return supportedTLSVersions ["tls12" ], nil
370
+ }
371
+
372
+ vers , ok := supportedTLSVersions [version ]
373
+ if ! ok {
374
+ return 0 , fmt .Errorf ("unsupported TLS version %q" , version )
375
+ }
376
+
377
+ return vers , nil
378
+ }
0 commit comments