@@ -22,7 +22,6 @@ import (
22
22
"crypto/x509"
23
23
"crypto/x509/pkix"
24
24
"encoding/pem"
25
- "fmt"
26
25
"io/ioutil"
27
26
"math/big"
28
27
"net"
@@ -45,6 +44,13 @@ func createTLSConfigificates(logger *zap.Logger, certpath string, keypath string
45
44
return errors .New ("cert and key should be present or not at the same time" )
46
45
}
47
46
47
+ if err := os .MkdirAll (filepath .Dir (keypath ), 0755 ); err != nil {
48
+ return err
49
+ }
50
+ if err := os .MkdirAll (filepath .Dir (certpath ), 0755 ); err != nil {
51
+ return err
52
+ }
53
+
48
54
privkey , err := rsa .GenerateKey (rand .Reader , rsaKeySize )
49
55
if err != nil {
50
56
return err
@@ -108,6 +114,18 @@ func createTLSConfigificates(logger *zap.Logger, certpath string, keypath string
108
114
return nil
109
115
}
110
116
117
+ func PreProcessTLSConfig (logger * zap.Logger , scfg * config.TLSConfig , workdir , mod string , keySize int ) error {
118
+ if ! scfg .HasCert () && scfg .AutoCerts {
119
+ scfg .Cert = filepath .Join (workdir , mod , "cert.pem" )
120
+ scfg .Key = filepath .Join (workdir , mod , "key.pem" )
121
+ if err := createTLSConfigificates (logger , scfg .Cert , scfg .Key , keySize ); err != nil {
122
+ return errors .WithStack (err )
123
+ }
124
+ return PreProcessTLSConfig (logger , scfg , workdir , mod , keySize )
125
+ }
126
+ return nil
127
+ }
128
+
111
129
// CreateTLSConfigForTest is from https://gist.github.com/shaneutt/5e1995295cff6721c89a71d13a71c251.
112
130
func CreateTLSConfigForTest () (serverTLSConf * tls.Config , clientTLSConf * tls.Config , err error ) {
113
131
// set up our CA certificate
@@ -213,109 +231,98 @@ func CreateTLSConfigForTest() (serverTLSConf *tls.Config, clientTLSConf *tls.Con
213
231
return
214
232
}
215
233
216
- func BuildServerTLSConfig (logger * zap.Logger , cfg config.TLSConfig , workdir , mod string , keySize int ) (* tls.Config , error ) {
234
+ func BuildServerTLSConfig (logger * zap.Logger , cfg config.TLSConfig ) (* tls.Config , error ) {
235
+ logger = logger .With (zap .String ("tls" , "server" ))
217
236
if ! cfg .HasCert () {
218
- if cfg .AutoCerts {
219
- cfg .Cert = filepath .Join (workdir , mod , "cert.pem" )
220
- cfg .Key = filepath .Join (workdir , mod , "key.pem" )
221
- if err := createTLSConfigificates (logger , cfg .Cert , cfg .Key , keySize ); err != nil {
222
- return nil , err
223
- }
224
- return BuildServerTLSConfig (logger , cfg , workdir , mod , keySize )
225
- }
226
-
227
- // TODO: require certs here
228
- logger .Warn (fmt .Sprintf ("require certificates to secure %s clients connections" , mod ))
237
+ logger .Warn ("require certificates to secure clients connections, disable TLS" )
229
238
return nil , nil
230
239
}
231
240
232
241
tcfg := & tls.Config {}
233
242
cert , err := tls .LoadX509KeyPair (cfg .Cert , cfg .Key )
234
243
if err != nil {
235
- return nil , errors .Errorf ("failed to load certs for %s : %w" , mod , err )
244
+ return nil , errors .Errorf ("failed to load certs: %w" , err )
236
245
}
237
246
tcfg .Certificates = append (tcfg .Certificates , cert )
238
247
239
248
if ! cfg .HasCA () {
240
- logger .Warn (fmt . Sprintf ( "no signed certs for %s, will not authenticate %s clients (connection is still secured)" , mod , mod ) )
249
+ logger .Warn ("no CA, server will not authenticate clients (connection is still secured)" )
241
250
return tcfg , nil
242
251
}
243
252
244
253
tcfg .ClientAuth = tls .RequireAndVerifyClientCert
245
254
tcfg .ClientCAs = x509 .NewCertPool ()
246
255
certBytes , err := ioutil .ReadFile (cfg .CA )
247
256
if err != nil {
248
- return nil , errors .Errorf ("failed to read CA for %s : %w" , mod , err )
257
+ return nil , errors .Errorf ("failed to read CA: %w" , err )
249
258
}
250
259
if ! tcfg .ClientCAs .AppendCertsFromPEM (certBytes ) {
251
- return nil , errors .Errorf ("failed to append CA for %s" , mod )
260
+ return nil , errors .Errorf ("failed to append CA" )
252
261
}
253
262
return tcfg , nil
254
263
}
255
264
256
- func BuildClientTLSConfig (logger * zap.Logger , cfg config.TLSConfig , mod string ) (* tls.Config , error ) {
265
+ func BuildClientTLSConfig (logger * zap.Logger , cfg config.TLSConfig ) (* tls.Config , error ) {
266
+ logger = logger .With (zap .String ("tls" , "client" ))
257
267
if ! cfg .HasCA () {
258
- logger .Warn (fmt .Sprintf ("require CA to verify %s server connections" , mod ))
259
268
if cfg .SkipCA {
260
269
// still enable TLS without verify server certs
261
270
return & tls.Config {InsecureSkipVerify : true }, nil
262
271
}
263
- // no TLS
272
+ logger . Warn ( " no CA to verify server connections, disable TLS" )
264
273
return nil , nil
265
274
}
266
275
267
276
tcfg := & tls.Config {}
268
277
tcfg .ClientCAs = x509 .NewCertPool ()
269
278
certBytes , err := ioutil .ReadFile (cfg .CA )
270
279
if err != nil {
271
- return nil , errors .Errorf ("failed to read CA for %s : %w" , mod , err )
280
+ return nil , errors .Errorf ("failed to read CA: %w" , err )
272
281
}
273
282
if ! tcfg .ClientCAs .AppendCertsFromPEM (certBytes ) {
274
- return nil , errors .Errorf ("failed to append CA for %s" , mod )
283
+ return nil , errors .Errorf ("failed to append CA" )
275
284
}
276
285
277
286
if ! cfg .HasCert () {
278
- logger .Warn (fmt . Sprintf ( "no certs for %s , server may reject the connection" , mod ) )
287
+ logger .Warn ("no certificates , server may reject the connection" )
279
288
return tcfg , nil
280
289
}
281
290
cert , err := tls .LoadX509KeyPair (cfg .Cert , cfg .Key )
282
291
if err != nil {
283
- return nil , errors .Errorf ("failed to load certs for %s : %w" , mod , err )
292
+ return nil , errors .Errorf ("failed to load certs for: %w" , err )
284
293
}
285
294
tcfg .Certificates = append (tcfg .Certificates , cert )
286
295
287
296
return tcfg , nil
288
297
}
289
298
290
- func BuildEtcdTLSConfig (logger * zap.Logger , server config.TLSConfig , workdir , mod string , keySize int ) (clientInfo , peerInfo transport.TLSInfo , err error ) {
291
- if ! server .HasCert () {
292
- if server .AutoCerts {
293
- server .Cert = filepath .Join (workdir , mod , "cert.pem" )
294
- server .Key = filepath .Join (workdir , mod , "key.pem" )
295
- if err = createTLSConfigificates (logger , server .Cert , server .Key , keySize ); err != nil {
296
- return
297
- }
298
- return BuildEtcdTLSConfig (logger , server , workdir , mod , keySize )
299
- }
300
- } else {
299
+ func BuildEtcdTLSConfig (logger * zap.Logger , server , peer config.TLSConfig ) (clientInfo , peerInfo transport.TLSInfo , err error ) {
300
+ logger = logger .With (zap .String ("tls" , "etcd" ))
301
+
302
+ if server .HasCert () {
301
303
clientInfo .CertFile = server .Cert
302
304
clientInfo .KeyFile = server .Key
303
305
if server .HasCA () {
304
306
clientInfo .ClientCertAuth = true
305
307
clientInfo .TrustedCAFile = server .CA
306
- } else {
307
- logger .Warn ("no signed certs for etcd clients , proxy will not authenticate etcd clients (connection is still secured)" )
308
+ } else if ! server . SkipCA {
309
+ logger .Warn ("no CA , proxy will not authenticate etcd clients (connection is still secured)" )
308
310
}
309
311
}
310
312
311
- if server .HasCA () && server .HasCert () {
312
- peerInfo .CertFile = server .Cert
313
- peerInfo .KeyFile = server .Key
314
- peerInfo .TrustedCAFile = server .CA
315
- peerInfo .ClientCertAuth = true
316
- } else if server .HasCA () || server .HasCert () {
317
- err = errors .New ("need a full set of cert/ca/key for secure etcd peer inter-communication" )
318
- return
313
+ if peer .HasCert () {
314
+ peerInfo .CertFile = peer .Cert
315
+ peerInfo .KeyFile = peer .Key
316
+ if peer .HasCA () {
317
+ peerInfo .TrustedCAFile = peer .CA
318
+ peerInfo .ClientCertAuth = true
319
+ } else if peer .SkipCA {
320
+ peerInfo .InsecureSkipVerify = true
321
+ peerInfo .ClientCertAuth = false
322
+ } else {
323
+ err = errors .New ("need a full set of cert/key/ca or cert/key/skip-ca for secure etcd peer inter-communication" )
324
+ return
325
+ }
319
326
}
320
327
321
328
return
0 commit comments