Skip to content

Commit 6fc2dfe

Browse files
do not panic when loading a V2 CA certificate, but don't try to use it either
1 parent 9bfdfba commit 6fc2dfe

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

cert/ca.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@ func NewCAPoolFromBytes(caPEMs []byte) (*NebulaCAPool, error) {
3030
pool := NewCAPool()
3131
var err error
3232
var expired bool
33+
var caTooNew bool
3334
for {
3435
caPEMs, err = pool.AddCACertificate(caPEMs)
3536
if errors.Is(err, ErrExpired) {
3637
expired = true
3738
err = nil
39+
} else if errors.Is(err, ErrInvalidPEMCertificateUnsupported) {
40+
caTooNew = true
41+
err = nil
3842
}
3943
if err != nil {
4044
return nil, err
@@ -46,6 +50,8 @@ func NewCAPoolFromBytes(caPEMs []byte) (*NebulaCAPool, error) {
4650

4751
if expired {
4852
return pool, ErrExpired
53+
} else if caTooNew {
54+
return pool, ErrInvalidPEMCertificateUnsupported
4955
}
5056

5157
return pool, nil

cert/cert.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const publicKeyLen = 32
2828

2929
const (
3030
CertBanner = "NEBULA CERTIFICATE"
31+
CertificateV2Banner = "NEBULA CERTIFICATE V2"
3132
X25519PrivateKeyBanner = "NEBULA X25519 PRIVATE KEY"
3233
X25519PublicKeyBanner = "NEBULA X25519 PUBLIC KEY"
3334
EncryptedEd25519PrivateKeyBanner = "NEBULA ED25519 ENCRYPTED PRIVATE KEY"
@@ -163,6 +164,9 @@ func UnmarshalNebulaCertificateFromPEM(b []byte) (*NebulaCertificate, []byte, er
163164
if p == nil {
164165
return nil, r, fmt.Errorf("input did not contain a valid PEM encoded block")
165166
}
167+
if p.Type == CertificateV2Banner {
168+
return nil, r, ErrInvalidPEMCertificateUnsupported
169+
}
166170
if p.Type != CertBanner {
167171
return nil, r, fmt.Errorf("bytes did not contain a proper nebula certificate banner")
168172
}

cert/cert_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,13 @@ CmYKEG5lYnVsYSBQMjU2IHRlc3Qo4s+7mgYw4tXrsAc6QQRkaW2jFmllYvN4+/k2
572572
76gvQAGgBgESRzBFAiEAib0/te6eMiZOKD8gdDeloMTS0wGuX2t0C7TFdUhAQzgC
573573
IBNWYMep3ysx9zCgknfG5dKtwGTaqF++BWKDYdyl34KX
574574
-----END NEBULA CERTIFICATE-----
575+
`
576+
577+
v2 := `
578+
# valid PEM with the V2 header
579+
-----BEGIN NEBULA CERTIFICATE V2-----
580+
CmYKEG5lYnVsYSBQMjU2IHRlc3Qo4s+7mgYw4tXrsAc6QQRkaW2jFmllYvN4+/k2
581+
-----END NEBULA CERTIFICATE V2-----
575582
`
576583

577584
rootCA := NebulaCertificate{
@@ -619,6 +626,11 @@ IBNWYMep3ysx9zCgknfG5dKtwGTaqF++BWKDYdyl34KX
619626
assert.Nil(t, err)
620627
assert.Equal(t, ppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Details.Name, rootCAP256.Details.Name)
621628
assert.Equal(t, len(ppppp.CAs), 1)
629+
630+
pppppp, err := NewCAPoolFromBytes(append([]byte(p256), []byte(v2)...))
631+
assert.Equal(t, err, ErrInvalidPEMCertificateUnsupported)
632+
assert.Equal(t, pppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Details.Name, rootCAP256.Details.Name)
633+
assert.Equal(t, len(pppppp.CAs), 1)
622634
}
623635

624636
func appendByteSlices(b ...[]byte) []byte {

cert/errors.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import (
55
)
66

77
var (
8-
ErrRootExpired = errors.New("root certificate is expired")
9-
ErrExpired = errors.New("certificate is expired")
10-
ErrNotCA = errors.New("certificate is not a CA")
11-
ErrNotSelfSigned = errors.New("certificate is not self-signed")
12-
ErrBlockListed = errors.New("certificate is in the block list")
13-
ErrSignatureMismatch = errors.New("certificate signature did not match")
8+
ErrRootExpired = errors.New("root certificate is expired")
9+
ErrExpired = errors.New("certificate is expired")
10+
ErrNotCA = errors.New("certificate is not a CA")
11+
ErrNotSelfSigned = errors.New("certificate is not self-signed")
12+
ErrBlockListed = errors.New("certificate is in the block list")
13+
ErrSignatureMismatch = errors.New("certificate signature did not match")
14+
ErrInvalidPEMCertificateUnsupported = errors.New("bytes contain an unsupported certificate format")
1415
)

pki.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ func loadCAPoolFromConfig(l *logrus.Logger, c *config.C) (*cert.NebulaCAPool, er
237237
return nil, errors.New("no valid CA certificates present")
238238
}
239239

240+
} else if errors.Is(err, cert.ErrInvalidPEMCertificateUnsupported) {
241+
l.WithError(err).Warn("At least one configured CA is unsupported by this version of nebula. It has been ignored.")
240242
} else if err != nil {
241243
return nil, fmt.Errorf("error while adding CA certificate to CA trust store: %s", err)
242244
}

0 commit comments

Comments
 (0)