pepr 0.1.20 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/pepr-cli.js CHANGED
@@ -21,7 +21,7 @@ var uuid = require('uuid');
21
21
  var commander = require('commander');
22
22
  var chokidar = require('chokidar');
23
23
 
24
- var version = "0.1.20";
24
+ var version = "0.1.21";
25
25
 
26
26
  // SPDX-License-Identifier: Apache-2.0
27
27
  // SPDX-FileCopyrightText: 2023-Present The Pepr Authors
@@ -91,48 +91,66 @@ const banner = `    [38;5;
91
91
                                                                                                                                             
92
92
  `;
93
93
 
94
- // SPDX-License-Identifier: Apache-2.0
94
+ const caName = "Pepr Ephemeral CA";
95
+ /**
96
+ * Generates a self-signed CA and server certificate with Subject Alternative Names (SANs) for the K8s webhook.
97
+ *
98
+ * @param {string} name - The name to use for the server certificate's Common Name and SAN DNS entry.
99
+ * @returns {TLSOut} - An object containing the Base64-encoded CA, server certificate, and server private key.
100
+ */
95
101
  function genTLS(name) {
96
- // Generate a new CA key pair
102
+ // Generate a new CA key pair and create a self-signed CA certificate
97
103
  const caKeys = forge.pki.rsa.generateKeyPair(2048);
98
- const caCert = forge.pki.createCertificate();
99
- caCert.publicKey = caKeys.publicKey;
100
- caCert.serialNumber = "01";
101
- caCert.validity.notBefore = new Date();
102
- caCert.validity.notAfter = new Date();
103
- caCert.validity.notAfter.setFullYear(caCert.validity.notBefore.getFullYear() + 1);
104
- const caAttrs = [
104
+ const caCert = genCert(caKeys, caName, [{ name: "commonName", value: caName }]);
105
+ caCert.setExtensions([
105
106
  {
106
- name: "commonName",
107
- value: "Pepr Ephemeral CA",
107
+ name: "basicConstraints",
108
+ cA: true,
108
109
  },
109
- ];
110
- caCert.setSubject(caAttrs);
111
- caCert.setIssuer(caAttrs);
112
- caCert.sign(caKeys.privateKey, forge.md.sha256.create());
113
- // Generate a new key pair
114
- const keys = forge.pki.rsa.generateKeyPair(2048);
115
- const cert = forge.pki.createCertificate();
116
- cert.publicKey = keys.publicKey;
117
- cert.serialNumber = "01";
118
- cert.validity.notBefore = new Date();
119
- cert.validity.notAfter = new Date();
120
- cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
121
- const attrs = [
122
110
  {
123
- name: "commonName",
124
- value: `${name}.pepr-system.svc`,
111
+ name: "keyUsage",
112
+ keyCertSign: true,
113
+ digitalSignature: true,
114
+ nonRepudiation: true,
115
+ keyEncipherment: true,
116
+ dataEncipherment: true,
125
117
  },
126
- ];
127
- cert.setSubject(attrs);
128
- cert.setIssuer(caCert.subject.attributes);
129
- cert.sign(caKeys.privateKey, forge.md.sha256.create());
130
- // Convert the keys and certificates to PEM format
118
+ ]);
119
+ // Generate a new server key pair and create a server certificate signed by the CA
120
+ const serverKeys = forge.pki.rsa.generateKeyPair(2048);
121
+ const serverCert = genCert(serverKeys, `${name}.pepr-system.svc`, caCert.subject.attributes);
122
+ // Sign both certificates with the CA private key
123
+ caCert.sign(caKeys.privateKey, forge.md.sha256.create());
124
+ serverCert.sign(caKeys.privateKey, forge.md.sha256.create());
125
+ // Convert the keys and certificates to PEM format and Base64-encode them
131
126
  const ca = Buffer.from(forge.pki.certificateToPem(caCert)).toString("base64");
132
- const key = Buffer.from(forge.pki.privateKeyToPem(keys.privateKey)).toString("base64");
133
- const crt = Buffer.from(forge.pki.certificateToPem(cert)).toString("base64");
127
+ const key = Buffer.from(forge.pki.privateKeyToPem(serverKeys.privateKey)).toString("base64");
128
+ const crt = Buffer.from(forge.pki.certificateToPem(serverCert)).toString("base64");
134
129
  return { ca, key, crt };
135
130
  }
