Skip to content

Commit

Permalink
do not panic when loading a V2 CA certificate, but don't try to use i…
Browse files Browse the repository at this point in the history
…t either
  • Loading branch information
JackDoanRivian committed Nov 25, 2024
1 parent 3e6c755 commit 1c1faff
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 2 deletions.
6 changes: 6 additions & 0 deletions cert/ca_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@ func NewCAPoolFromPEM(caPEMs []byte) (*CAPool, error) {
pool := NewCAPool()
var err error
var expired bool
var caTooNew bool
for {
caPEMs, err = pool.AddCAFromPEM(caPEMs)
if errors.Is(err, ErrExpired) {
expired = true
err = nil
} else if errors.Is(err, ErrInvalidPEMCertificateUnsupported) {
caTooNew = true
err = nil
}
if err != nil {
return nil, err
Expand All @@ -48,6 +52,8 @@ func NewCAPoolFromPEM(caPEMs []byte) (*CAPool, error) {

if expired {
return pool, ErrExpired
} else if caTooNew {
return pool, ErrInvalidPEMCertificateUnsupported
}

return pool, nil
Expand Down
12 changes: 12 additions & 0 deletions cert/ca_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ CmYKEG5lYnVsYSBQMjU2IHRlc3Qo4s+7mgYw4tXrsAc6QQRkaW2jFmllYvN4+/k2
76gvQAGgBgESRzBFAiEAib0/te6eMiZOKD8gdDeloMTS0wGuX2t0C7TFdUhAQzgC
IBNWYMep3ysx9zCgknfG5dKtwGTaqF++BWKDYdyl34KX
-----END NEBULA CERTIFICATE-----
`

v2 := `
# valid PEM with the V2 header
-----BEGIN NEBULA CERTIFICATE V2-----
CmYKEG5lYnVsYSBQMjU2IHRlc3Qo4s+7mgYw4tXrsAc6QQRkaW2jFmllYvN4+/k2
-----END NEBULA CERTIFICATE V2-----
`

rootCA := certificateV1{
Expand Down Expand Up @@ -106,4 +113,9 @@ IBNWYMep3ysx9zCgknfG5dKtwGTaqF++BWKDYdyl34KX
assert.Nil(t, err)
assert.Equal(t, ppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Certificate.Name(), rootCAP256.details.Name)
assert.Equal(t, len(ppppp.CAs), 1)

pppppp, err := NewCAPoolFromPEM(append([]byte(p256), []byte(v2)...))
assert.Equal(t, err, ErrInvalidPEMCertificateUnsupported)
assert.Equal(t, pppppp.CAs[string("a7938893ec8c4ef769b06d7f425e5e46f7a7f5ffa49c3bcf4a86b608caba9159")].Certificate.Name(), rootCAP256.details.Name)
assert.Equal(t, len(pppppp.CAs), 1)
}
1 change: 1 addition & 0 deletions cert/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ var (
ErrInvalidPEMX25519PrivateKeyBanner = errors.New("bytes did not contain a proper X25519 private key banner")
ErrInvalidPEMEd25519PublicKeyBanner = errors.New("bytes did not contain a proper Ed25519 public key banner")
ErrInvalidPEMEd25519PrivateKeyBanner = errors.New("bytes did not contain a proper Ed25519 private key banner")
ErrInvalidPEMCertificateUnsupported = errors.New("bytes contain an unsupported certificate format")
)
3 changes: 1 addition & 2 deletions cert/pem.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ func UnmarshalCertificateFromPEM(b []byte) (Certificate, []byte, error) {
}
return c, r, nil
case CertificateV2Banner:
//TODO
panic("TODO")
return nil, r, ErrInvalidPEMCertificateUnsupported
default:
return nil, r, ErrInvalidPEMCertificateBanner
}
Expand Down
2 changes: 2 additions & 0 deletions pki.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,8 @@ func loadCAPoolFromConfig(l *logrus.Logger, c *config.C) (*cert.CAPool, error) {
return nil, errors.New("no valid CA certificates present")
}

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

0 comments on commit 1c1faff

Please sign in to comment.