feat: CertManager | update to latest version

Also improve pki
This commit is contained in:
2025-11-29 13:18:34 +05:00
parent a753fc0e1e
commit 3c947c05ad
6 changed files with 70 additions and 43 deletions

View File

@@ -6,7 +6,6 @@ import { Construct } from "constructs";
type CertManagerOptions = { type CertManagerOptions = {
provider: HelmProvider; provider: HelmProvider;
version: string;
name: string; name: string;
namespace: string; namespace: string;
}; };
@@ -15,13 +14,12 @@ export class CertManager extends Construct {
constructor(scope: Construct, id: string, options: CertManagerOptions) { constructor(scope: Construct, id: string, options: CertManagerOptions) {
super(scope, id); super(scope, id);
const { namespace, name, version, provider } = options; const { namespace, name, provider } = options;
new Release(this, id, { new Release(this, id, {
provider, provider,
name, name,
namespace, namespace,
version,
repository: "https://charts.jetstack.io", repository: "https://charts.jetstack.io",
chart: "cert-manager", chart: "cert-manager",
createNamespace: true, createNamespace: true,

View File

@@ -1,6 +1,8 @@
crds: crds:
enabled: true enabled: true
keep: true
prometheus: prometheus:
enabled: true enabled: true
webhook: webhook:
timeoutSeconds: 4 timeoutSeconds: 4
enableCertificateOwnerRef: true

View File

@@ -59,7 +59,6 @@ export class CoreServices extends TerraformStack {
provider: helm, provider: helm,
name: "cert-manager", name: "cert-manager",
namespace, namespace,
version: "1.18.2",
}); });
} }
} }

View File

@@ -52,12 +52,9 @@ export class PKI extends TerraformStack {
provider: kubernetes, provider: kubernetes,
namespace, namespace,
apiVersion: "cert-manager.io/v1", apiVersion: "cert-manager.io/v1",
secretName: "root-secret", rootSecretName: "root-secret",
intermediateSecretName: `${namespace}-ca-secret`,
commonName: "Homelab Root CA", commonName: "Homelab Root CA",
privateKey: {
algorithm: "Ed25519",
size: 256,
},
}); });
new PublicIssuer(this, "public-issuer", { new PublicIssuer(this, "public-issuer", {

View File

@@ -7,11 +7,8 @@ type PrivateIssuerOptions = {
namespace: string; namespace: string;
apiVersion: string; apiVersion: string;
commonName: string; commonName: string;
secretName: string; rootSecretName: string;
privateKey: { intermediateSecretName: string;
algorithm: "RSA" | "ECDSA" | "Ed25519";
size: number;
};
}; };
export class PrivateIssuer extends Construct { export class PrivateIssuer extends Construct {
@@ -21,44 +18,41 @@ export class PrivateIssuer extends Construct {
const { const {
provider, provider,
namespace, namespace,
commonName,
privateKey,
secretName,
apiVersion, apiVersion,
commonName,
rootSecretName,
intermediateSecretName,
} = options; } = options;
// Self-signed ClusterIssuer for initial CA //
new Manifest(this, "ca-issuer", { // 1. Root CA (self-signed)
//
new Manifest(this, "root-ca-issuer", {
provider, provider,
manifest: { manifest: {
apiVersion, apiVersion,
kind: "ClusterIssuer", kind: "ClusterIssuer",
metadata: { metadata: { name: "root-ca-selfsigned" },
name: "ca-issuer", spec: { selfSigned: {} },
},
spec: {
selfSigned: {},
},
}, },
}); });
// Self-signed CA Certificate new Manifest(this, "root-ca", {
new Manifest(this, "selfsigned-ca", {
provider, provider,
manifest: { manifest: {
apiVersion, apiVersion,
kind: "Certificate", kind: "Certificate",
metadata: { metadata: { name: "root-ca", namespace },
name: "selfsigned-ca",
namespace,
},
spec: { spec: {
isCA: true, isCA: true,
commonName, commonName: `${commonName} Root CA`,
secretName, secretName: rootSecretName,
privateKey, privateKey: {
algorithm: "RSA",
size: 4096,
},
issuerRef: { issuerRef: {
name: "ca-issuer", name: "root-ca-selfsigned",
kind: "ClusterIssuer", kind: "ClusterIssuer",
group: "cert-manager.io", group: "cert-manager.io",
}, },
@@ -66,19 +60,55 @@ export class PrivateIssuer extends Construct {
}, },
}); });
// CA-based ClusterIssuer //
// 2. Intermediate CA (signed by root CA)
//
new Manifest(this, "intermediate-ca-issuer", {
provider,
manifest: {
apiVersion,
kind: "ClusterIssuer",
metadata: { name: "root-ca-signer" },
spec: {
ca: { secretName: rootSecretName },
},
},
});
new Manifest(this, "intermediate-ca", {
provider,
manifest: {
apiVersion,
kind: "Certificate",
metadata: { name: "intermediate-ca", namespace },
spec: {
isCA: true,
commonName: `${commonName} Intermediate CA`,
secretName: intermediateSecretName,
privateKey: {
algorithm: "ECDSA",
size: 384,
},
issuerRef: {
name: "root-ca-signer",
kind: "ClusterIssuer",
group: "cert-manager.io",
},
},
},
});
//
// 3. Final public cluster issuer (used by your apps)
//
new Manifest(this, "cluster-issuer", { new Manifest(this, "cluster-issuer", {
provider, provider,
manifest: { manifest: {
apiVersion, apiVersion,
kind: "ClusterIssuer", kind: "ClusterIssuer",
metadata: { metadata: { name: "cluster-issuer" },
name: "cluster-issuer",
},
spec: { spec: {
ca: { ca: { secretName: intermediateSecretName },
secretName,
},
}, },
}, },
}); });

View File

@@ -32,9 +32,10 @@ export class PrivateCertificate extends Certificate {
kind: "ClusterIssuer", kind: "ClusterIssuer",
}, },
privateKey: { privateKey: {
algorithm: "Ed25519", algorithm: "ECDSA",
size: 384, size: 384,
}, },
usages: ["digital signature", "key encipherment", "server auth"],
}); });
} }
} }