Skip to content

Commit ab13019

Browse files
committed
add test for the new feature, add logging info
Signed-off-by: Oleksandr Krutko <[email protected]>
1 parent 8d1e160 commit ab13019

File tree

7 files changed

+202
-2
lines changed

7 files changed

+202
-2
lines changed

deploy/crds/trust.cert-manager.io_bundles.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ spec:
410410
type: object
411411
type: object
412412
useCACertsOnly:
413+
default: false
413414
description: Use only CAs certificates in a resulting Bundle
414415
type: boolean
415416
required:

pkg/apis/trust/v1alpha1/types_bundle.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ type BundleSpec struct {
7070
Target BundleTarget `json:"target,omitzero"`
7171

7272
// Use only CAs certificates in a resulting Bundle
73-
// +optional
74-
UseCACertsOnly *bool `json:"useCACertsOnly,omitzero"`
73+
// +kubebuilder:default=false
74+
UseCACertsOnly *bool `json:"useCACertsOnly,omitempty"`
7575
}
7676

7777
// BundleSource is the set of sources whose data will be appended and synced to

pkg/bundle/internal/source/source.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func (b *BundleBuilder) BuildBundle(ctx context.Context, bundle trustapi.BundleS
6767
var sources = bundle.Sources
6868
resolvedBundle.CertPool = util.NewCertPool(
6969
util.WithFilteredExpiredCerts(b.FilterExpiredCerts),
70+
util.WithCACertsOnly(*bundle.UseCACertsOnly),
7071
util.WithLogger(logf.FromContext(ctx).WithName("cert-pool")),
7172
)
7273

pkg/util/cert_pool.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ func WithLogger(logger logr.Logger) Option {
5555
}
5656
}
5757

58+
func WithCACertsOnly(useCACertsOnly bool) Option {
59+
return func(cp *CertPool) {
60+
cp.useCACertsOnly = useCACertsOnly
61+
}
62+
}
63+
5864
// NewCertPool returns a new, empty CertPool.
5965
// It will deduplicate certificates based on their SHA256 hash.
6066
// Optionally, it can filter out expired certificates.
@@ -145,6 +151,7 @@ func (cp *CertPool) AddCert(certificate *x509.Certificate) bool {
145151
}
146152

147153
if cp.useCACertsOnly && !certificate.IsCA {
154+
cp.logger.Info("ignoring non-CA certificate", "certificate", certificate.Subject)
148155
return false
149156
}
150157

pkg/util/cert_pool_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,46 @@ func TestAppendCertFromPEM(t *testing.T) {
9292
})
9393
}
9494
}
95+
96+
// CA certificates only
97+
func TestAppendCACertFromPEM(t *testing.T) {
98+
tests := map[string]struct {
99+
pemData string
100+
filterExpired bool
101+
expError string
102+
expEmpty bool
103+
useCACertsOnly bool
104+
CACertsCount int
105+
}{
106+
"if multiple certificates, should return": {
107+
pemData: dummy.JoinCerts(dummy.TestCertificate1, dummy.TestCertificateNonCA1, dummy.TestCertificate2, dummy.TestCertificate3, dummy.TestCertificateNonCA2),
108+
CACertsCount: 3,
109+
},
110+
}
111+
112+
for name, test := range tests {
113+
t.Run(name, func(t *testing.T) {
114+
t.Parallel()
115+
116+
certPool := NewCertPool(WithCACertsOnly(true))
117+
118+
err := certPool.AddCertsFromPEM([]byte(test.pemData))
119+
if test.expError != "" {
120+
assert.Error(t, err, test.expError)
121+
} else {
122+
assert.NoError(t, err)
123+
}
124+
125+
CACertsList := certPool.Certificates()
126+
if len(CACertsList) != test.CACertsCount {
127+
t.Fatalf("The number of CA certificates isn't equal to expected one: given %d, expected %d", len(CACertsList), test.CACertsCount)
128+
}
129+
130+
for _, cert := range CACertsList {
131+
if !cert.IsCA {
132+
t.Fatalf("there are nonCA certificates in the certificates list")
133+
}
134+
}
135+
})
136+
}
137+
}

