@andrewheberle/serverless-ssh-ca 0.23.0 → 0.24.1
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/README.md +123 -0
- package/dist/api/operations.d.ts +2 -1
- package/dist/api/operations.d.ts.map +1 -1
- package/dist/api/operations.js +107 -18
- package/dist/api/operations.js.map +1 -1
- package/dist/api/schema.d.ts +1 -0
- package/dist/api/schema.d.ts.map +1 -1
- package/dist/api/schema.js +8 -1
- package/dist/api/schema.js.map +1 -1
- package/dist/api/v3/index.d.ts.map +1 -1
- package/dist/api/v3/index.js +1 -1
- package/dist/api/v3/index.js.map +1 -1
- package/dist/api/v3/schema.d.ts.map +1 -1
- package/dist/api/v3/schema.js +11 -7
- package/dist/api/v3/schema.js.map +1 -1
- package/dist/api/v4/index.d.ts.map +1 -1
- package/dist/api/v4/index.js +1 -1
- package/dist/api/v4/index.js.map +1 -1
- package/dist/api/v4/schema.d.ts.map +1 -1
- package/dist/api/v4/schema.js +11 -7
- package/dist/api/v4/schema.js.map +1 -1
- package/dist/db/index.d.ts +51 -4
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +133 -33
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations/0003_krl_revision.d.ts +3 -0
- package/dist/db/migrations/0003_krl_revision.d.ts.map +1 -0
- package/dist/db/migrations/0003_krl_revision.js +14 -0
- package/dist/db/migrations/0003_krl_revision.js.map +1 -0
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +2 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/types.d.ts +2 -0
- package/dist/db/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/krl.d.ts +2 -1
- package/dist/krl.d.ts.map +1 -1
- package/dist/krl.js +3 -2
- package/dist/krl.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +22 -1
- package/dist/logger.js.map +1 -1
- package/dist/node/cache.d.ts +21 -0
- package/dist/node/cache.d.ts.map +1 -0
- package/dist/node/cache.js +49 -0
- package/dist/node/cache.js.map +1 -0
- package/dist/node/env.d.ts +6 -3
- package/dist/node/env.d.ts.map +1 -1
- package/dist/node/env.js +4 -3
- package/dist/node/env.js.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/router.d.ts +25 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +38 -1
- package/dist/router.js.map +1 -1
- package/dist/ssh/keys.d.ts +18 -5
- package/dist/ssh/keys.d.ts.map +1 -1
- package/dist/ssh/keys.js +126 -11
- package/dist/ssh/keys.js.map +1 -1
- package/dist/types.d.ts +53 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +68 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +166 -13
- package/dist/utils.js.map +1 -1
- package/dist/verify.d.ts +17 -5
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +47 -9
- package/dist/verify.js.map +1 -1
- package/openapi.json +402 -2
- package/package.json +1 -1
- package/src/api/operations.ts +119 -16
- package/src/api/schema.ts +9 -0
- package/src/api/v3/index.ts +1 -0
- package/src/api/v3/schema.ts +11 -4
- package/src/api/v4/index.ts +1 -0
- package/src/api/v4/schema.ts +11 -5
- package/src/db/index.ts +162 -37
- package/src/db/migrations/0003_krl_revision.ts +15 -0
- package/src/db/migrations/index.ts +2 -0
- package/src/db/types.ts +2 -0
- package/src/index.ts +6 -4
- package/src/krl.ts +3 -2
- package/src/logger.ts +25 -1
- package/src/node/cache.ts +62 -0
- package/src/node/env.ts +6 -5
- package/src/node/index.ts +1 -0
- package/src/router.ts +64 -2
- package/src/ssh/keys.ts +145 -12
- package/src/types.ts +49 -3
- package/src/utils.ts +188 -14
- package/src/verify.ts +54 -14
package/dist/ssh/keys.js
CHANGED
|
@@ -103,6 +103,34 @@ export class PublicKey {
|
|
|
103
103
|
return this.comment === undefined ? key : `${key} ${this.comment}`;
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* The smallest RSA key, in bits, that the CA will issue a certificate for.
|
|
108
|
+
* This matches the minimum accepted by ssh-ca-client.
|
|
109
|
+
*/
|
|
110
|
+
export const MinimumRsaKeyBits = 2048;
|
|
111
|
+
/**
|
|
112
|
+
* Returns the size in bits of the modulus of an RSA public key, or undefined
|
|
113
|
+
* if the key is not an RSA key.
|
|
114
|
+
*
|
|
115
|
+
* @param key The public key
|
|
116
|
+
*/
|
|
117
|
+
export const rsaKeyBits = (key) => {
|
|
118
|
+
if (key.type !== "ssh-rsa") {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
// the fields of an RSA key are the exponent and the modulus, an mpint
|
|
122
|
+
// that may have a leading zero byte to keep it positive
|
|
123
|
+
const modulus = decodePublicKey(key.blob).fields[1];
|
|
124
|
+
if (modulus === undefined) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const start = modulus.findIndex((byte) => byte !== 0);
|
|
128
|
+
const first = modulus[start];
|
|
129
|
+
if (start === -1 || first === undefined) {
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
return (modulus.length - start - 1) * 8 + first.toString(2).length;
|
|
133
|
+
};
|
|
106
134
|
const EcdsaCurves = {
|
|
107
135
|
nistp256: { namedCurve: "P-256", size: 32 },
|
|
108
136
|
nistp384: { namedCurve: "P-384", size: 48 },
|
|
@@ -150,23 +178,86 @@ const EcdsaPrivateKey = P.struct({
|
|
|
150
178
|
const keyTypeName = (type) => {
|
|
151
179
|
return type.replace(/^ssh-/, "").replace(/^ecdsa-sha2-.*$/, "ecdsa");
|
|
152
180
|
};
|
|
181
|
+
// decodes the base64 body of a PEM block
|
|
182
|
+
const decodePem = (body) => {
|
|
183
|
+
try {
|
|
184
|
+
return new Uint8Array(base64.decode(body.replace(/\s+/g, "")));
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
throw new KeyParseError("private key could not be decoded", err);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
/** The algorithms that an unencrypted PKCS#8 private key is imported as, in the order they are tried */
|
|
191
|
+
const Pkcs8Algorithms = [
|
|
192
|
+
{ type: "ed25519", algorithm: { name: "Ed25519" } },
|
|
193
|
+
...["nistp256", "nistp384", "nistp521"].map((curve) => ({ type: "ecdsa", curve, algorithm: { name: "ECDSA", namedCurve: EcdsaCurves[curve].namedCurve } })),
|
|
194
|
+
];
|
|
195
|
+
// imports a PKCS#8 private key, returning undefined if it is not a key for
|
|
196
|
+
// the algorithm
|
|
197
|
+
const importPkcs8 = async (der, algorithm) => {
|
|
198
|
+
try {
|
|
199
|
+
return await crypto.subtle.importKey("pkcs8", der, algorithm, true, ["sign"]);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
// returns a member of a JWK exported by WebCrypto, which is always present
|
|
206
|
+
// for the key types that are exported
|
|
207
|
+
const jwkMember = (jwk, name) => {
|
|
208
|
+
const value = jwk[name];
|
|
209
|
+
if (value === undefined) {
|
|
210
|
+
throw new KeyParseError(`private key was missing "${name}" when exported`);
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Parses an unencrypted Ed25519 or ECDSA private key in PKCS#8 format, as
|
|
216
|
+
* created by `ssh-keygen -m PKCS8` or `openssl genpkey`
|
|
217
|
+
*/
|
|
218
|
+
const parsePkcs8PrivateKey = async (body) => {
|
|
219
|
+
const der = decodePem(body);
|
|
220
|
+
for (const candidate of Pkcs8Algorithms) {
|
|
221
|
+
const cryptoKey = await importPkcs8(der, candidate.algorithm);
|
|
222
|
+
if (cryptoKey === undefined) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const jwk = await crypto.subtle.exportKey("jwk", cryptoKey);
|
|
226
|
+
const d = jwkMember(jwk, "d");
|
|
227
|
+
const x = jwkMember(jwk, "x");
|
|
228
|
+
if (candidate.type === "ed25519") {
|
|
229
|
+
return {
|
|
230
|
+
type: "ed25519",
|
|
231
|
+
publicKey: new PublicKey(P.struct({ type: SSHText, key: SSHBytes }).encode({ type: "ssh-ed25519", key: base64urlnopad.decode(x) })),
|
|
232
|
+
jwk: { kty: "OKP", crv: "Ed25519", d, x },
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const y = jwkMember(jwk, "y");
|
|
236
|
+
const point = new Uint8Array([0x04, ...base64urlnopad.decode(x), ...base64urlnopad.decode(y)]);
|
|
237
|
+
return {
|
|
238
|
+
type: "ecdsa",
|
|
239
|
+
curve: candidate.curve,
|
|
240
|
+
publicKey: new PublicKey(P.struct({ type: SSHText, curve: SSHText, key: SSHBytes }).encode({ type: `ecdsa-sha2-${candidate.curve}`, curve: candidate.curve, key: point })),
|
|
241
|
+
jwk: { kty: "EC", crv: EcdsaCurves[candidate.curve].namedCurve, d, x, y },
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// RSA keys are recognised only to give a clearer error
|
|
245
|
+
if (await importPkcs8(der, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }) !== undefined) {
|
|
246
|
+
throw new UnsupportedKeyError("CA key type rsa is not supported, the CA key must be Ed25519 or ECDSA");
|
|
247
|
+
}
|
|
248
|
+
// WebCrypto does not say why a key could not be imported, so a key of
|
|
249
|
+
// another type cannot be told apart from one that is corrupt
|
|
250
|
+
throw new KeyParseError("PKCS#8 private key could not be imported as an Ed25519 or ECDSA (nistp256, nistp384 or nistp521) key");
|
|
251
|
+
};
|
|
153
252
|
/**
|
|
154
253
|
* Parses an unencrypted Ed25519 or ECDSA private key in OpenSSH format, as
|
|
155
254
|
* created by `ssh-keygen`
|
|
156
|
-
*
|
|
157
|
-
* @param text The private key, starting with `-----BEGIN OPENSSH PRIVATE KEY-----`
|
|
158
|
-
* @returns The private key
|
|
159
|
-
* @throws {@link KeyParseError} when the key cannot be parsed or is encrypted
|
|
160
|
-
* @throws {@link UnsupportedKeyError} when the key is not an Ed25519 or ECDSA key
|
|
161
255
|
*/
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
if (match === null) {
|
|
165
|
-
throw new KeyParseError("private key was not in OpenSSH format, as created by ssh-keygen (starting with -----BEGIN OPENSSH PRIVATE KEY-----)");
|
|
166
|
-
}
|
|
256
|
+
const parseOpenSshPrivateKey = (body) => {
|
|
257
|
+
const bytes = decodePem(body);
|
|
167
258
|
let container;
|
|
168
259
|
try {
|
|
169
|
-
container = OpenSshPrivateKey.decode(
|
|
260
|
+
container = OpenSshPrivateKey.decode(bytes);
|
|
170
261
|
}
|
|
171
262
|
catch (err) {
|
|
172
263
|
throw new KeyParseError("private key could not be decoded", err);
|
|
@@ -246,4 +337,28 @@ export const parsePrivateKey = (text) => {
|
|
|
246
337
|
}
|
|
247
338
|
throw new UnsupportedKeyError(`CA key type ${keyTypeName(start.type)} is not supported, the CA key must be Ed25519 or ECDSA`);
|
|
248
339
|
};
|
|
340
|
+
/**
|
|
341
|
+
* Parses an unencrypted Ed25519 or ECDSA private key, either in OpenSSH
|
|
342
|
+
* format, as created by `ssh-keygen`, or in PKCS#8 format, as created by
|
|
343
|
+
* `ssh-keygen -m PKCS8` or `openssl genpkey`
|
|
344
|
+
*
|
|
345
|
+
* @param text The private key, starting with `-----BEGIN OPENSSH PRIVATE KEY-----` or `-----BEGIN PRIVATE KEY-----`
|
|
346
|
+
* @returns The private key. A PKCS#8 key has no comment.
|
|
347
|
+
* @throws {@link KeyParseError} when the key cannot be parsed or is encrypted
|
|
348
|
+
* @throws {@link UnsupportedKeyError} when the key is not an Ed25519 or ECDSA key
|
|
349
|
+
*/
|
|
350
|
+
export const parsePrivateKey = async (text) => {
|
|
351
|
+
const openssh = /-----BEGIN OPENSSH PRIVATE KEY-----([\s\S]*?)-----END OPENSSH PRIVATE KEY-----/.exec(text);
|
|
352
|
+
if (openssh?.[1] !== undefined) {
|
|
353
|
+
return parseOpenSshPrivateKey(openssh[1]);
|
|
354
|
+
}
|
|
355
|
+
const pkcs8 = /-----BEGIN PRIVATE KEY-----([\s\S]*?)-----END PRIVATE KEY-----/.exec(text);
|
|
356
|
+
if (pkcs8?.[1] !== undefined) {
|
|
357
|
+
return parsePkcs8PrivateKey(pkcs8[1]);
|
|
358
|
+
}
|
|
359
|
+
if (text.includes("-----BEGIN ENCRYPTED PRIVATE KEY-----")) {
|
|
360
|
+
throw new KeyParseError("encrypted private keys are not supported");
|
|
361
|
+
}
|
|
362
|
+
throw new KeyParseError("private key was not in OpenSSH format, as created by ssh-keygen (starting with -----BEGIN OPENSSH PRIVATE KEY-----), or in PKCS#8 format (starting with -----BEGIN PRIVATE KEY-----)");
|
|
363
|
+
};
|
|
249
364
|
//# sourceMappingURL=keys.js.map
|
package/dist/ssh/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ssh/keys.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ssh/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -78,13 +78,53 @@ export interface CaSecret {
|
|
|
78
78
|
get(): Promise<string>;
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
81
|
+
* A rate limiter, with the same shape as a Cloudflare Workers rate limit
|
|
82
|
+
* binding.
|
|
83
|
+
*
|
|
84
|
+
* A Workers `RateLimit` binding satisfies this structurally. On other
|
|
85
|
+
* runtimes any limiter with the same shape may be used.
|
|
86
|
+
*/
|
|
87
|
+
export interface CaRateLimiter {
|
|
88
|
+
/**
|
|
89
|
+
* Counts a request against the limit for a key
|
|
90
|
+
*
|
|
91
|
+
* @param options The key the request is counted against, for example the client IP address
|
|
92
|
+
* @returns Whether the request is within the limit
|
|
93
|
+
*/
|
|
94
|
+
limit(options: {
|
|
95
|
+
key: string;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
success: boolean;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A key-value cache, with the subset of a Cloudflare Workers KV namespace
|
|
102
|
+
* binding used by the CA.
|
|
103
|
+
*
|
|
104
|
+
* A Workers `KVNamespace` binding satisfies this structurally. On other
|
|
105
|
+
* runtimes any cache with the same shape may be used, such as the in-memory
|
|
106
|
+
* cache returned by `cacheInMemory` from `@andrewheberle/serverless-ssh-ca/node`.
|
|
107
|
+
*/
|
|
108
|
+
export interface CaCache {
|
|
109
|
+
/** Returns the value for a key, or null if there is none */
|
|
110
|
+
get(key: string): Promise<string | null>;
|
|
111
|
+
/** Sets the value for a key, which may expire after `expirationTtl` seconds */
|
|
112
|
+
put(key: string, value: string, options?: {
|
|
113
|
+
expirationTtl?: number;
|
|
114
|
+
}): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The bindings (environment) the CA expects, see {@link CaDatabase},
|
|
118
|
+
* {@link CaSecret}, {@link CaRateLimiter} and {@link CaCache} for the non-string
|
|
119
|
+
* bindings.
|
|
83
120
|
*/
|
|
84
121
|
export interface SshCaBindings {
|
|
85
122
|
CERTIFICATE_REQUEST_TIME_SKEW_MAX: string;
|
|
86
123
|
JWT_ALGORITHMS: string | string[];
|
|
87
|
-
|
|
124
|
+
/** The audience the identity token, and unless {@link SshCaBindings.JWT_ACCESS_TOKEN_AUD} is set the access token, must be issued for */
|
|
125
|
+
JWT_AUD: string | string[];
|
|
126
|
+
/** The audience the access token must be issued for, when it differs from {@link SshCaBindings.JWT_AUD} */
|
|
127
|
+
JWT_ACCESS_TOKEN_AUD?: string | string[];
|
|
88
128
|
JWT_ISSUER: string;
|
|
89
129
|
JWT_JWKS_URL: string;
|
|
90
130
|
JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM: string;
|
|
@@ -93,6 +133,16 @@ export interface SshCaBindings {
|
|
|
93
133
|
DB: CaDatabase;
|
|
94
134
|
ISSUER_DN: string;
|
|
95
135
|
PRIVATE_KEY: CaSecret;
|
|
136
|
+
/**
|
|
137
|
+
* Limits requests to issue, renew and revoke certificates, see
|
|
138
|
+
* {@link CaRateLimiter}. Requests are not limited when this is not set.
|
|
139
|
+
*/
|
|
140
|
+
RATE_LIMITER?: CaRateLimiter;
|
|
141
|
+
/**
|
|
142
|
+
* Caches KRLs until a certificate is revoked, see {@link CaCache}. KRLs
|
|
143
|
+
* are generated for every request when this is not set.
|
|
144
|
+
*/
|
|
145
|
+
CACHE?: CaCache;
|
|
96
146
|
SSH_CERTIFICATE_EXTENSIONS: string;
|
|
97
147
|
SSH_CERTIFICATE_INCLUDE_SELF_EMAIL?: string | boolean;
|
|
98
148
|
SSH_CERTIFICATE_INCLUDE_SELF?: string | boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC,MAAM,MAAM,wBAAwB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAA;CACtB,CAAA;AAGD,MAAM,MAAM,4BAA4B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;CACnC,GAAG,UAAU,CAAA;AAEd;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE;QACH,kDAAkD;QAClD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,yCAAyC;QACzC,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,6DAA6D;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC3D,iEAAiE;IACjE,OAAO,EAAE,OAAO,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,yEAAyE;IACzE,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,gDAAgD;IAChD,GAAG,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACrC,mDAAmD;IACnD,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACnC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACvB,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC3C,kFAAkF;IAClF,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACrE,4DAA4D;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACzB;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -12,6 +12,38 @@ type AccessToken = {
|
|
|
12
12
|
email: string;
|
|
13
13
|
sub: string;
|
|
14
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Thrown when a claim of a verified token is missing or is not of the
|
|
17
|
+
* expected type.
|
|
18
|
+
*/
|
|
19
|
+
export declare class TokenClaimError extends Error {
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the subject of a verified token, which is compared between the
|
|
24
|
+
* access and identity tokens so must always be present.
|
|
25
|
+
*
|
|
26
|
+
* @param payload The payload of a verified token
|
|
27
|
+
* @returns The `sub` claim of the token
|
|
28
|
+
* @throws {@link TokenClaimError} when the `sub` claim is missing, empty or not a string
|
|
29
|
+
*/
|
|
30
|
+
export declare const tokenSubject: (payload: {
|
|
31
|
+
sub?: unknown;
|
|
32
|
+
}) => string;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the email address of a verified access token, or why it cannot be
|
|
35
|
+
* used.
|
|
36
|
+
*
|
|
37
|
+
* @param payload The payload of a verified access token
|
|
38
|
+
* @returns The email address, or an error message if the claims are not acceptable
|
|
39
|
+
*/
|
|
40
|
+
export declare const tokenEmail: (payload: Record<string, unknown>) => {
|
|
41
|
+
ok: true;
|
|
42
|
+
email: string;
|
|
43
|
+
} | {
|
|
44
|
+
ok: false;
|
|
45
|
+
error: string;
|
|
46
|
+
};
|
|
15
47
|
export declare const transformAuthorizationHeader: (env: SshCaBindings, val: string, ctx: z.RefinementCtx) => Promise<AccessToken | never>;
|
|
16
48
|
/**
|
|
17
49
|
* Parses a public key in OpenSSH format, `${type} ${base64}[ ${comment}]`
|
|
@@ -20,6 +52,22 @@ export declare const transformAuthorizationHeader: (env: SshCaBindings, val: str
|
|
|
20
52
|
* @param ctx The Zod context for any errors
|
|
21
53
|
*/
|
|
22
54
|
export declare const transformPublicKey: (val: string | Buffer<ArrayBufferLike>, ctx: z.RefinementCtx) => PublicKey | never;
|
|
55
|
+
/**
|
|
56
|
+
* Returns why a public key cannot be issued a certificate, or undefined if it
|
|
57
|
+
* can be.
|
|
58
|
+
*
|
|
59
|
+
* RSA keys must be at least {@link MinimumRsaKeyBits} bits, as smaller keys
|
|
60
|
+
* can be factored and are refused by current OpenSSH releases.
|
|
61
|
+
*
|
|
62
|
+
* @param key The public key a certificate would be issued for
|
|
63
|
+
* @returns The reason the key cannot be used, or undefined if it can be
|
|
64
|
+
*/
|
|
65
|
+
export declare const subjectKeyIssue: (key: PublicKey) => string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Refines a public key so only one allowed by {@link subjectKeyIssue} is
|
|
68
|
+
* accepted for a certificate request.
|
|
69
|
+
*/
|
|
70
|
+
export declare const refineSubjectKey: (val: PublicKey, ctx: z.RefinementCtx) => void;
|
|
23
71
|
/**
|
|
24
72
|
* Thrown by {@link identityPrincipals} when the principals claim of an
|
|
25
73
|
* identity token is not a string or an array of strings.
|
|
@@ -59,13 +107,32 @@ type ParsedHostCertificateRequest = {
|
|
|
59
107
|
proof: ProofOfPossession;
|
|
60
108
|
} & HostCertificateRequest;
|
|
61
109
|
export declare const refineHostCertificateRequest: (env: SshCaBindings, val: ParsedHostCertificateRequest, ctx: z.RefinementCtx) => Promise<never>;
|
|
110
|
+
/**
|
|
111
|
+
* Returns why a principal cannot be included on a host certificate, or
|
|
112
|
+
* undefined if it can be.
|
|
113
|
+
*
|
|
114
|
+
* OpenSSH matches the principals of a host certificate as patterns, so a
|
|
115
|
+
* principal such as `*` would make the certificate valid for every host that
|
|
116
|
+
* trusts the CA. Principals are otherwise not restricted, as hosts may be
|
|
117
|
+
* reached by IP address, bare host name or fully qualified domain name.
|
|
118
|
+
*
|
|
119
|
+
* @param principal The principal to check
|
|
120
|
+
* @returns The reason the principal cannot be used, or undefined if it can be
|
|
121
|
+
*/
|
|
122
|
+
export declare const hostPrincipalIssue: (principal: string) => string | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Refines a host certificate principal so only one allowed by
|
|
125
|
+
* {@link hostPrincipalIssue} is accepted.
|
|
126
|
+
*/
|
|
127
|
+
export declare const refineHostPrincipal: (val: string, ctx: z.RefinementCtx) => void;
|
|
62
128
|
type ParsedHostCertificateRenewal = {
|
|
63
129
|
certificate: SshCertificate;
|
|
64
130
|
proof: RenewalProofOfPossession;
|
|
65
131
|
} & HostCertificateRequest;
|
|
66
132
|
/**
|
|
67
133
|
* Checks a certificate presented for renewal was issued by this CA, is a host
|
|
68
|
-
* certificate
|
|
134
|
+
* certificate whose principals are allowed (see {@link hostPrincipalIssue}),
|
|
135
|
+
* is within its validity period and has not been revoked.
|
|
69
136
|
*
|
|
70
137
|
* @param env The CA bindings
|
|
71
138
|
* @param isRevoked Returns whether a serial has been revoked
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,EAAyB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { JWKInvalid, JWKSInvalid, JWSInvalid, JWSSignatureVerificationFailed, JWTClaimValidationFailed, JWTExpired, JWTInvalid } from "jose/errors";
|
|
2
2
|
import { CertificateParseError, SshCertificate } from "./ssh/certificate.js";
|
|
3
|
-
import { KeyParseError, parsePrivateKey, PublicKey, UnsupportedKeyError } from "./ssh/keys.js";
|
|
3
|
+
import { KeyParseError, MinimumRsaKeyBits, parsePrivateKey, PublicKey, rsaKeyBits, UnsupportedKeyError } from "./ssh/keys.js";
|
|
4
4
|
import z from "zod";
|
|
5
|
-
import { verifyJWT } from "./verify.js";
|
|
5
|
+
import { MissingAudienceError, verifyJWT } from "./verify.js";
|
|
6
6
|
import { RenewalProofOfPossession, ProofOfPossession, PossessionParseError } from "./proof.js";
|
|
7
7
|
import { logger } from "./logger.js";
|
|
8
8
|
import { ms } from "itty-time";
|
|
@@ -42,6 +42,64 @@ export const transformProofOfPossession = (env, val, ctx) => {
|
|
|
42
42
|
return z.NEVER;
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Thrown when a claim of a verified token is missing or is not of the
|
|
47
|
+
* expected type.
|
|
48
|
+
*/
|
|
49
|
+
export class TokenClaimError extends Error {
|
|
50
|
+
constructor(message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = "TokenClaimError";
|
|
53
|
+
Object.setPrototypeOf(this, TokenClaimError.prototype);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const SubjectClaimSchema = z.string().min(1);
|
|
57
|
+
/**
|
|
58
|
+
* Returns the subject of a verified token, which is compared between the
|
|
59
|
+
* access and identity tokens so must always be present.
|
|
60
|
+
*
|
|
61
|
+
* @param payload The payload of a verified token
|
|
62
|
+
* @returns The `sub` claim of the token
|
|
63
|
+
* @throws {@link TokenClaimError} when the `sub` claim is missing, empty or not a string
|
|
64
|
+
*/
|
|
65
|
+
export const tokenSubject = (payload) => {
|
|
66
|
+
const parsed = SubjectClaimSchema.safeParse(payload.sub);
|
|
67
|
+
if (!parsed.success) {
|
|
68
|
+
throw new TokenClaimError("JWT was verified but was missing required sub claim");
|
|
69
|
+
}
|
|
70
|
+
return parsed.data;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The claims of an access token that identify the user's email address.
|
|
74
|
+
*
|
|
75
|
+
* `email_verified` is optional as not every IdP includes it, but when it is
|
|
76
|
+
* included it must be true, as an IdP may otherwise issue a token for an
|
|
77
|
+
* address the user has not shown they control.
|
|
78
|
+
*/
|
|
79
|
+
const EmailClaimsSchema = z.object({
|
|
80
|
+
email: z.email(),
|
|
81
|
+
email_verified: z.boolean().optional(),
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* Returns the email address of a verified access token, or why it cannot be
|
|
85
|
+
* used.
|
|
86
|
+
*
|
|
87
|
+
* @param payload The payload of a verified access token
|
|
88
|
+
* @returns The email address, or an error message if the claims are not acceptable
|
|
89
|
+
*/
|
|
90
|
+
export const tokenEmail = (payload) => {
|
|
91
|
+
if (payload.email === undefined) {
|
|
92
|
+
return { ok: false, error: "JWT was verified but was missing required email claim" };
|
|
93
|
+
}
|
|
94
|
+
const parsed = EmailClaimsSchema.safeParse(payload);
|
|
95
|
+
if (!parsed.success) {
|
|
96
|
+
return { ok: false, error: "JWT was verified but the email or email_verified claim was not valid" };
|
|
97
|
+
}
|
|
98
|
+
if (parsed.data.email_verified === false) {
|
|
99
|
+
return { ok: false, error: "JWT was verified but the email address has not been verified by the IdP" };
|
|
100
|
+
}
|
|
101
|
+
return { ok: true, email: parsed.data.email };
|
|
102
|
+
};
|
|
45
103
|
export const transformAuthorizationHeader = async (env, val, ctx) => {
|
|
46
104
|
if (!val.startsWith("Bearer ") || val.length <= 7) {
|
|
47
105
|
return fatalIssue(ctx, "authorization header must be a Bearer token", val);
|
|
@@ -52,18 +110,27 @@ export const transformAuthorizationHeader = async (env, val, ctx) => {
|
|
|
52
110
|
return fatalIssue(ctx, "request did not contain a JWT", val);
|
|
53
111
|
}
|
|
54
112
|
try {
|
|
55
|
-
// verify jwt
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
113
|
+
// verify jwt, which must be issued for this CA
|
|
114
|
+
const aud = split(env.JWT_ACCESS_TOKEN_AUD).length > 0 ? env.JWT_ACCESS_TOKEN_AUD : env.JWT_AUD;
|
|
115
|
+
const { payload } = await verifyJWT(env, jwt, aud);
|
|
116
|
+
const email = tokenEmail(payload);
|
|
117
|
+
if (!email.ok) {
|
|
118
|
+
l.warn(email.error, "in", "transformAuthorizationHeader");
|
|
119
|
+
return fatalIssue(ctx, email.error, val);
|
|
59
120
|
}
|
|
60
121
|
return {
|
|
61
|
-
email:
|
|
62
|
-
sub: payload
|
|
122
|
+
email: email.email,
|
|
123
|
+
sub: tokenSubject(payload),
|
|
63
124
|
};
|
|
64
125
|
}
|
|
65
126
|
catch (err) {
|
|
66
127
|
switch (true) {
|
|
128
|
+
case (err instanceof MissingAudienceError):
|
|
129
|
+
// a misconfigured CA is a server error, not a validation failure
|
|
130
|
+
l.error(err.message, "in", "transformAuthorizationHeader");
|
|
131
|
+
throw new InternalServerErrorException(err.message);
|
|
132
|
+
case (err instanceof TokenClaimError):
|
|
133
|
+
return fatalIssue(ctx, err.message, val);
|
|
67
134
|
case (err instanceof JWSInvalid):
|
|
68
135
|
return fatalIssue(ctx, "the access token was invalid", val);
|
|
69
136
|
case (err instanceof JWTInvalid):
|
|
@@ -124,6 +191,33 @@ export const transformPublicKey = (val, ctx) => {
|
|
|
124
191
|
return z.NEVER;
|
|
125
192
|
}
|
|
126
193
|
};
|
|
194
|
+
/**
|
|
195
|
+
* Returns why a public key cannot be issued a certificate, or undefined if it
|
|
196
|
+
* can be.
|
|
197
|
+
*
|
|
198
|
+
* RSA keys must be at least {@link MinimumRsaKeyBits} bits, as smaller keys
|
|
199
|
+
* can be factored and are refused by current OpenSSH releases.
|
|
200
|
+
*
|
|
201
|
+
* @param key The public key a certificate would be issued for
|
|
202
|
+
* @returns The reason the key cannot be used, or undefined if it can be
|
|
203
|
+
*/
|
|
204
|
+
export const subjectKeyIssue = (key) => {
|
|
205
|
+
const bits = rsaKeyBits(key);
|
|
206
|
+
if (bits !== undefined && bits < MinimumRsaKeyBits) {
|
|
207
|
+
return `RSA keys must be at least ${MinimumRsaKeyBits} bits, not ${bits}`;
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Refines a public key so only one allowed by {@link subjectKeyIssue} is
|
|
213
|
+
* accepted for a certificate request.
|
|
214
|
+
*/
|
|
215
|
+
export const refineSubjectKey = (val, ctx) => {
|
|
216
|
+
const issue = subjectKeyIssue(val);
|
|
217
|
+
if (issue !== undefined) {
|
|
218
|
+
fatalIssue(ctx, issue, val.toString());
|
|
219
|
+
}
|
|
220
|
+
};
|
|
127
221
|
/**
|
|
128
222
|
* Thrown by {@link identityPrincipals} when the principals claim of an
|
|
129
223
|
* identity token is not a string or an array of strings.
|
|
@@ -170,11 +264,11 @@ export const parseIdentity = async (env, jwt, claim) => {
|
|
|
170
264
|
if (jwt === undefined) {
|
|
171
265
|
throw new Error("missing identity token");
|
|
172
266
|
}
|
|
173
|
-
const
|
|
174
|
-
const
|
|
267
|
+
const { payload } = await verifyJWT(env, jwt, env.JWT_AUD);
|
|
268
|
+
const sub = tokenSubject(payload);
|
|
175
269
|
const principals = identityPrincipals(env, payload, claim);
|
|
176
270
|
return {
|
|
177
|
-
sub:
|
|
271
|
+
sub: sub,
|
|
178
272
|
principals: principals,
|
|
179
273
|
};
|
|
180
274
|
};
|
|
@@ -184,9 +278,14 @@ export const transformIdentityToken = async (env, val, ctx) => {
|
|
|
184
278
|
return identity;
|
|
185
279
|
}
|
|
186
280
|
catch (err) {
|
|
281
|
+
// a misconfigured CA is a server error, not a validation failure
|
|
282
|
+
if (err instanceof MissingAudienceError) {
|
|
283
|
+
logger(env).error(err.message, "in", "transformIdentityToken");
|
|
284
|
+
throw new InternalServerErrorException(err.message);
|
|
285
|
+
}
|
|
187
286
|
ctx.issues.push({
|
|
188
287
|
code: "custom",
|
|
189
|
-
message: err instanceof PrincipalsClaimError ? err.message : "problem parsing identity token",
|
|
288
|
+
message: err instanceof PrincipalsClaimError || err instanceof TokenClaimError ? err.message : "problem parsing identity token",
|
|
190
289
|
input: val
|
|
191
290
|
});
|
|
192
291
|
return z.NEVER;
|
|
@@ -285,9 +384,49 @@ export const refineHostCertificateRequest = async (env, val, ctx) => {
|
|
|
285
384
|
return fatalIssue(ctx, "proof of possession verification unhandled error", val);
|
|
286
385
|
}
|
|
287
386
|
};
|
|
387
|
+
// characters that OpenSSH treats as pattern syntax when matching host
|
|
388
|
+
// certificate principals, or that separate entries in a pattern list
|
|
389
|
+
const HostPrincipalPatternChars = /[*?!,]/;
|
|
390
|
+
// whitespace and control characters, which no host name contains
|
|
391
|
+
const HostPrincipalInvalidChars = /[\s\p{Cc}]/u;
|
|
392
|
+
/**
|
|
393
|
+
* Returns why a principal cannot be included on a host certificate, or
|
|
394
|
+
* undefined if it can be.
|
|
395
|
+
*
|
|
396
|
+
* OpenSSH matches the principals of a host certificate as patterns, so a
|
|
397
|
+
* principal such as `*` would make the certificate valid for every host that
|
|
398
|
+
* trusts the CA. Principals are otherwise not restricted, as hosts may be
|
|
399
|
+
* reached by IP address, bare host name or fully qualified domain name.
|
|
400
|
+
*
|
|
401
|
+
* @param principal The principal to check
|
|
402
|
+
* @returns The reason the principal cannot be used, or undefined if it can be
|
|
403
|
+
*/
|
|
404
|
+
export const hostPrincipalIssue = (principal) => {
|
|
405
|
+
if (principal === "") {
|
|
406
|
+
return "host certificate principals must not be empty";
|
|
407
|
+
}
|
|
408
|
+
if (HostPrincipalPatternChars.test(principal)) {
|
|
409
|
+
return `host certificate principal ${JSON.stringify(principal)} must not contain wildcard or pattern characters (*, ?, ! or ,)`;
|
|
410
|
+
}
|
|
411
|
+
if (HostPrincipalInvalidChars.test(principal)) {
|
|
412
|
+
return `host certificate principal ${JSON.stringify(principal)} must not contain whitespace or control characters`;
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* Refines a host certificate principal so only one allowed by
|
|
418
|
+
* {@link hostPrincipalIssue} is accepted.
|
|
419
|
+
*/
|
|
420
|
+
export const refineHostPrincipal = (val, ctx) => {
|
|
421
|
+
const issue = hostPrincipalIssue(val);
|
|
422
|
+
if (issue !== undefined) {
|
|
423
|
+
fatalIssue(ctx, issue, val);
|
|
424
|
+
}
|
|
425
|
+
};
|
|
288
426
|
/**
|
|
289
427
|
* Checks a certificate presented for renewal was issued by this CA, is a host
|
|
290
|
-
* certificate
|
|
428
|
+
* certificate whose principals are allowed (see {@link hostPrincipalIssue}),
|
|
429
|
+
* is within its validity period and has not been revoked.
|
|
291
430
|
*
|
|
292
431
|
* @param env The CA bindings
|
|
293
432
|
* @param isRevoked Returns whether a serial has been revoked
|
|
@@ -306,6 +445,20 @@ export const checkRenewableCertificate = async (env, isRevoked, certificate) =>
|
|
|
306
445
|
if (certificate.kind !== "host") {
|
|
307
446
|
return "the provided certificate is not a host certificate";
|
|
308
447
|
}
|
|
448
|
+
// a certificate issued before small RSA keys were refused must not be
|
|
449
|
+
// renewed, as the renewal would keep its key
|
|
450
|
+
const keyIssue = subjectKeyIssue(certificate.publicKey);
|
|
451
|
+
if (keyIssue !== undefined) {
|
|
452
|
+
return `the provided certificate cannot be renewed: ${keyIssue}`;
|
|
453
|
+
}
|
|
454
|
+
// a certificate issued before wildcard principals were refused must not
|
|
455
|
+
// be renewed, as the renewal would keep its principals
|
|
456
|
+
for (const principal of certificate.principals) {
|
|
457
|
+
const issue = hostPrincipalIssue(principal);
|
|
458
|
+
if (issue !== undefined) {
|
|
459
|
+
return `the provided certificate cannot be renewed: ${issue}`;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
309
462
|
// check certificate is within its validity period, allowing for clock
|
|
310
463
|
// skew at the start as a certificate issued moments ago may have a
|
|
311
464
|
// validity start up to a second in the future
|