Skip to content

Commit 4204f52

Browse files
committed
nodekubeconfig: set not-before/not-after annotations
1 parent fb599ec commit 4204f52

File tree

2 files changed

+73
-19
lines changed

2 files changed

+73
-19
lines changed

pkg/operator/nodekubeconfigcontroller/nodekubeconfigcontroller.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package nodekubeconfigcontroller
22

33
import (
44
"context"
5+
"crypto/tls"
6+
"crypto/x509"
57
"encoding/base64"
8+
"encoding/pem"
69
"fmt"
710
"strings"
811
"time"
@@ -14,6 +17,7 @@ import (
1417
"github.com/openshift/cluster-kube-apiserver-operator/bindata"
1518
"github.com/openshift/cluster-kube-apiserver-operator/pkg/operator/operatorclient"
1619
"github.com/openshift/library-go/pkg/controller/factory"
20+
"github.com/openshift/library-go/pkg/operator/certrotation"
1721
"github.com/openshift/library-go/pkg/operator/events"
1822
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
1923
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
@@ -112,6 +116,22 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
112116
return fmt.Errorf("system:admin client private key missing from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
113117
}
114118

119+
// Ensure secret key matches the certificate
120+
_, err = tls.X509KeyPair(systemAdminClientCert, systemAdminClientKey)
121+
if err != nil {
122+
return fmt.Errorf("system:admin client private key doesn't match the certificate from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
123+
}
124+
// extract not-before/not-after timestamps valid x509 certificate
125+
var block *pem.Block
126+
block, _ = pem.Decode(systemAdminClientCert)
127+
if block == nil || block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
128+
return fmt.Errorf("invalid first block found for certificate from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
129+
}
130+
parsedCert, err := x509.ParseCertificate(block.Bytes)
131+
if err != nil {
132+
return fmt.Errorf("failed to parse the certificate from secret %s/node-system-admin-client", operatorclient.OperatorNamespace)
133+
}
134+
115135
servingCABundleCM, err := configmapLister.ConfigMaps(operatorclient.TargetNamespace).Get("kube-apiserver-server-ca")
116136
if err != nil {
117137
return err
@@ -152,6 +172,8 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
152172
requiredSecret.Annotations = map[string]string{}
153173
}
154174
requiredSecret.Annotations[annotations.OpenShiftComponent] = "kube-apiserver"
175+
requiredSecret.Annotations[certrotation.CertificateNotBeforeAnnotation] = parsedCert.NotBefore.Format(time.RFC3339)
176+
requiredSecret.Annotations[certrotation.CertificateNotAfterAnnotation] = parsedCert.NotAfter.Format(time.RFC3339)
155177

156178
_, _, err = resourceapply.ApplySecret(ctx, client, recorder, requiredSecret)
157179
if err != nil {

pkg/operator/nodekubeconfigcontroller/nodekubeconfigcontroller_test.go

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package nodekubeconfigcontroller
22

33
import (
44
"context"
5+
"encoding/base64"
6+
"fmt"
57
"testing"
68

79
"github.com/google/go-cmp/cmp"
810
"github.com/openshift/api/annotations"
911
configv1 "github.com/openshift/api/config/v1"
1012
configlistersv1 "github.com/openshift/client-go/config/listers/config/v1"
13+
"github.com/openshift/library-go/pkg/operator/certrotation"
1114
"github.com/openshift/library-go/pkg/operator/events"
1215
corev1 "k8s.io/api/core/v1"
1316
apiequality "k8s.io/apimachinery/pkg/api/equality"
@@ -85,7 +88,34 @@ func (l *secretLister) Get(name string) (*corev1.Secret, error) {
8588
return l.client.CoreV1().Secrets(l.namespace).Get(context.Background(), name, metav1.GetOptions{})
8689
}
8790

91+
const privateKey = `
92+
-----BEGIN PRIVATE KEY-----
93+
MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEArvkpSCWaStPfbYr4
94+
cCJyv8pXWnJ4K22emSrYDNcp7Dm6qjtN/lsVNuGDyWyR4cUaJYXkaD2OrZiXDzzk
95+
BZlS3QIDAQABAkA9BZhoGPUec5XQVk8ejGUIjkC4woM2YhyVvmNq1v8/6q6V+uPw
96+
yDEfBMapuLVY+QhyVELXFOCHA5iKxrlFHZThAiEA1XA5mlbHtrJqEZ7yI5m6+Szj
97+
7YVzSkdSgfDZ//heAh8CIQDR3VbN9QmJRIM1yhIkP9BoWSxvXdH6QMXdC2X7Tkwj
98+
gwIgcpbSxjLK/CIjYhx0oXpacIaSRCX+dKV//XVChPNh/T8CIQCSFscXZez2fhfs
99+
eLb6PuXfzbuN5ryFvVM/VXDvaIi96wIgcHjUpONghaoA51XejMAxWanDiwAgRV5H
100+
XNdFkBi4q7o=
101+
-----END PRIVATE KEY-----`
102+
const publicKey = `-----BEGIN CERTIFICATE-----
103+
MIIBfzCCASmgAwIBAgIUEEUHu1PzqJCGQ63vxVokwBxGPYwwDQYJKoZIhvcNAQEL
104+
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI0MTEyNjA4NTA0NloXDTM0MTEy
105+
NDA4NTA0NlowFDESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZIhvcNAQEBBQAD
106+
SwAwSAJBAK75KUglmkrT322K+HAicr/KV1pyeCttnpkq2AzXKew5uqo7Tf5bFTbh
107+
g8lskeHFGiWF5Gg9jq2Ylw885AWZUt0CAwEAAaNTMFEwHQYDVR0OBBYEFJna5Io+
108+
idLKO73zypGl2itp92JUMB8GA1UdIwQYMBaAFJna5Io+idLKO73zypGl2itp92JU
109+
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADQQB71tlkWNFDvMRxtz+a
110+
NYMU1thAVfVFciNXPS07tUduFSwVvYORUxx2w+5JfUdKu69hLpBFVPqvHQjPoQgc
111+
vUBI
112+
-----END CERTIFICATE-----`
113+
const certNotBefore = "2024-11-26T08:50:46Z"
114+
const certNotAfter = "2034-11-24T08:50:46Z"
115+
88116
func TestEnsureNodeKubeconfigs(t *testing.T) {
117+
publicKeyBase64 := base64.StdEncoding.EncodeToString([]byte(publicKey))
118+
privateKeyBase64 := base64.StdEncoding.EncodeToString([]byte(privateKey))
89119
tt := []struct {
90120
name string
91121
existingObjects []runtime.Object
@@ -111,8 +141,8 @@ func TestEnsureNodeKubeconfigs(t *testing.T) {
111141
Name: "node-system-admin-client",
112142
},
113143
Data: map[string][]byte{
114-
"tls.crt": []byte("system:admin certificate"),
115-
"tls.key": []byte("system:admin key"),
144+
"tls.crt": []byte(publicKey),
145+
"tls.key": []byte(privateKey),
116146
},
117147
},
118148
},
@@ -143,11 +173,13 @@ func TestEnsureNodeKubeconfigs(t *testing.T) {
143173
Namespace: "openshift-kube-apiserver",
144174
Name: "node-kubeconfigs",
145175
Annotations: map[string]string{
146-
annotations.OpenShiftComponent: "kube-apiserver",
176+
annotations.OpenShiftComponent: "kube-apiserver",
177+
certrotation.CertificateNotBeforeAnnotation: certNotBefore,
178+
certrotation.CertificateNotAfterAnnotation: certNotAfter,
147179
},
148180
},
149181
Data: map[string][]byte{
150-
"localhost.kubeconfig": []byte(`apiVersion: v1
182+
"localhost.kubeconfig": []byte(fmt.Sprintf(`apiVersion: v1
151183
kind: Config
152184
clusters:
153185
- cluster:
@@ -163,10 +195,10 @@ current-context: system:admin
163195
users:
164196
- name: system:admin
165197
user:
166-
client-certificate-data: c3lzdGVtOmFkbWluIGNlcnRpZmljYXRl
167-
client-key-data: c3lzdGVtOmFkbWluIGtleQ==
168-
`),
169-
"localhost-recovery.kubeconfig": []byte(`apiVersion: v1
198+
client-certificate-data: %s
199+
client-key-data: %s
200+
`, publicKeyBase64, privateKeyBase64)),
201+
"localhost-recovery.kubeconfig": []byte(fmt.Sprintf(`apiVersion: v1
170202
kind: Config
171203
clusters:
172204
- cluster:
@@ -183,10 +215,10 @@ current-context: system:admin
183215
users:
184216
- name: system:admin
185217
user:
186-
client-certificate-data: c3lzdGVtOmFkbWluIGNlcnRpZmljYXRl
187-
client-key-data: c3lzdGVtOmFkbWluIGtleQ==
188-
`),
189-
"lb-ext.kubeconfig": []byte(`apiVersion: v1
218+
client-certificate-data: %s
219+
client-key-data: %s
220+
`, publicKeyBase64, privateKeyBase64)),
221+
"lb-ext.kubeconfig": []byte(fmt.Sprintf(`apiVersion: v1
190222
kind: Config
191223
clusters:
192224
- cluster:
@@ -202,10 +234,10 @@ current-context: system:admin
202234
users:
203235
- name: system:admin
204236
user:
205-
client-certificate-data: c3lzdGVtOmFkbWluIGNlcnRpZmljYXRl
206-
client-key-data: c3lzdGVtOmFkbWluIGtleQ==
207-
`),
208-
"lb-int.kubeconfig": []byte(`apiVersion: v1
237+
client-certificate-data: %s
238+
client-key-data: %s
239+
`, publicKeyBase64, privateKeyBase64)),
240+
"lb-int.kubeconfig": []byte(fmt.Sprintf(`apiVersion: v1
209241
kind: Config
210242
clusters:
211243
- cluster:
@@ -221,9 +253,9 @@ current-context: system:admin
221253
users:
222254
- name: system:admin
223255
user:
224-
client-certificate-data: c3lzdGVtOmFkbWluIGNlcnRpZmljYXRl
225-
client-key-data: c3lzdGVtOmFkbWluIGtleQ==
226-
`),
256+
client-certificate-data: %s
257+
client-key-data: %s
258+
`, publicKeyBase64, privateKeyBase64)),
227259
},
228260
},
229261
},

0 commit comments

Comments
 (0)