Skip to content

Commit 061cbb9

Browse files
authored
event-handler: allow DNS alternative names that don't resolve (#53006)
Remove the requirement that the DNS name resolves in order for it to be included in the configured certificates. This also changes the API so that IP SANs and DNS names are no longer mutually exclusive. Closes #52981
1 parent 6119e09 commit 061cbb9

File tree

3 files changed

+29
-75
lines changed

3 files changed

+29
-75
lines changed

integrations/event-handler/fake_fluentd_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func NewFakeFluentd(t *testing.T) *FakeFluentd {
6666

6767
// writeCerts generates and writes temporary mTLS keys
6868
func (f *FakeFluentd) writeCerts() error {
69-
g, err := GenerateMTLSCerts([]string{"localhost"}, []string{}, time.Hour, 1024)
69+
g, err := GenerateMTLSCerts([]string{"localhost"}, []string{"127.0.0.1"}, time.Hour, 1024)
7070
if err != nil {
7171
return trace.Wrap(err)
7272
}

integrations/event-handler/mtls_certs.go

+22-70
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"cmp"
2021
"crypto/rand"
2122
"crypto/rsa"
2223
"crypto/x509"
@@ -29,7 +30,7 @@ import (
2930
"github.com/gravitational/trace"
3031
)
3132

32-
// MTLSCerts is the result for mTLS struct generator
33+
// MTLSCerts is the result for mTLS certificate generator.
3334
type MTLSCerts struct {
3435
// caCert is a CA certificate struct used to generate mTLS CA cert and private key
3536
caCert x509.Certificate
@@ -47,26 +48,18 @@ type MTLSCerts struct {
4748

4849
// keyPair is the pair of certificate and private key
4950
type keyPair struct {
50-
// PrivateKey represents certificate private key
51-
PrivateKey *rsa.PrivateKey
52-
// Certificate represents certificate
51+
PrivateKey *rsa.PrivateKey
5352
Certificate []byte
5453
}
5554

56-
// GenerateMTLSCerts creates new MTLS certificate generator
55+
// GenerateMTLSCerts generates server and client TLS certificates.
5756
func GenerateMTLSCerts(dnsNames []string, ips []string, ttl time.Duration, length int) (*MTLSCerts, error) {
5857
notBefore := time.Now()
5958
notAfter := notBefore.Add(ttl)
6059

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"}
7063

7164
c := &MTLSCerts{
7265
caCert: x509.Certificate{
@@ -98,66 +91,33 @@ func GenerateMTLSCerts(dnsNames []string, ips []string, ttl time.Duration, lengt
9891
}
9992

10093
// 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
118100
}
119101

120-
c.serverCert.SerialNumber = sn
121-
122102
// 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)
129105

130106
// 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)
134109
}
135110

136111
return c, nil
137112
}
138113

139114
// 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) {
141116
cert.DNSNames = dnsNames
142117

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))
158120
}
159-
160-
return nil
161121
}
162122

163123
// Generate generates CA, server and client certificates
@@ -193,16 +153,8 @@ func (c *MTLSCerts) genCertAndPK(length int, cert *x509.Certificate, parent *x50
193153
}
194154

195155
// 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)
206158

207159
// Generate and sign cert
208160
certBytes, err := x509.CreateCertificate(rand.Reader, cert, p, &pk.PublicKey, s)

integrations/event-handler/mtls_certs_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"crypto/x509"
2121
"encoding/pem"
2222
"io"
23+
"net"
2324
"os"
2425
"path/filepath"
2526
"testing"
@@ -34,11 +35,11 @@ func TestGenerateClientCertFile(t *testing.T) {
3435
kp := "client.key"
3536

3637
// Generate certs in memory
37-
certs, err := GenerateMTLSCerts([]string{"localhost"}, nil, time.Second, 1024)
38+
certs, err := GenerateMTLSCerts([]string{"localhost"}, []string{"127.0.0.1"}, time.Second, 1024)
3839
require.NoError(t, err)
39-
require.NotNil(t, certs.caCert.Issuer)
40-
require.NotNil(t, certs.clientCert.Issuer)
41-
require.NotNil(t, certs.serverCert.Issuer)
40+
require.NotZero(t, certs.caCert.Issuer)
41+
require.NotZero(t, certs.clientCert.Issuer)
42+
require.NotZero(t, certs.serverCert.Issuer)
4243
// don't be self-signed
4344
require.NotEqual(t, certs.serverCert.Issuer, certs.serverCert.Subject)
4445
require.NotEqual(t, certs.clientCert.Issuer, certs.clientCert.Subject)
@@ -58,6 +59,7 @@ func TestGenerateClientCertFile(t *testing.T) {
5859
require.NotEmpty(t, certs.clientCert.DNSNames)
5960
// server leaf cert should have SAN DNS:localhost
6061
require.Equal(t, "localhost", certs.serverCert.DNSNames[0])
62+
require.Equal(t, net.ParseIP("127.0.0.1"), certs.serverCert.IPAddresses[0])
6163

6264
// Write the cert to the tempdir
6365
err = certs.ClientCert.WriteFile(filepath.Join(td, cp), filepath.Join(td, kp), ".")

0 commit comments

Comments
 (0)