@@ -8,100 +8,97 @@ import (
8
8
"crypto/x509/pkix"
9
9
"fmt"
10
10
"math/big"
11
- "sync"
12
11
"time"
13
12
14
13
"github.com/zalando-incubator/kube-ingress-aws-controller/certs"
15
14
)
16
15
17
- type caSingleton struct {
18
- once sync.Once
19
- err error
16
+ type CA struct {
20
17
chainKey * rsa.PrivateKey
21
18
roots * x509.CertPool
22
19
chainCert * x509.Certificate
23
20
}
24
21
25
- type CertificateProvider struct {
26
- ca caSingleton
27
- }
22
+ func NewCA () (* CA , error ) {
23
+ const tenYears = time .Hour * 24 * 365 * 10
28
24
29
- func (m * CertificateProvider ) GetCertificates (ctx context.Context ) ([]* certs.CertificateSummary , error ) {
30
- tenYears := time .Hour * 24 * 365 * 10
31
- altNames := []string {"foo.bar.org" }
32
- arn := "DUMMY"
33
- notBefore := time .Now ()
34
- notAfter := time .Now ().Add (time .Hour * 24 )
25
+ caKey , err := rsa .GenerateKey (rand .Reader , 2048 )
26
+ if err != nil {
27
+ return nil , fmt .Errorf ("unable to generate CA key: %w" , err )
28
+ }
35
29
36
- m .ca .once .Do (func () {
37
- caKey , err := rsa .GenerateKey (rand .Reader , 2048 )
38
- if err != nil {
39
- m .ca .err = fmt .Errorf ("unable to generate CA key: %w" , err )
40
- return
41
- }
30
+ caCert := x509.Certificate {
31
+ SerialNumber : big .NewInt (1 ),
32
+ Subject : pkix.Name {
33
+ Organization : []string {"Testing CA" },
34
+ },
35
+ NotBefore : time.Time {},
36
+ NotAfter : time .Now ().Add (tenYears ),
42
37
43
- caCert := x509.Certificate {
44
- SerialNumber : big .NewInt (1 ),
45
- Subject : pkix.Name {
46
- Organization : []string {"Testing CA" },
47
- },
48
- NotBefore : time.Time {},
49
- NotAfter : time .Now ().Add (tenYears ),
38
+ KeyUsage : x509 .KeyUsageKeyEncipherment | x509 .KeyUsageDigitalSignature | x509 .KeyUsageCertSign ,
39
+ BasicConstraintsValid : true ,
50
40
51
- KeyUsage : x509 . KeyUsageKeyEncipherment | x509 . KeyUsageDigitalSignature | x509 . KeyUsageCertSign ,
52
- BasicConstraintsValid : true ,
41
+ IsCA : true ,
42
+ }
53
43
54
- IsCA : true ,
55
- }
56
- caBody , err := x509 .CreateCertificate (rand .Reader , & caCert , & caCert , caKey .Public (), caKey )
57
- if err != nil {
58
- m .ca .err = fmt .Errorf ("unable to generate CA certificate: %w" , err )
59
- return
60
- }
61
- caReparsed , err := x509 .ParseCertificate (caBody )
62
- if err != nil {
63
- m .ca .err = fmt .Errorf ("unable to parse CA certificate: %w" , err )
64
- return
65
- }
66
- m .ca .roots = x509 .NewCertPool ()
67
- m .ca .roots .AddCert (caReparsed )
44
+ caBody , err := x509 .CreateCertificate (rand .Reader , & caCert , & caCert , caKey .Public (), caKey )
45
+ if err != nil {
46
+ return nil , fmt .Errorf ("unable to generate CA certificate: %w" , err )
47
+ }
68
48
69
- chainKey , err := rsa .GenerateKey (rand .Reader , 2048 )
70
- if err != nil {
71
- m .ca .err = fmt .Errorf ("unable to generate sub-CA key: %w" , err )
72
- return
73
- }
74
- chainCert := x509.Certificate {
75
- SerialNumber : big .NewInt (2 ),
76
- Subject : pkix.Name {
77
- Organization : []string {"Testing Sub-CA" },
78
- },
79
- NotBefore : time.Time {},
80
- NotAfter : time .Now ().Add (tenYears ),
81
-
82
- KeyUsage : x509 .KeyUsageKeyEncipherment | x509 .KeyUsageDigitalSignature | x509 .KeyUsageCertSign ,
83
- BasicConstraintsValid : true ,
84
-
85
- IsCA : true ,
86
- }
87
- chainBody , err := x509 .CreateCertificate (rand .Reader , & chainCert , caReparsed , chainKey .Public (), caKey )
88
- if err != nil {
89
- m .ca .err = fmt .Errorf ("unable to generate sub-CA certificate: %w" , err )
90
- }
91
- chainReparsed , err := x509 .ParseCertificate (chainBody )
92
- if err != nil {
93
- m .ca .err = fmt .Errorf ("unable to parse sub-CA certificate: %w" , err )
94
- return
95
- }
49
+ caReparsed , err := x509 .ParseCertificate (caBody )
50
+ if err != nil {
51
+ return nil , fmt .Errorf ("unable to parse CA certificate: %w" , err )
52
+ }
53
+
54
+ chainKey , err := rsa .GenerateKey (rand .Reader , 2048 )
55
+ if err != nil {
56
+ return nil , fmt .Errorf ("unable to generate sub-CA key: %w" , err )
57
+ }
58
+ chainCert := x509.Certificate {
59
+ SerialNumber : big .NewInt (2 ),
60
+ Subject : pkix.Name {
61
+ Organization : []string {"Testing Sub-CA" },
62
+ },
63
+ NotBefore : time.Time {},
64
+ NotAfter : time .Now ().Add (tenYears ),
65
+
66
+ KeyUsage : x509 .KeyUsageKeyEncipherment | x509 .KeyUsageDigitalSignature | x509 .KeyUsageCertSign ,
67
+ BasicConstraintsValid : true ,
68
+
69
+ IsCA : true ,
70
+ }
71
+
72
+ chainBody , err := x509 .CreateCertificate (rand .Reader , & chainCert , caReparsed , chainKey .Public (), caKey )
73
+ if err != nil {
74
+ return nil , fmt .Errorf ("unable to generate sub-CA certificate: %w" , err )
75
+ }
76
+
77
+ chainReparsed , err := x509 .ParseCertificate (chainBody )
78
+ if err != nil {
79
+ return nil , fmt .Errorf ("unable to parse sub-CA certificate: %w" , err )
80
+ }
81
+
82
+ ca := new (CA )
83
+ ca .roots = x509 .NewCertPool ()
84
+ ca .roots .AddCert (caReparsed )
85
+ ca .chainKey = chainKey
86
+ ca .chainCert = chainReparsed
87
+
88
+ return ca , nil
89
+ }
96
90
97
- m .ca .chainKey = chainKey
98
- m .ca .chainCert = chainReparsed
99
- })
91
+ func (ca * CA ) NewCertificateSummary () (* certs.CertificateSummary , error ) {
92
+ altNames := []string {"foo.bar.org" }
93
+ arn := "DUMMY"
94
+ notBefore := time .Now ()
95
+ notAfter := time .Now ().Add (time .Hour * 24 )
100
96
101
97
certKey , err := rsa .GenerateKey (rand .Reader , 2048 )
102
98
if err != nil {
103
99
return nil , fmt .Errorf ("unable to generate certificate key: %w" , err )
104
100
}
101
+
105
102
cert := x509.Certificate {
106
103
SerialNumber : big .NewInt (3 ),
107
104
DNSNames : altNames ,
@@ -113,17 +110,27 @@ func (m *CertificateProvider) GetCertificates(ctx context.Context) ([]*certs.Cer
113
110
BasicConstraintsValid : true ,
114
111
}
115
112
116
- body , err := x509 .CreateCertificate (rand .Reader , & cert , m . ca .chainCert , certKey .Public (), m . ca .chainKey )
113
+ body , err := x509 .CreateCertificate (rand .Reader , & cert , ca .chainCert , certKey .Public (), ca .chainKey )
117
114
if err != nil {
118
115
return nil , err
119
116
}
117
+
120
118
reparsed , err := x509 .ParseCertificate (body )
121
119
if err != nil {
122
120
return nil , err
123
121
}
124
122
125
- c := certs .NewCertificate (arn , reparsed , []* x509.Certificate {m .ca .chainCert })
126
- return []* certs.CertificateSummary {c .WithRoots (m .ca .roots )}, nil
123
+ c := certs .NewCertificate (arn , reparsed , []* x509.Certificate {ca .chainCert })
124
+ return c .WithRoots (ca .roots ), nil
125
+ }
126
+
127
+ type CertificateProvider struct {
128
+ Summaries []* certs.CertificateSummary
129
+ Error error
130
+ }
131
+
132
+ func (m * CertificateProvider ) GetCertificates (_ context.Context ) ([]* certs.CertificateSummary , error ) {
133
+ return m .Summaries , m .Error
127
134
}
128
135
129
136
// certmock implements CertificatesFinder for testing, without validating
0 commit comments