@@ -17,6 +17,7 @@ limitations under the License.
17
17
package main
18
18
19
19
import (
20
+ "cmp"
20
21
"crypto/rand"
21
22
"crypto/rsa"
22
23
"crypto/x509"
@@ -29,7 +30,7 @@ import (
29
30
"github.com/gravitational/trace"
30
31
)
31
32
32
- // MTLSCerts is the result for mTLS struct generator
33
+ // MTLSCerts is the result for mTLS certificate generator.
33
34
type MTLSCerts struct {
34
35
// caCert is a CA certificate struct used to generate mTLS CA cert and private key
35
36
caCert x509.Certificate
@@ -47,26 +48,18 @@ type MTLSCerts struct {
47
48
48
49
// keyPair is the pair of certificate and private key
49
50
type keyPair struct {
50
- // PrivateKey represents certificate private key
51
- PrivateKey * rsa.PrivateKey
52
- // Certificate represents certificate
51
+ PrivateKey * rsa.PrivateKey
53
52
Certificate []byte
54
53
}
55
54
56
- // GenerateMTLSCerts creates new MTLS certificate generator
55
+ // GenerateMTLSCerts generates server and client TLS certificates.
57
56
func GenerateMTLSCerts (dnsNames []string , ips []string , ttl time.Duration , length int ) (* MTLSCerts , error ) {
58
57
notBefore := time .Now ()
59
58
notAfter := notBefore .Add (ttl )
60
59
61
- caDistinguishedName := pkix.Name {
62
- CommonName : "CA" ,
63
- }
64
- serverDistinguishedName := pkix.Name {
65
- CommonName : "Server" ,
66
- }
67
- clientDistinguishedName := pkix.Name {
68
- CommonName : "Client" ,
69
- }
60
+ caDistinguishedName := pkix.Name {CommonName : "CA" }
61
+ serverDistinguishedName := pkix.Name {CommonName : "Server" }
62
+ clientDistinguishedName := pkix.Name {CommonName : "Client" }
70
63
71
64
c := & MTLSCerts {
72
65
caCert : x509.Certificate {
@@ -98,66 +91,33 @@ func GenerateMTLSCerts(dnsNames []string, ips []string, ttl time.Duration, lengt
98
91
}
99
92
100
93
// Generate and assign serial numbers
101
- sn , err := rand .Int (rand .Reader , maxBigInt )
102
- if err != nil {
103
- return nil , trace .Wrap (err )
104
- }
105
-
106
- c .caCert .SerialNumber = sn
107
-
108
- sn , err = rand .Int (rand .Reader , maxBigInt )
109
- if err != nil {
110
- return nil , trace .Wrap (err )
111
- }
112
-
113
- c .clientCert .SerialNumber = sn
114
-
115
- sn , err = rand .Int (rand .Reader , maxBigInt )
116
- if err != nil {
117
- return nil , trace .Wrap (err )
94
+ for _ , cert := range []* x509.Certificate {& c .caCert , & c .clientCert , & c .serverCert } {
95
+ sn , err := rand .Int (rand .Reader , maxBigInt )
96
+ if err != nil {
97
+ return nil , trace .Wrap (err )
98
+ }
99
+ cert .SerialNumber = sn
118
100
}
119
101
120
- c .serverCert .SerialNumber = sn
121
-
122
102
// Append SANs and IPs to Server and Client certs
123
- if err := c .appendSANs (& c .serverCert , dnsNames , ips ); err != nil {
124
- return nil , trace .Wrap (err )
125
- }
126
- if err := c .appendSANs (& c .clientCert , dnsNames , ips ); err != nil {
127
- return nil , trace .Wrap (err )
128
- }
103
+ c .appendSANs (& c .serverCert , dnsNames , ips )
104
+ c .appendSANs (& c .clientCert , dnsNames , ips )
129
105
130
106
// Run the generator
131
- err = c .generate (length )
132
- if err != nil {
133
- return c , err
107
+ if err := c .generate (length ); err != nil {
108
+ return c , trace .Wrap (err )
134
109
}
135
110
136
111
return c , nil
137
112
}
138
113
139
114
// appendSANs appends subjectAltName hosts and IPs
140
- func (c MTLSCerts ) appendSANs (cert * x509.Certificate , dnsNames []string , ips []string ) error {
115
+ func (MTLSCerts ) appendSANs (cert * x509.Certificate , dnsNames []string , ips []string ) {
141
116
cert .DNSNames = dnsNames
142
117
143
- if len (ips ) == 0 {
144
- for _ , name := range dnsNames {
145
- ips , err := net .LookupIP (name )
146
- if err != nil {
147
- return trace .Wrap (err )
148
- }
149
-
150
- if ips != nil {
151
- cert .IPAddresses = append (cert .IPAddresses , ips ... )
152
- }
153
- }
154
- } else {
155
- for _ , ip := range ips {
156
- cert .IPAddresses = append (cert .IPAddresses , net .ParseIP (ip ))
157
- }
118
+ for _ , ip := range ips {
119
+ cert .IPAddresses = append (cert .IPAddresses , net .ParseIP (ip ))
158
120
}
159
-
160
- return nil
161
121
}
162
122
163
123
// Generate generates CA, server and client certificates
@@ -193,16 +153,8 @@ func (c *MTLSCerts) genCertAndPK(length int, cert *x509.Certificate, parent *x50
193
153
}
194
154
195
155
// Check if it's self-signed, assign signer and parent to self
196
- s := signer
197
- p := parent
198
-
199
- if s == nil {
200
- s = pk
201
- }
202
-
203
- if p == nil {
204
- p = cert
205
- }
156
+ s := cmp .Or (signer , pk )
157
+ p := cmp .Or (parent , cert )
206
158
207
159
// Generate and sign cert
208
160
certBytes , err := x509 .CreateCertificate (rand .Reader , cert , p , & pk .PublicKey , s )
0 commit comments