test/dummy/certificates.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,130 @@ PQ5qEvRB3rGmtpvWu/p8z4AlMSWFb9C+Qp4NiU2jiPgw0t1DL/vdrvLcYb/ExyJx
477477
/+ZA+ONCt347Do/oMXy8iT4cmNOe28pHLYHkhkbP5d2ajpjSwqH2Q8Gr8AiMM5OO
478478
HYjDRRens0uEsJFTfFBq0YbGiIAHZ1ESs/ipdisdgmLkIDjF8UKRNoBacodAsghV
479479
z40l74JcR+GvcFZWz7/jmJq95YMZ7LawLAr1CaAXxCwsoLbJpbgg4lVo6odACzY=
480+
-----END CERTIFICATE-----`
481+
482+
// Certificate:
483+
// Data:
484+
// Version: 3 (0x2)
485+
// Serial Number:
486+
// 67:bc:27:4c:38:bd:86:8e:64:64:b9:bc:e7:96:c6:fa:4e:78:57:a4
487+
// Signature Algorithm: sha256WithRSAEncryption
488+
// Issuer: C=US, L=Default City, O=Internet Security Research Group, CN=www.example.com
489+
// Validity
490+
// Not Before: Dec 20 15:32:26 2025 GMT
491+
// Not After : Dec 18 15:32:26 2035 GMT
492+
// Subject: C=US, L=Default City, O=Internet Security Research Group, CN=www.example.com
493+
// Subject Public Key Info:
494+
// Public Key Algorithm: rsaEncryption
495+
// Public-Key: (4096 bit)
496+
// Modulus:
497+
// 00:a9:7c:2d:2a:b1:67:0e:90:f8:37:db:c4:d7:7b:
498+
// 7b:00:40:72:8e:d9:44:70:b0:96:38:4c:4f:91:9f:
499+
// ...
500+
// 56:c9:bc:07:0f:87:f3:10:75:0e:3d:3a:1e:83:cc:
501+
// 61:4d:fb
502+
// Exponent: 65537 (0x10001)
503+
// X509v3 extensions:
504+
// X509v3 Subject Key Identifier:
505+
// 6F:F8:A7:F7:66:75:D9:EB:02:25:05:A4:4E:62:C5:D9:85:53:F9:0B
506+
// X509v3 Authority Key Identifier:
507+
// 6F:F8:A7:F7:66:75:D9:EB:02:25:05:A4:4E:62:C5:D9:85:53:F9:0B
508+
// X509v3 Basic Constraints:
509+
// CA:FALSE
510+
TestCertificateNonCA1 = `-----BEGIN CERTIFICATE-----
511+
MIIFrTCCA5WgAwIBAgIUZ7wnTDi9ho5kZLm855bG+k54V6QwDQYJKoZIhvcNAQEL
512+
BQAwaTELMAkGA1UEBhMCVVMxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEpMCcGA1UE
513+
CgwgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxGDAWBgNVBAMMD3d3
514+
dy5leGFtcGxlLmNvbTAeFw0yNTEyMjAxNTMyMjZaFw0zNTEyMTgxNTMyMjZaMGkx
515+
CzAJBgNVBAYTAlVTMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxKTAnBgNVBAoMIElu
516+
dGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRgwFgYDVQQDDA93d3cuZXhh
517+
bXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpfC0qsWcO
518+
kPg328TXe3sAQHKO2URwsJY4TE+Rn99jMHtMwHtgmxPQ/sMlljrhPk5vdf55i0R9
519+
iWm9sEvRynhv2hejr2hV0RAM7Q2+Q4We9Qmn8Bh9+sN60I5YVM1lOmVKUbxDQTFm
520+
D1WrC3NMLuAhnkoJKE1ElAN3f6TWihWhlg4lmN8qbFcZIsGMXmEKXiPPFLqTn0h7
521+
G5HTo0SCOqQnG4qdIW4hdOXVb3dIeX5/yVeKwQJcUWrIcOSONG5SAfbwvUFExp7d
522+
10g/j5r4wWGvvzm9pJzpMLgGCwMoATxHdM7k2twSbIIrulfmCgiqzqqmctUEP3c4
523+
AYbPr/LDtlRqEGxFHlfmnpT9nDETF44enBEeQ75tsj7sguqNOay+/lemM42SnfSt
524+
mrcm14LAvZtpV5+zeyxA4ujczsUybWuWM6jtmRaBbQ4MtPCG3q+GMyroMtJ+AXYH
525+
1sM67AppyTNaxYf5bns+mdCKce9BrOM1Uqqh8R0hikoVTW65WhDdh+iJHU9DAbvC
526+
mIW5NDeyevs/utI3hppLZZ1dyhrQ5U1CjrWZ63sEjy0InCF4OJg8Ck4d8HYe1Ipk
527+
I16pRBe9FAd0AvOZgUXE18o5si6LOOEWkAkf9aw3+CeUs3ijRmsg2vFWgivoz4uE
528+
w8L7+b2cQFbJvAcPh/MQdQ49Oh6DzGFN+wIDAQABo00wSzAdBgNVHQ4EFgQUb/in
529+
92Z12esCJQWkTmLF2YVT+QswHwYDVR0jBBgwFoAUb/in92Z12esCJQWkTmLF2YVT
530+
+QswCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEAfgAjHMI8Kt7uVxvRWo8W
531+
DzmYT7FJYWxBGEng7DJcvb346C9o3Bo/4HDG4t0G/COwpbO5k/7GY9WmOCTi7hD9
532+
s5itXH2Oxvnn2Vmnyf0ZcbzFnJWN7sHHvqB7HBCVCmJdzp1etjr7klXUalIRPp9w
533+
Xpv6XUKBCRAWDVvIiZOfeTHrmF1GHcsbBiSZKn/sD7HbgOY4eHFbwWjEtOynW3i4
534+
YBDmd7IZlUnxUJEGFq+8wuFt1QpjtzZp+zD2ZLKE2hdzoUmIWNPPWtrplvP68yTY
535+
KGtggpbG4rTmaq4C7Y2g56hAbWARgtwa52keGl42vBeIoY6uDuByQG1+uxJlkRhh
536+
vKKL8Nv1Bvv1QBpFZa3WckRbe+vUl+4lWQsaHWjydrv//rxTpKw7NO+y2O5YYwgz
537+
kX7dbrSluYP9KjvawopYqaN362QA+ZDkq17u2jF0H3l78IMoVTEszEME5VF9GuP6
538+
EeuzMl8ttrIwZig/t7TSpVzGyxbNAE2CJQ5Ydt22AaLnZX2BXiBRCNxmi58j/fBH
539+
1dIomzU1yZwcXZwUCga0j9+xEhdG8gdr77G4O0P1BO8Tui6WeNU3DAWWWiuBLWT6
540+
K6WVn0GVZR2gMUZs6Fdi1f5pguIQE10be9VM+m2ei9Cy3rjZLnAKN87D2JJJPm8C
541+
plNZGnaNc9ms+ZvMgFUOQOQ=
542+
-----END CERTIFICATE-----`
543+
544+
// Certificate:
545+
// Data:
546+
// Version: 3 (0x2)
547+
// Serial Number:
548+
// 26:0f:0c:cd:09:53:87:27:55:51:74:7b:d9:4e:c4:e1:ea:cd:6d:2c
549+
// Signature Algorithm: sha256WithRSAEncryption
550+
// Issuer: C=US, L=Default City, O=Internet Security Research Group, CN=mail.example.com
551+
// Validity
552+
// Not Before: Dec 20 15:36:45 2025 GMT
553+
// Not After : Dec 18 15:36:45 2035 GMT
554+
// Subject: C=US, L=Default City, O=Internet Security Research Group, CN=mail.example.com
555+
// Subject Public Key Info:
556+
// Public Key Algorithm: rsaEncryption
557+
// Public-Key: (4096 bit)
558+
// Modulus:
559+
// 00:b6:81:5f:a9:f3:19:1f:a6:71:56:61:e6:53:e9:
560+
// 8f:24:f4:05:4f:06:25:a9:8b:f3:4f:b3:82:9a:dd:
561+
// ...
562+
// c8:d1:ca:45:84:69:8e:f6:1d:bb:e0:43:24:73:7c:
563+
// 2f:08:bd
564+
// Exponent: 65537 (0x10001)
565+
// X509v3 extensions:
566+
// X509v3 Subject Key Identifier:
567+
// 43:3E:01:3D:F9:34:CE:19:31:8A:F1:2F:82:68:CD:1D:F5:A8:61:87
568+
// X509v3 Authority Key Identifier:
569+
// 43:3E:01:3D:F9:34:CE:19:31:8A:F1:2F:82:68:CD:1D:F5:A8:61:87
570+
// X509v3 Basic Constraints:
571+
// CA:FALSE
572+
TestCertificateNonCA2 = `-----BEGIN CERTIFICATE-----
573+
MIIFrzCCA5egAwIBAgIUJg8MzQlThydVUXR72U7E4erNbSwwDQYJKoZIhvcNAQEL
574+
BQAwajELMAkGA1UEBhMCVVMxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEpMCcGA1UE
575+
CgwgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxGTAXBgNVBAMMEG1h
576+
aWwuZXhhbXBsZS5jb20wHhcNMjUxMjIwMTUzNjQ1WhcNMzUxMjE4MTUzNjQ1WjBq
577+
MQswCQYDVQQGEwJVUzEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MSkwJwYDVQQKDCBJ
578+
bnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEZMBcGA1UEAwwQbWFpbC5l
579+
eGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALaBX6nz
580+
GR+mcVZh5lPpjyT0BU8GJamL80+zgprdJ/Xq1aMB709asF3o/gWlHVMke2JIX+lr
581+
kvQLoSxr0AB7eOwaz+8KfWH3BLw399j9c88Lo+ZAot8CgpUz7YaeETOUveEGJVSb
582+
PP/k0bmNxqBPnP3ba20xTRlW5MFnTXHxNJ5TghRC98FfeGwEkN8tb5YdFzoRKM/m
583+
FSRevS4rcHBIwpU4l9xNIBfgI7P/Ib/UlrXTITVdAMriypU3AkNn25cUECa4sJ5a
584+
YVvI/bv4r63x8gscFVwhleM5Ms9eENoAF/BbZq2Fc/la2DwZANkaq1WOz0us5NS2
585+
UzIIhKM9OU/+FbPs1x2UiAjGLa5X/HVE2Y0HJx0JzAEb4jMaDHn1KoE2HImWCp5F
586+
RdS2VEAJKoH0Dv6toP//exK/uQoQs3c/V668Dm4yRERWJ42ipeSHrVNkkwUSKgvp
587+
qD2oaaE8CGgXunraE5hbKb4zOy/xBiw6FVdOZ3fyNGlWZ38lvUDLVjyK4GdKEWN5
588+
b6T098qmUfl4vflAxvL0NeGb8zvT2n12REWbtSpPFjp2Tq+fBcPCq1OE3zDsca4d
589+
hwiVNJ33O5VVhqnVd20VlAo+IxHi+IhdIotMhHnhXi0+86i/aRTTiUO2/h/BoHWK
590+
zYp6VSKAFUu2yNHKRYRpjvYdu+BDJHN8Lwi9AgMBAAGjTTBLMB0GA1UdDgQWBBRD
591+
PgE9+TTOGTGK8S+CaM0d9ahhhzAfBgNVHSMEGDAWgBRDPgE9+TTOGTGK8S+CaM0d
592+
9ahhhzAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQA12GwhzZfNQBWbWmk1
593+
2E6JdQFrsRIcgkHo54eyhoIjLsHKrwP99DcHTTFrOfJPrGRk5b/C8mnNlcQOey+I
594+
qmpRrwvpvW4njxPR5bUzt4UsOrG7k+GsA4ovQzjvDCAdjLcvoFFYrMvoQ18rvxEH
595+
NuJeRoqc5bnSO0k+B5lc9TCsfHQwLkw7s6K8l2scdJj7X0vg2KTn0FDRMQlvWcBK
596+
lxbfHTDGK2+N841TIABalhT1ljMlhnfdDiVQGqRnmVdrTM4diJ1CaRm7CW36CwCE
597+
yeYLc5Q/hdNd3AlsZo4Wu9xnjW5ozeoOKveJrm1KSl+BylkF+bHWFaq1w7EDQkVC
598+
uv0BEdFyXcFL7sI3OsblXJibSqZJsZn/SeJja3LAvm5M5FIjoZ1uZzzdc0Hx1tzb
599+
OdjK0cgXqcyz/stQ22kKnadZOi0lMoVUmP8TLo+2B6LvAYHClStEIhBet2W80wDe
600+
PwfVKfLQ98Fpt7QHzpzcwje2I3dfyI1WHNPptJcryFdXcJHLHksv1rk+tbcaHN8K
601+
rsE6P1NCjsAFn43+Kicmlj14IR1UZ54MmK+KXlr1I2/MAXvI86rXhTXC7xI+uS5v
602+
/qf5aom1SWBJAQmexwbC+viyH/obwSNAygLNTyUBOx9TSPlsEazQ8TV+9OaWkbsh
603+
rtDOMVCUoMGIbAJRLwKLL7djlw==
480604
-----END CERTIFICATE-----`
481605
)
482606

test/integration/bundle/suite.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,30 @@ var _ = Describe("Integration", func() {
727727
Expect(configMap.Annotations).To(HaveKeyWithValue("test1", "test1"), "Ensuring target contains additional annotations")
728728
}
729729
})
730+
731+
It("should update all targets with CA certificates only", func() {
732+
configMap := corev1.ConfigMap{
733+
ObjectMeta: metav1.ObjectMeta{
734+
Name: "new-bundle-source",
735+
Namespace: opts.Namespace,
736+
},
737+
Data: map[string]string{
738+
"new-source-key": dummy.JoinCerts(dummy.TestCertificateNonCA1),
739+
},
740+
}
741+
742+
Expect(cl.Create(ctx, &configMap)).NotTo(HaveOccurred())
743+
744+
Expect(komega.Update(testBundle, func() {
745+
testBundle.Spec.UseCACertsOnly = ptr.To(true)
746+
testBundle.Spec.Sources = append(testBundle.Spec.Sources, trustapi.BundleSource{
747+
ConfigMap: &trustapi.SourceObjectKeySelector{Name: "new-bundle-source", Key: "new-source-key"},
748+
})
749+
})()).To(Succeed())
750+
751+
expectedData := dummy.JoinCerts(dummy.TestCertificate2, dummy.TestCertificate1, dummy.TestCertificate3)
752+
testenv.EventuallyBundleHasSyncedAllNamespaces(ctx, cl, testBundle.Name, expectedData)
753+
})
730754
})
731755

732756
func writeDefaultPackage() (string, error) {

0 commit comments

Comments
 (0)