131
+ function genCert(key, name, issuer) {
132
+ const crt = forge.pki.createCertificate();
133
+ crt.publicKey = key.publicKey;
134
+ crt.serialNumber = "01";
135
+ crt.validity.notBefore = new Date();
136
+ crt.validity.notAfter = new Date();
137
+ crt.validity.notAfter.setFullYear(crt.validity.notBefore.getFullYear() + 1);
138
+ // Add SANs to the server certificate
139
+ crt.setExtensions([
140
+ {
141
+ name: "subjectAltName",
142
+ altNames: [
143
+ {
144
+ type: 2,
145
+ value: name,
146
+ },
147
+ ],
148
+ },
149
+ ]);
150
+ // Set the server certificate's issuer to the CA
151
+ crt.setIssuer(issuer);
152
+ return crt;
153
+ }
136
154
 
137
155
  // SPDX-License-Identifier: Apache-2.0
138
156
  const peprIgnore = {
@@ -264,7 +282,7 @@ class Webhook {
264
282
  apiGroups: ["*"],
265
283
  apiVersions: ["*"],
266
284
  operations: ["CREATE", "UPDATE", "DELETE"],
267
- resources: ["*"],
285
+ resources: ["*/*"],
268
286
  },
269
287
  ],
270
288
  // @todo: track side effects state
@@ -285,7 +303,7 @@ class Webhook {
285
303
  },
286
304
  },
