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 +54 -36
- package/package.json +1 -1
- package/src/lib/k8s/tls.ts +59 -38
- package/src/lib/k8s/webhook.ts +2 -2
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.
|
|
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 = `[107;40m[38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;
|
|
|
91
91
|
[38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m [38;5;016m
|
|
92
92
|
[0m`;
|
|
93
93
|
|
|
94
|
-
|
|
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 =
|
|
99
|
-
caCert.
|
|
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: "
|
|
107
|
-
|
|
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: "
|
|
124
|
-
|
|
111
|
+
name: "keyUsage",
|
|
112
|
+
keyCertSign: true,
|
|
113
|
+
digitalSignature: true,
|
|
114
|
+
nonRepudiation: true,
|
|
115
|
+
keyEncipherment: true,
|
|
116
|
+
dataEncipherment: true,
|
|
125
117
|
},
|
|
126
|
-
];
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
//
|
|
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(
|
|
133
|
-
const crt = Buffer.from(forge.pki.certificateToPem(
|
|
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:
|
|
306
|
+
replicas: 2,
|
|
289
307
|
selector: {
|
|
290
308
|
matchLabels: {
|
|
291
309
|
app: this.name,
|
package/package.json
CHANGED
package/src/lib/k8s/tls.ts
CHANGED
|
@@ -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 =
|
|
18
|
-
|
|
19
|
-
caCert.
|
|
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: "
|
|
26
|
-
|
|
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: "
|
|
44
|
-
|
|
28
|
+
name: "keyUsage",
|
|
29
|
+
keyCertSign: true,
|
|
30
|
+
digitalSignature: true,
|
|
31
|
+
nonRepudiation: true,
|
|
32
|
+
keyEncipherment: true,
|
|
33
|
+
dataEncipherment: true,
|
|
45
34
|
},
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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(
|
|
54
|
-
const crt = Buffer.from(forge.pki.certificateToPem(
|
|
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
|
+
}
|
package/src/lib/k8s/webhook.ts
CHANGED
|
@@ -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:
|
|
192
|
+
replicas: 2,
|
|
193
193
|
selector: {
|
|
194
194
|
matchLabels: {
|
|
195
195
|
app: this.name,
|