Skip to content

Commit 9ce5fd3

Browse files
committed
Address review comments
1 parent 9b93039 commit 9ce5fd3

File tree

6 files changed

+37
-64
lines changed

6 files changed

+37
-64
lines changed

controllers/clustercache/cluster_accessor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package clustercache
1818

1919
import (
2020
"context"
21-
"crypto"
21+
"crypto/rsa"
2222
"fmt"
2323
"sync"
2424
"time"
@@ -165,7 +165,7 @@ type clusterAccessorLockedState struct {
165165
// cert to communicate with etcd.
166166
// This private key is stored and cached in the ClusterCache because it's expensive to generate a new
167167
// private key in every single Reconcile.
168-
clientCertificatePrivateKey crypto.Signer
168+
clientCertificatePrivateKey *rsa.PrivateKey
169169

170170
// healthChecking holds the health checking state (e.g. lastProbeSuccessTime, consecutiveFailures)
171171
// of the clusterAccessor.
@@ -435,7 +435,7 @@ func (ca *clusterAccessor) GetRESTConfig(ctx context.Context) (*rest.Config, err
435435
return ca.lockedState.connection.restConfig, nil
436436
}
437437

438-
func (ca *clusterAccessor) GetClientCertificatePrivateKey(ctx context.Context) crypto.Signer {
438+
func (ca *clusterAccessor) GetClientCertificatePrivateKey(ctx context.Context) *rsa.PrivateKey {
439439
ca.rLock(ctx)
440440
defer ca.rUnlock(ctx)
441441

controllers/clustercache/cluster_cache.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package clustercache
1818

1919
import (
2020
"context"
21-
"crypto"
21+
"crypto/rsa"
2222
"fmt"
2323
"os"
2424
"strings"
@@ -150,7 +150,7 @@ type ClusterCache interface {
150150
//
151151
// Deprecated: This method is deprecated and will be removed in a future release as caching a rsa.PrivateKey
152152
// is outside the scope of the ClusterCache.
153-
GetClientCertificatePrivateKey(ctx context.Context, cluster client.ObjectKey) (crypto.Signer, error)
153+
GetClientCertificatePrivateKey(ctx context.Context, cluster client.ObjectKey) (*rsa.PrivateKey, error)
154154

155155
// Watch watches a workload cluster for events.
156156
// Each unique watch (by input.Name) is only added once after a Connect (otherwise we return early).
@@ -417,7 +417,7 @@ func (cc *clusterCache) GetRESTConfig(ctx context.Context, cluster client.Object
417417
return accessor.GetRESTConfig(ctx)
418418
}
419419

420-
func (cc *clusterCache) GetClientCertificatePrivateKey(ctx context.Context, cluster client.ObjectKey) (crypto.Signer, error) {
420+
func (cc *clusterCache) GetClientCertificatePrivateKey(ctx context.Context, cluster client.ObjectKey) (*rsa.PrivateKey, error) {
421421
accessor := cc.getClusterAccessor(cluster)
422422
if accessor == nil {
423423
return nil, errors.New("error getting client certificate private key: private key was not generated yet")

controlplane/kubeadm/internal/cluster_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"sigs.k8s.io/controller-runtime/pkg/controller"
4040
"sigs.k8s.io/controller-runtime/pkg/reconcile"
4141

42+
bootstrapv1 "sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2"
4243
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
4344
"sigs.k8s.io/cluster-api/controllers/clustercache"
4445
"sigs.k8s.io/cluster-api/controllers/remote"
@@ -249,7 +250,7 @@ func TestGetWorkloadCluster(t *testing.T) {
249250
})
250251
g.Expect(err).ToNot(HaveOccurred())
251252

252-
workloadCluster, err := m.GetWorkloadCluster(ctx, tt.clusterKey, "")
253+
workloadCluster, err := m.GetWorkloadCluster(ctx, tt.clusterKey, bootstrapv1.EncryptionAlgorithmRSA2048)
253254
if tt.expectErr {
254255
g.Expect(err).To(HaveOccurred())
255256
g.Expect(workloadCluster).To(BeNil())

controlplane/kubeadm/internal/control_plane.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,10 @@ func (c *ControlPlane) StatusToLogKeyAndValues(newMachine, deletedMachine *clust
469469
}
470470

471471
// GetKeyEncryptionAlgorithm returns the control plane EncryptionAlgorithm.
472+
// If its unset the default encryption algorithm is returned.
472473
func (c *ControlPlane) GetKeyEncryptionAlgorithm() bootstrapv1.EncryptionAlgorithmType {
474+
if c.KCP.Spec.KubeadmConfigSpec.ClusterConfiguration.EncryptionAlgorithm == "" {
475+
return bootstrapv1.EncryptionAlgorithmRSA2048
476+
}
473477
return c.KCP.Spec.KubeadmConfigSpec.ClusterConfiguration.EncryptionAlgorithm
474478
}

controlplane/kubeadm/internal/workload_cluster.go

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -364,32 +364,17 @@ func generateClientCert(caCertEncoded, caKeyEncoded []byte, keyEncryptionAlgorit
364364
return tls.Certificate{}, err
365365
}
366366

367-
var x509Cert *x509.Certificate
368-
var encodedClientKey []byte
369-
370-
if keyEncryptionAlgorithm != "" {
371-
clientKey, err := certs.NewSigner(keyEncryptionAlgorithm)
372-
if err != nil {
373-
return tls.Certificate{}, err
374-
}
375-
x509Cert, err = newClientCert(caCert, clientKey, caKey)
376-
if err != nil {
377-
return tls.Certificate{}, err
378-
}
379-
encodedClientKey, err = certs.EncodePrivateKeyPEMFromSigner(clientKey)
380-
if err != nil {
381-
return tls.Certificate{}, err
382-
}
383-
} else {
384-
clientKey, err := certs.NewPrivateKey()
385-
if err != nil {
386-
return tls.Certificate{}, err
387-
}
388-
x509Cert, err = newClientCert(caCert, clientKey, caKey)
389-
if err != nil {
390-
return tls.Certificate{}, err
391-
}
392-
encodedClientKey = certs.EncodePrivateKeyPEM(clientKey)
367+
clientKey, err := certs.NewSigner(keyEncryptionAlgorithm)
368+
if err != nil {
369+
return tls.Certificate{}, err
370+
}
371+
x509Cert, err := newClientCert(caCert, clientKey, caKey)
372+
if err != nil {
373+
return tls.Certificate{}, err
374+
}
375+
encodedClientKey, err := certs.EncodePrivateKeyPEMFromSigner(clientKey)
376+
if err != nil {
377+
return tls.Certificate{}, err
393378
}
394379

395380
return tls.X509KeyPair(certs.EncodeCertPEM(x509Cert), encodedClientKey)

util/kubeconfig/kubeconfig.go

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ func FromSecret(ctx context.Context, c client.Reader, cluster client.ObjectKey)
5555

5656
// New creates a new Kubeconfig using the cluster name and specified endpoint.
5757
func New(clusterName, endpoint string, caCert *x509.Certificate, caKey crypto.Signer, options ...KubeConfigurationOption) (*api.Config, error) {
58-
var clientCert *x509.Certificate
59-
var encodedClientKey []byte
6058
cfg := &certs.Config{
6159
CommonName: "kubernetes-admin",
6260
Organization: []string{"system:masters"},
@@ -69,34 +67,19 @@ func New(clusterName, endpoint string, caCert *x509.Certificate, caKey crypto.Si
6967
kubeConfigOptions := &KubeConfigurationOptions{}
7068
kubeConfigOptions.ApplyOptions(options)
7169

72-
// Generate key based on the EncryptionAlgorithm if set.
73-
if kubeConfigOptions.keyEncryptionAlgorithm != "" {
74-
clientKey, err := certs.NewSigner(kubeConfigOptions.keyEncryptionAlgorithm)
75-
if err != nil {
76-
return nil, errors.Wrap(err, "unable to create private key")
77-
}
78-
79-
clientCert, err = cfg.NewSignedCert(clientKey, caCert, caKey)
80-
if err != nil {
81-
return nil, errors.Wrap(err, "unable to sign certificate")
82-
}
83-
84-
encodedClientKey, err = certs.EncodePrivateKeyPEMFromSigner(clientKey)
85-
if err != nil {
86-
return nil, errors.Wrap(err, "unable to encode private key")
87-
}
88-
} else {
89-
clientKey, err := certs.NewPrivateKey()
90-
if err != nil {
91-
return nil, errors.Wrap(err, "unable to create private key")
92-
}
70+
clientKey, err := certs.NewSigner(kubeConfigOptions.keyEncryptionAlgorithm)
71+
if err != nil {
72+
return nil, errors.Wrap(err, "unable to create private key")
73+
}
9374

94-
clientCert, err = cfg.NewSignedCert(clientKey, caCert, caKey)
95-
if err != nil {
96-
return nil, errors.Wrap(err, "unable to sign certificate")
97-
}
75+
clientCert, err := cfg.NewSignedCert(clientKey, caCert, caKey)
76+
if err != nil {
77+
return nil, errors.Wrap(err, "unable to sign certificate")
78+
}
9879

99-
encodedClientKey = certs.EncodeCertPEM(clientCert)
80+
encodedClientKey, err := certs.EncodePrivateKeyPEMFromSigner(clientKey)
81+
if err != nil {
82+
return nil, errors.Wrap(err, "unable to encode private key")
10083
}
10184

10285
return &api.Config{
@@ -139,7 +122,7 @@ func CreateSecretWithOwner(ctx context.Context, c client.Client, clusterName cli
139122
if err != nil {
140123
return err
141124
}
142-
out, err := generateKubeconfig(ctx, c, clusterName, server, options)
125+
out, err := generateKubeconfig(ctx, c, clusterName, server, options...)
143126
if err != nil {
144127
return err
145128
}
@@ -222,15 +205,15 @@ func RegenerateSecret(ctx context.Context, c client.Client, configSecret *corev1
222205
}
223206
endpoint := config.Clusters[clusterName].Server
224207
key := client.ObjectKey{Name: clusterName, Namespace: configSecret.Namespace}
225-
out, err := generateKubeconfig(ctx, c, key, endpoint, options)
208+
out, err := generateKubeconfig(ctx, c, key, endpoint, options...)
226209
if err != nil {
227210
return err
228211
}
229212
configSecret.Data[secret.KubeconfigDataName] = out
230213
return c.Update(ctx, configSecret)
231214
}
232215

233-
func generateKubeconfig(ctx context.Context, c client.Client, clusterName client.ObjectKey, endpoint string, options []KubeConfigurationOption) ([]byte, error) {
216+
func generateKubeconfig(ctx context.Context, c client.Client, clusterName client.ObjectKey, endpoint string, options ...KubeConfigurationOption) ([]byte, error) {
234217
clusterCA, err := secret.GetFromNamespacedName(ctx, c, clusterName, secret.ClusterCA)
235218
if err != nil {
236219
if apierrors.IsNotFound(err) {

0 commit comments

Comments
 (0)