@@ -11,11 +11,16 @@ import (
11
11
)
12
12
13
13
const (
14
- certOrganization = "Apprenda"
15
- certOrgUnit = "Kismatic"
16
- certCountry = "US"
17
- certState = "NY"
18
- certLocality = "Troy"
14
+ certOrganization = "Apprenda"
15
+ certOrgUnit = "Kismatic"
16
+ certCountry = "US"
17
+ certState = "NY"
18
+ certLocality = "Troy"
19
+ adminUser = "admin"
20
+ adminGroup = "system:masters"
21
+ dockerRegistryCertFilename = "docker"
22
+ serviceAccountCertFilename = "service-account"
23
+ serviceAccountCertCommonName = "kube-service-account"
19
24
)
20
25
21
26
// The PKI provides a way for generating certificates for the cluster described by the Plan
@@ -25,7 +30,7 @@ type PKI interface {
25
30
GenerateNodeCertificate (plan * Plan , node Node , ca * tls.CA ) error
26
31
GetClusterCA () (* tls.CA , error )
27
32
GenerateClusterCA (p * Plan ) (* tls.CA , error )
28
- GenerateClusterCertificates (p * Plan , ca * tls.CA , users [] string ) error
33
+ GenerateClusterCertificates (p * Plan , ca * tls.CA ) error
29
34
}
30
35
31
36
// LocalPKI is a file-based PKI
@@ -98,7 +103,7 @@ func (lp *LocalPKI) GenerateClusterCA(p *Plan) (*tls.CA, error) {
98
103
}
99
104
100
105
// GenerateClusterCertificates creates a Certificates for all nodes on the cluster
101
- func (lp * LocalPKI ) GenerateClusterCertificates (p * Plan , ca * tls.CA , users [] string ) error {
106
+ func (lp * LocalPKI ) GenerateClusterCertificates (p * Plan , ca * tls.CA ) error {
102
107
if lp .Log == nil {
103
108
lp .Log = ioutil .Discard
104
109
}
@@ -134,17 +139,15 @@ func (lp *LocalPKI) GenerateClusterCertificates(p *Plan, ca *tls.CA, users []str
134
139
if err := lp .generateServiceAccountCert (p , ca ); err != nil {
135
140
return err
136
141
}
137
- // Finally, create certs for user if they are missing
138
- for _ , user := range users {
139
- if err := lp .generateUserCert (p , user , ca ); err != nil {
140
- return err
141
- }
142
+ // Create the admin user's certificate
143
+ if err := lp .generateUserCert (p , ca , adminUser , []string {adminGroup }); err != nil {
144
+ return err
142
145
}
143
146
return nil
144
147
}
145
148
146
149
// ValidateClusterCertificates validates all certificates in the cluster
147
- func (lp * LocalPKI ) ValidateClusterCertificates (p * Plan , users [] string ) (warn []error , err []error ) {
150
+ func (lp * LocalPKI ) ValidateClusterCertificates (p * Plan ) (warn []error , err []error ) {
148
151
if lp .Log == nil {
149
152
lp .Log = ioutil .Discard
150
153
}
@@ -183,20 +186,18 @@ func (lp *LocalPKI) ValidateClusterCertificates(p *Plan, users []string) (warn [
183
186
if err != nil {
184
187
err = append (err , saErr )
185
188
}
186
- // Finally, create certs for user if they are missing
187
- for _ , user := range users {
188
- _ , userWarn , userErr := lp .validateUserCert (user )
189
- warn = append (warn , userWarn ... )
190
- if err != nil {
191
- err = append (err , userErr )
192
- }
189
+ // Validate admin certificate
190
+ _ , userWarn , userErr := lp .validateUserCert (adminUser , []string {adminGroup })
191
+ warn = append (warn , userWarn ... )
192
+ if err != nil {
193
+ err = append (err , userErr )
193
194
}
194
195
return warn , err
195
196
}
196
197
197
198
// GenerateNodeCertificate creates a private key and certificate for the given node
198
199
func (lp * LocalPKI ) GenerateNodeCertificate (plan * Plan , node Node , ca * tls.CA ) error {
199
- CN := node .Host
200
+ commonName := node .Host
200
201
// Build list of SANs
201
202
clusterSANs , err := clusterCertsSubjectAlternateNames (plan )
202
203
if err != nil {
@@ -216,7 +217,7 @@ func (lp *LocalPKI) GenerateNodeCertificate(plan *Plan, node Node, ca *tls.CA) e
216
217
}
217
218
218
219
// Don't generate if the key pair exists and valid
219
- valid , warn , err := tls .CertExistsAndValid (CN , nodeSANs , node .Host , lp .GeneratedCertsDirectory )
220
+ valid , warn , err := tls .CertExistsAndValid (commonName , nodeSANs , [] string {} , node .Host , lp .GeneratedCertsDirectory )
220
221
if err != nil {
221
222
return err
222
223
}
@@ -232,7 +233,7 @@ func (lp *LocalPKI) GenerateNodeCertificate(plan *Plan, node Node, ca *tls.CA) e
232
233
233
234
util .PrettyPrintOk (lp .Log , "Generating certificates for host %q" , node .Host )
234
235
235
- key , cert , err := generateCert (CN , plan , nodeSANs , ca )
236
+ key , cert , err := generateCert (ca , commonName , nodeSANs )
236
237
if err != nil {
237
238
return fmt .Errorf ("error during cluster cert generation: %v" , err )
238
239
}
@@ -263,17 +264,17 @@ func (lp *LocalPKI) validateNodeCertificate(p *Plan, node Node) (valid bool, war
263
264
}
264
265
}
265
266
266
- return tls .CertExistsAndValid (CN , nodeSANs , node .Host , lp .GeneratedCertsDirectory )
267
+ return tls .CertExistsAndValid (CN , nodeSANs , [] string {}, node .Host , lp .GeneratedCertsDirectory )
267
268
}
268
269
269
270
func (lp * LocalPKI ) generateDockerRegistryCert (p * Plan , ca * tls.CA ) error {
270
271
// Default registry will be deployed on the first master
271
272
n := p .Master .Nodes [0 ]
272
- CN := n .Host
273
+ commonName := n .Host
273
274
SANs := []string {n .Host , n .IP , n .InternalIP }
274
275
275
276
// Don't generate if the key pair exists and valid
276
- valid , warn , err := tls .CertExistsAndValid (CN , SANs , "docker" , lp .GeneratedCertsDirectory )
277
+ valid , warn , err := tls .CertExistsAndValid (commonName , SANs , [] string {}, dockerRegistryCertFilename , lp .GeneratedCertsDirectory )
277
278
if err != nil {
278
279
return err
279
280
}
@@ -289,11 +290,11 @@ func (lp *LocalPKI) generateDockerRegistryCert(p *Plan, ca *tls.CA) error {
289
290
290
291
util .PrettyPrintOk (lp .Log , "Generating certificates for docker registry" )
291
292
292
- dockerKey , dockerCert , err := generateCert (CN , p , SANs , ca )
293
+ dockerKey , dockerCert , err := generateCert (ca , commonName , SANs )
293
294
if err != nil {
294
295
return fmt .Errorf ("error during user cert generation: %v" , err )
295
296
}
296
- err = tls .WriteCert (dockerKey , dockerCert , "docker" , lp .GeneratedCertsDirectory )
297
+ err = tls .WriteCert (dockerKey , dockerCert , dockerRegistryCertFilename , lp .GeneratedCertsDirectory )
297
298
if err != nil {
298
299
return fmt .Errorf ("error writing cert files for docker registry" )
299
300
}
@@ -306,16 +307,13 @@ func (lp *LocalPKI) validateDockerRegistryCert(p *Plan) (valid bool, warn []erro
306
307
CN := n .Host
307
308
SANs := []string {n .Host , n .IP , n .InternalIP }
308
309
309
- return tls .CertExistsAndValid (CN , SANs , "docker" , lp .GeneratedCertsDirectory )
310
+ return tls .CertExistsAndValid (CN , SANs , [] string {}, dockerRegistryCertFilename , lp .GeneratedCertsDirectory )
310
311
}
311
312
312
313
func (lp * LocalPKI ) generateServiceAccountCert (p * Plan , ca * tls.CA ) error {
313
- CN := "kube-service-account"
314
314
SANs := []string {}
315
- certName := "service-account"
316
-
317
315
// Don't generate if the key pair exists and valid
318
- valid , warn , err := tls .CertExistsAndValid (CN , SANs , certName , lp .GeneratedCertsDirectory )
316
+ valid , warn , err := tls .CertExistsAndValid (serviceAccountCertCommonName , SANs , [] string {}, serviceAccountCertFilename , lp .GeneratedCertsDirectory )
319
317
if err != nil {
320
318
return err
321
319
}
@@ -328,32 +326,28 @@ func (lp *LocalPKI) generateServiceAccountCert(p *Plan, ca *tls.CA) error {
328
326
util .PrettyPrintOk (lp .Log , "Found key and certificate for service accounts" )
329
327
return nil
330
328
}
331
-
332
329
util .PrettyPrintOk (lp .Log , "Generating certificates for service accounts" )
333
330
334
- key , cert , err := generateCert (CN , p , SANs , ca )
331
+ key , cert , err := generateCert (ca , serviceAccountCertCommonName , SANs )
335
332
if err != nil {
336
333
return fmt .Errorf ("error generating service account certs: %v" , err )
337
334
}
338
- if err = tls .WriteCert (key , cert , certName , lp .GeneratedCertsDirectory ); err != nil {
335
+ if err = tls .WriteCert (key , cert , serviceAccountCertFilename , lp .GeneratedCertsDirectory ); err != nil {
339
336
return fmt .Errorf ("error writing generated service account cert: %v" , err )
340
337
}
341
338
return nil
342
339
}
343
340
344
341
func (lp * LocalPKI ) validateServiceAccountCert () (valid bool , warn []error , err error ) {
345
- CN := "kube-service-account"
346
342
SANs := []string {}
347
- certName := "service-account"
348
-
349
- return tls .CertExistsAndValid (CN , SANs , certName , lp .GeneratedCertsDirectory )
343
+ return tls .CertExistsAndValid (serviceAccountCertCommonName , SANs , []string {}, serviceAccountCertFilename , lp .GeneratedCertsDirectory )
350
344
}
351
345
352
- func (lp * LocalPKI ) generateUserCert (p * Plan , user string , ca * tls.CA ) error {
346
+ func (lp * LocalPKI ) generateUserCert (p * Plan , ca * tls.CA , user string , groups [] string ) error {
353
347
SANs := []string {user }
354
348
355
349
// Don't generate if the key pair exists and valid
356
- valid , warn , err := tls .CertExistsAndValid (user , SANs , user , lp .GeneratedCertsDirectory )
350
+ valid , warn , err := tls .CertExistsAndValid (user , SANs , groups , user , lp .GeneratedCertsDirectory )
357
351
if err != nil {
358
352
return err
359
353
}
@@ -369,7 +363,7 @@ func (lp *LocalPKI) generateUserCert(p *Plan, user string, ca *tls.CA) error {
369
363
370
364
util .PrettyPrintOk (lp .Log , "Generating certificates for user %q" , user )
371
365
372
- adminKey , adminCert , err := generateCert (user , p , SANs , ca )
366
+ adminKey , adminCert , err := generateCert (ca , user , SANs , groups ... )
373
367
if err != nil {
374
368
return fmt .Errorf ("error during user cert generation: %v" , err )
375
369
}
@@ -380,15 +374,14 @@ func (lp *LocalPKI) generateUserCert(p *Plan, user string, ca *tls.CA) error {
380
374
return nil
381
375
}
382
376
383
- func (lp * LocalPKI ) validateUserCert (user string ) (valid bool , warn []error , err error ) {
377
+ func (lp * LocalPKI ) validateUserCert (user string , groups [] string ) (valid bool , warn []error , err error ) {
384
378
SANs := []string {user }
385
-
386
- return tls .CertExistsAndValid (user , SANs , user , lp .GeneratedCertsDirectory )
379
+ return tls .CertExistsAndValid (user , SANs , groups , user , lp .GeneratedCertsDirectory )
387
380
}
388
381
389
- func generateCert (cnName string , p * Plan , hostList []string , ca * tls. CA ) (key , cert []byte , err error ) {
382
+ func generateCert (ca * tls. CA , commonName string , hostList []string , organizations ... string ) (key , cert []byte , err error ) {
390
383
req := csr.CertificateRequest {
391
- CN : cnName ,
384
+ CN : commonName ,
392
385
KeyRequest : & csr.BasicKeyRequest {
393
386
A : "rsa" ,
394
387
S : 2048 ,
@@ -406,7 +399,7 @@ func generateCert(cnName string, p *Plan, hostList []string, ca *tls.CA) (key, c
406
399
}
407
400
key , cert , err = tls .NewCert (ca , req )
408
401
if err != nil {
409
- return nil , nil , fmt .Errorf ("error generating certs for %q: %v" , cnName , err )
402
+ return nil , nil , fmt .Errorf ("error generating certs for %q: %v" , commonName , err )
410
403
}
411
404
return key , cert , err
412
405
}
0 commit comments