287
305
  spec: {
288
- replicas: 1,
306
+ replicas: 2,
289
307
  selector: {
290
308
  matchLabels: {
291
309
  app: this.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pepr",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "Kubernetes application engine",
5
5
  "author": "Defense Unicorns",
6
6
  "homepage": "https://github.com/defenseunicorns/pepr",
@@ -1,57 +1,78 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // SPDX-FileCopyrightText: 2023-Present The Pepr Authors
3
-
4
- // @todo: quick and dirty temp tls chain for testing, to be replaced at runtime
5
- // Don't freak out, this is a self-signed cert for testing purposes only.
6
1
  import forge from "node-forge";
7
2
 
3
+ const caName = "Pepr Ephemeral CA";
4
+
8
5
  export interface TLSOut {
9
6
  ca: string;
10
7
  crt: string;
11
8
  key: string;
12
9
  }
13
10
 
11
+ /**
12
+ * Generates a self-signed CA and server certificate with Subject Alternative Names (SANs) for the K8s webhook.
13
+ *
14
+ * @param {string} name - The name to use for the server certificate's Common Name and SAN DNS entry.
15
+ * @returns {TLSOut} - An object containing the Base64-encoded CA, server certificate, and server private key.
16
+ */
14
17
  export function genTLS(name: string): TLSOut {
15
- // Generate a new CA key pair
18
+ // Generate a new CA key pair and create a self-signed CA certificate
16
19
  const caKeys = forge.pki.rsa.generateKeyPair(2048);
17
- const caCert = forge.pki.createCertificate();
18
- caCert.publicKey = caKeys.publicKey;
19
- caCert.serialNumber = "01";
20
- caCert.validity.notBefore = new Date();
21
- caCert.validity.notAfter = new Date();
22
- caCert.validity.notAfter.setFullYear(caCert.validity.notBefore.getFullYear() + 1);
23
- const caAttrs = [
20
+ const caCert = genCert(caKeys, caName, [{ name: "commonName", value: caName }]);
21
+
22
+ caCert.setExtensions([
24
23
  {
25
- name: "commonName",
26
- value: "Pepr Ephemeral CA",
24
+ name: "basicConstraints",
25
+ cA: true,
27
26
  },
28
- ];
29
- caCert.setSubject(caAttrs);
30
- caCert.setIssuer(caAttrs);
31
- caCert.sign(caKeys.privateKey, forge.md.sha256.create());
32
-
33
- // Generate a new key pair
34
- const keys = forge.pki.rsa.generateKeyPair(2048);
35
- const cert = forge.pki.createCertificate();
36
- cert.publicKey = keys.publicKey;
37
- cert.serialNumber = "01";
38
- cert.validity.notBefore = new Date();
39
- cert.validity.notAfter = new Date();
40
- cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
41
- const attrs = [
42
27
  {
43
- name: "commonName",
44
- value: `${name}.pepr-system.svc`,
28
+ name: "keyUsage",
29
+ keyCertSign: true,
30
+ digitalSignature: true,
31
+ nonRepudiation: true,
32
+ keyEncipherment: true,
33
+ dataEncipherment: true,
45
34
  },
46
- ];
47
- cert.setSubject(attrs);
48
- cert.setIssuer(caCert.subject.attributes);
49
- cert.sign(caKeys.privateKey, forge.md.sha256.create());
35
+ ]);
36
+
37
+ // Generate a new server key pair and create a server certificate signed by the CA
38
+ const serverKeys = forge.pki.rsa.generateKeyPair(2048);
39
+ const serverCert = genCert(serverKeys, `${name}.pepr-system.svc`, caCert.subject.attributes);
40
+
41
+ // Sign both certificates with the CA private key
42
+ caCert.sign(caKeys.privateKey, forge.md.sha256.create());
43
+ serverCert.sign(caKeys.privateKey, forge.md.sha256.create());
50
44
 
51
- // Convert the keys and certificates to PEM format
45
+ // Convert the keys and certificates to PEM format and Base64-encode them
52
46
  const ca = Buffer.from(forge.pki.certificateToPem(caCert)).toString("base64");
53
- const key = Buffer.from(forge.pki.privateKeyToPem(keys.privateKey)).toString("base64");
54
- const crt = Buffer.from(forge.pki.certificateToPem(cert)).toString("base64");
47
+ const key = Buffer.from(forge.pki.privateKeyToPem(serverKeys.privateKey)).toString("base64");
48
+ const crt = Buffer.from(forge.pki.certificateToPem(serverCert)).toString("base64");
55
49
 
56
50
  return { ca, key, crt };
57
51
  }
52
+
53
+ function genCert(key: forge.pki.rsa.KeyPair, name: string, issuer: forge.pki.CertificateField[]) {
54
+ const crt = forge.pki.createCertificate();
55
+ crt.publicKey = key.publicKey;
56
+ crt.serialNumber = "01";
57
+ crt.validity.notBefore = new Date();
58
+ crt.validity.notAfter = new Date();
59
+ crt.validity.notAfter.setFullYear(crt.validity.notBefore.getFullYear() + 1);
60
+
61
+ // Add SANs to the server certificate
62
+ crt.setExtensions([
63
+ {
64
+ name: "subjectAltName",
65
+ altNames: [
66
+ {
67
+ type: 2, // DNS
68
+ value: name,
69
+ },
70
+ ],
71
+ },
72
+ ]);
73
+
74
+ // Set the server certificate's issuer to the CA
75
+ crt.setIssuer(issuer);
76
+
77
+ return crt;
78
+ }
@@ -167,7 +167,7 @@ export class Webhook {
167
167
  apiGroups: ["*"],
168
168
  apiVersions: ["*"],
169
169
  operations: ["CREATE", "UPDATE", "DELETE"],
170
- resources: ["*"],
170
+ resources: ["*/*"],
171
171
  },
172
172
  ],
173
173
  // @todo: track side effects state
@@ -189,7 +189,7 @@ export class Webhook {
189
189
  },
190
190
  },
191
191
  spec: {
192
- replicas: 1,
192
+ replicas: 2,
193
193
  selector: {
194
194
  matchLabels: {
195
195
  app: this.name,