@andrewheberle/serverless-ssh-ca 0.22.0 → 0.24.0
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 +174 -1
- package/dist/api/operations.d.ts +50 -0
- package/dist/api/operations.d.ts.map +1 -0
- package/dist/api/operations.js +264 -0
- package/dist/api/operations.js.map +1 -0
- package/dist/api/schema.d.ts +72 -0
- package/dist/api/schema.d.ts.map +1 -0
- package/dist/api/schema.js +114 -0
- package/dist/api/schema.js.map +1 -0
- package/dist/api/v3/index.d.ts.map +1 -1
- package/dist/api/v3/index.js +13 -202
- package/dist/api/v3/index.js.map +1 -1
- package/dist/api/v3/schema.d.ts +23 -68
- package/dist/api/v3/schema.d.ts.map +1 -1
- package/dist/api/v3/schema.js +18 -104
- package/dist/api/v3/schema.js.map +1 -1
- package/dist/api/v4/index.d.ts +8 -0
- package/dist/api/v4/index.d.ts.map +1 -0
- package/dist/api/v4/index.js +155 -0
- package/dist/api/v4/index.js.map +1 -0
- package/dist/api/v4/schema.d.ts +268 -0
- package/dist/api/v4/schema.d.ts.map +1 -0
- package/dist/api/v4/schema.js +186 -0
- package/dist/api/v4/schema.js.map +1 -0
- package/dist/certificate.d.ts +9 -6
- package/dist/certificate.d.ts.map +1 -1
- package/dist/certificate.js +55 -99
- package/dist/certificate.js.map +1 -1
- package/dist/db/index.d.ts +68 -9
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +165 -49
- 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 +3 -2
- package/dist/krl.d.ts.map +1 -1
- package/dist/krl.js +12 -165
- package/dist/krl.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/proof.d.ts +36 -7
- package/dist/proof.d.ts.map +1 -1
- package/dist/proof.js +53 -21
- package/dist/proof.js.map +1 -1
- package/dist/router.d.ts +25 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +41 -2
- package/dist/router.js.map +1 -1
- package/dist/ssh/certificate.d.ts +93 -0
- package/dist/ssh/certificate.d.ts.map +1 -0
- package/dist/ssh/certificate.js +178 -0
- package/dist/ssh/certificate.js.map +1 -0
- package/dist/ssh/encoding.d.ts +41 -0
- package/dist/ssh/encoding.d.ts.map +1 -0
- package/dist/ssh/encoding.js +70 -0
- package/dist/ssh/encoding.js.map +1 -0
- package/dist/ssh/keys.d.ts +92 -0
- package/dist/ssh/keys.d.ts.map +1 -0
- package/dist/ssh/keys.js +277 -0
- package/dist/ssh/keys.js.map +1 -0
- package/dist/ssh/signer.d.ts +35 -0
- package/dist/ssh/signer.d.ts.map +1 -0
- package/dist/ssh/signer.js +99 -0
- package/dist/ssh/signer.js.map +1 -0
- package/dist/types.d.ts +64 -19
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +107 -21
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +251 -65
- 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 +1942 -1
- package/package.json +4 -3
- package/src/api/operations.ts +314 -0
- package/src/api/schema.ts +146 -0
- package/src/api/v3/index.ts +21 -248
- package/src/api/v3/schema.ts +36 -128
- package/src/api/v4/index.ts +266 -0
- package/src/api/v4/schema.ts +241 -0
- package/src/certificate.ts +62 -123
- package/src/db/index.ts +196 -56
- 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 +13 -197
- package/src/node/cache.ts +62 -0
- package/src/node/env.ts +6 -5
- package/src/node/index.ts +1 -0
- package/src/proof.ts +65 -31
- package/src/router.ts +67 -3
- package/src/ssh/certificate.ts +236 -0
- package/src/ssh/encoding.ts +81 -0
- package/src/ssh/keys.ts +327 -0
- package/src/ssh/signer.ts +129 -0
- package/src/types.ts +60 -20
- package/src/utils.ts +285 -81
- package/src/verify.ts +54 -14
package/dist/api/v3/schema.js
CHANGED
|
@@ -1,95 +1,13 @@
|
|
|
1
1
|
import z from "zod";
|
|
2
|
-
import { split, refineCertificateRequest,
|
|
3
|
-
import { ConflictException, contentJson, ForbiddenException, InputValidationException, InternalServerErrorException, UnauthorizedException, UnprocessableEntityException, } from "chanfana";
|
|
2
|
+
import { refineHostPrincipal, split, refineCertificateRequest, transformProofOfPossession, transformRenewalProofOfPossession, refineHostCertificateRequest, transformCertificate, refineHostCertificateRenewal, refineRevokeCertificate, } from "../../utils.js";
|
|
3
|
+
import { ConflictException, contentJson, ForbiddenException, InputValidationException, InternalServerErrorException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, } from "chanfana";
|
|
4
4
|
import { seconds } from "itty-time";
|
|
5
5
|
import { isRevoked } from "../../db/index.js";
|
|
6
6
|
import { CertificateType } from "../../db/types.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* @param certificateType The type of certificate
|
|
10
|
-
* @returns "user" or "host"
|
|
11
|
-
*/
|
|
12
|
-
export const certificateTypeName = (certificateType) => {
|
|
13
|
-
switch (certificateType) {
|
|
14
|
-
case CertificateType.User:
|
|
15
|
-
return "user";
|
|
16
|
-
case CertificateType.Host:
|
|
17
|
-
return "host";
|
|
18
|
-
default: {
|
|
19
|
-
const unknownType = certificateType;
|
|
20
|
-
throw new Error(`unknown certificate type: ${String(unknownType)}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Returns the OpenAPI tag that groups the endpoints for a {@link CertificateType}
|
|
26
|
-
* @param certificateType The type of certificate
|
|
27
|
-
* @returns "User" or "Host"
|
|
28
|
-
*/
|
|
29
|
-
const certificateTypeTag = (certificateType) => {
|
|
30
|
-
switch (certificateType) {
|
|
31
|
-
case CertificateType.User:
|
|
32
|
-
return "User";
|
|
33
|
-
case CertificateType.Host:
|
|
34
|
-
return "Host";
|
|
35
|
-
default: {
|
|
36
|
-
const unknownType = certificateType;
|
|
37
|
-
throw new Error(`unknown certificate type: ${String(unknownType)}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
const openapiStringByte = z.base64()
|
|
42
|
-
.transform((v) => {
|
|
43
|
-
const a = z.util.base64ToUint8Array(v);
|
|
44
|
-
return Buffer.from(a.buffer, a.byteOffset, a.length);
|
|
45
|
-
})
|
|
46
|
-
.openapi({ format: "byte" });
|
|
47
|
-
const proofOfPossession = z.string()
|
|
48
|
-
.meta({
|
|
49
|
-
description: "Proof of possession comprising of ${timestamp}.${fingerprint}.${signature}",
|
|
50
|
-
example: "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0KVTFOSVUwbEhBQUFBQVFBQUFHZ0FBQUFUWldOa2MyRXRjMmhoTWkxdWFYTjBjREkxTmdBQUFBaHVhWE4wY0RJMQpOZ0FBQUVFRUR6Ymk4OE10alBYSDFCb1JURU9HaS96aEc4QnhQNVZUUW5OQkFNMGZtMExtekErUUZkUlNVYVRFCkdNN2l0QjhINmZNZFAydlAxcElQcGUyOWVLQkJZd0FBQUFSbWFXeGxBQUFBQUFBQUFBWnphR0UxTVRJQUFBQmsKQUFBQUUyVmpaSE5oTFhOb1lUSXRibWx6ZEhBeU5UWUFBQUJKQUFBQUlHdmZVZGNDQkRXa3ZwL0ZHS3NkakgrRQpKZzZXN0EvWUJVZng2Z0srQ01raEFBQUFJUUQxOFd5cDNZejZ0eXNvdllXbEJHTXprRnlYbFRrSHM5blVVRXJqCkczNWVPQT09Ci0tLS0tRU5EIFNTSCBTSUdOQVRVUkUtLS0tLQo="
|
|
51
|
-
});
|
|
52
|
-
const publicKey = openapiStringByte
|
|
53
|
-
.transform(transformPublicKey)
|
|
54
|
-
.meta({
|
|
55
|
-
description: "SSH public key to sign",
|
|
56
|
-
example: "ZWNkc2Etc2hhMi1uaXN0cDI1NiBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEF5TlRZQUFBQUlibWx6ZEhBeU5UWUFBQUJCQkdNcFNKdHRmMEl0dE5DVmMyOFR6WEZSMUQweHZPM25wNjdWemVBUXNiZFpza3JEY1lqU2x3SjZIUERtVHBYYVUwbEVhWDlMNFloYy9jQ2YxTWU5RlRrPQo="
|
|
57
|
-
});
|
|
58
|
-
export const createIdentityTokenSchema = (env) => (z.string()
|
|
59
|
-
.meta({
|
|
60
|
-
description: "Identity Token JWT from OIDC IdP",
|
|
61
|
-
example: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzc1NzAzMDk1fQ.ri_neAWnhMNK3LzlsrBcQYymSM4yRjmNSZZSeZiXhrEqtEz6c3cXk0Esq765umGjpUsWcosL-OFrDJlyAjTDnhrd9oV08uc_CW0rQRsJIGEuRo3ryxkLdVu9mGoZWEUb9KwjGJrwxvr-0cPWx5jaDyKwJcqMvtV_bEITUD51sDB1Vm89QfYRO_pGJo2vrRzSvMjpUenRpwPay4lYIBxl41_4YpR9Rc6VrIZuYsjV2iqEZ4eBrygMA7zPR_hN7l7s95FddLOzj5NsK57VT4uLHwYohx2oqMzw3M-B9HsZIQin_9q61pZFQXepzJth0woXiZheU27llnfHX967PhNQyg"
|
|
62
|
-
})
|
|
63
|
-
.transform((val, ctx) => transformIdentityToken(env, val, ctx)));
|
|
64
|
-
export const createAccessTokenSchema = (env) => (z.string()
|
|
65
|
-
.meta({
|
|
66
|
-
description: "Access Token JWT from OIDC IdP",
|
|
67
|
-
example: "Bearer eyJ..."
|
|
68
|
-
})
|
|
69
|
-
.transform((val, ctx) => transformAuthorizationHeader(env, val, ctx)));
|
|
70
|
-
const krl = openapiStringByte
|
|
71
|
-
.meta({ description: "Key Revocation List" });
|
|
72
|
-
export const createHeaderSchema = (env) => (z.object({
|
|
73
|
-
"Authorization": createAccessTokenSchema(env)
|
|
74
|
-
}));
|
|
75
|
-
const certificate = openapiStringByte
|
|
76
|
-
.meta({ description: "Issued Certificate" });
|
|
77
|
-
export const CaPublicKeyEndpointSchema = {
|
|
78
|
-
tags: ["CA"],
|
|
79
|
-
responses: {
|
|
80
|
-
"200": {
|
|
81
|
-
content: {
|
|
82
|
-
"text/plain": {
|
|
83
|
-
schema: z.string()
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
description: "Returns SSH Certificate Authority Public Key",
|
|
87
|
-
},
|
|
88
|
-
...InternalServerErrorException.schema(),
|
|
89
|
-
}
|
|
90
|
-
};
|
|
7
|
+
import { certificate, certificateTypeName, certificateTypeTag, createHeaderSchema, createIdentityTokenSchema, openapiStringByte, proofOfPossession, publicKey, subjectPublicKey, } from "../schema.js";
|
|
8
|
+
export { CaPublicKeyEndpointSchema, certificateTypeName, createAccessTokenSchema, createHeaderSchema, createIdentityTokenSchema, createRevocationListEndpointSchema, } from "../schema.js";
|
|
91
9
|
export const userCertificateRequestEndpointBodySchema = (env) => (z.object({
|
|
92
|
-
public_key:
|
|
10
|
+
public_key: subjectPublicKey,
|
|
93
11
|
proof: proofOfPossession
|
|
94
12
|
.transform((val, ctx) => transformProofOfPossession(env, val, ctx)),
|
|
95
13
|
identity: createIdentityTokenSchema(env),
|
|
@@ -106,6 +24,8 @@ export const userCertificateRequestEndpointBodySchema = (env) => (z.object({
|
|
|
106
24
|
.openapi("User Certificate Request"));
|
|
107
25
|
export const createUserCertificateRequestEndpointSchema = (env) => ({
|
|
108
26
|
tags: [certificateTypeTag(CertificateType.User)],
|
|
27
|
+
summary: "Request a user certificate",
|
|
28
|
+
description: "Issues a signed SSH user certificate for the provided public key. The request must be authenticated with an access token and include an identity token from the OIDC IdP for the same subject, along with a proof of possession of the private key. Principals on the issued certificate are derived from the identity token.",
|
|
109
29
|
security: [{ oidcAuth: [] }],
|
|
110
30
|
request: {
|
|
111
31
|
headers: createHeaderSchema(env),
|
|
@@ -124,29 +44,15 @@ export const createUserCertificateRequestEndpointSchema = (env) => ({
|
|
|
124
44
|
...InputValidationException.schema(),
|
|
125
45
|
...UnprocessableEntityException.schema(),
|
|
126
46
|
...InternalServerErrorException.schema(),
|
|
127
|
-
|
|
128
|
-
});
|
|
129
|
-
export const createRevocationListEndpointSchema = (certificateType) => ({
|
|
130
|
-
tags: [certificateTypeTag(certificateType)],
|
|
131
|
-
summary: `Get the Key Revocation List for ${certificateTypeName(certificateType)} certificates`,
|
|
132
|
-
responses: {
|
|
133
|
-
"200": {
|
|
134
|
-
description: `Returns an Open SSH Key Revocation List of revoked ${certificateTypeName(certificateType)} certificates as BASE64 and an SSHSIG signature for verification`,
|
|
135
|
-
...contentJson(z.object({
|
|
136
|
-
krl: krl,
|
|
137
|
-
signature: z.string()
|
|
138
|
-
})
|
|
139
|
-
.openapi("Key Revocation List Response"))
|
|
140
|
-
},
|
|
141
|
-
...InternalServerErrorException.schema(),
|
|
47
|
+
...TooManyRequestsException.schema(),
|
|
142
48
|
}
|
|
143
49
|
});
|
|
144
50
|
export const hostCertificateRequestEndpointBodySchema = (env) => (z.object({
|
|
145
|
-
public_key:
|
|
51
|
+
public_key: subjectPublicKey,
|
|
146
52
|
proof: proofOfPossession
|
|
147
53
|
.transform((val, ctx) => transformProofOfPossession(env, val, ctx)),
|
|
148
54
|
identity: createIdentityTokenSchema(env),
|
|
149
|
-
principals: z.array(z.string()).min(1)
|
|
55
|
+
principals: z.array(z.string().superRefine(refineHostPrincipal)).min(1)
|
|
150
56
|
.meta({ description: "List of principals to include on the issued certificate" }),
|
|
151
57
|
lifetime: z.int()
|
|
152
58
|
.min(seconds("24 hours"))
|
|
@@ -158,6 +64,8 @@ export const hostCertificateRequestEndpointBodySchema = (env) => (z.object({
|
|
|
158
64
|
.openapi("Host Certificate Request"));
|
|
159
65
|
export const createHostCertificateRequestEndpointSchema = (env) => ({
|
|
160
66
|
tags: [certificateTypeTag(CertificateType.Host)],
|
|
67
|
+
summary: "Request a host certificate",
|
|
68
|
+
description: "Issues a signed SSH host certificate for the provided public key and principals. The request must be authenticated with an access token and include an identity token from the OIDC IdP for the same subject, along with a proof of possession of the private key. The user must be permitted to request host certificates by email address or role.",
|
|
161
69
|
security: [{ oidcAuth: [] }],
|
|
162
70
|
request: {
|
|
163
71
|
headers: createHeaderSchema(env),
|
|
@@ -176,6 +84,7 @@ export const createHostCertificateRequestEndpointSchema = (env) => ({
|
|
|
176
84
|
...InputValidationException.schema(),
|
|
177
85
|
...UnprocessableEntityException.schema(),
|
|
178
86
|
...InternalServerErrorException.schema(),
|
|
87
|
+
...TooManyRequestsException.schema(),
|
|
179
88
|
}
|
|
180
89
|
});
|
|
181
90
|
export const hostCertificateRenewEndpointBodySchema = (env) => (z.object({
|
|
@@ -195,6 +104,8 @@ export const hostCertificateRenewEndpointBodySchema = (env) => (z.object({
|
|
|
195
104
|
.openapi("Host Certificate Renew"));
|
|
196
105
|
export const createHostCertificateRenewEndpointSchema = (env) => ({
|
|
197
106
|
tags: [certificateTypeTag(CertificateType.Host)],
|
|
107
|
+
summary: "Renew a host certificate",
|
|
108
|
+
description: "Issues a new SSH host certificate with the same principals as an existing, unexpired and unrevoked host certificate issued by this CA. No OIDC authentication is required; instead the public key must match the existing certificate and the proof of possession must be made with its private key. The lifetime of the renewed certificate is no longer than that of the existing certificate. The existing certificate is revoked, so it cannot be used or renewed again once the renewed certificate is installed.",
|
|
198
109
|
request: {
|
|
199
110
|
body: contentJson(hostCertificateRenewEndpointBodySchema(env))
|
|
200
111
|
},
|
|
@@ -211,6 +122,7 @@ export const createHostCertificateRenewEndpointSchema = (env) => ({
|
|
|
211
122
|
...InputValidationException.schema(),
|
|
212
123
|
...UnprocessableEntityException.schema(),
|
|
213
124
|
...InternalServerErrorException.schema(),
|
|
125
|
+
...TooManyRequestsException.schema(),
|
|
214
126
|
}
|
|
215
127
|
});
|
|
216
128
|
export const revokeCertificateEndpointBodySchema = (env) => (z.object({
|
|
@@ -230,6 +142,7 @@ export const revokeCertificateEndpointBodySchema = (env) => (z.object({
|
|
|
230
142
|
export const createRevokeCertificateEndpointSchema = (env, certificateType) => ({
|
|
231
143
|
tags: [certificateTypeTag(certificateType)],
|
|
232
144
|
summary: `Revoke a ${certificateTypeName(certificateType)} certificate`,
|
|
145
|
+
description: `Revokes a ${certificateTypeName(certificateType)} certificate issued by this CA, identified by its serial number, and adds it to the ${certificateTypeName(certificateType)} Key Revocation List. The request must include a proof of possession of the private key for the public key that the certificate was issued for.`,
|
|
233
146
|
request: {
|
|
234
147
|
body: contentJson(revokeCertificateEndpointBodySchema(env))
|
|
235
148
|
},
|
|
@@ -246,6 +159,7 @@ export const createRevokeCertificateEndpointSchema = (env, certificateType) => (
|
|
|
246
159
|
...InputValidationException.schema(),
|
|
247
160
|
...UnprocessableEntityException.schema(),
|
|
248
161
|
...InternalServerErrorException.schema(),
|
|
162
|
+
...TooManyRequestsException.schema(),
|
|
249
163
|
...ConflictException.schema()
|
|
250
164
|
}
|
|
251
165
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/api/v3/schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,OAAO,EACN,KAAK,EACL,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/api/v3/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SshCaBindings } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The path the v4 API is served under, which is part of the request a proof
|
|
4
|
+
* of possession is made for
|
|
5
|
+
*/
|
|
6
|
+
export declare const BasePath = "/api/v4";
|
|
7
|
+
export declare const createApi: (env: SshCaBindings) => import("chanfana").HonoOpenAPIRouterType<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/v4/index.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,QAAQ,YAAY,CAAA;AAsNjC,eAAO,MAAM,SAAS,QAAS,aAAa,mHAa3C,CAAA"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { group } from "@andrewheberle/ts-slog";
|
|
2
|
+
import { ForbiddenException, fromHono, InputValidationException, OpenAPIRoute, UnauthorizedException, } from "chanfana";
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import { createSignedCertificate, createSignedHostCertificate, } from "../../certificate.js";
|
|
5
|
+
import { split } from "../../utils.js";
|
|
6
|
+
import { CertificateType } from "../../db/types.js";
|
|
7
|
+
import { caPublicKey, issueCertificate, revocationList, revoke } from "../operations.js";
|
|
8
|
+
import { certificateTypeName } from "../schema.js";
|
|
9
|
+
import { createCaPublicKeyEndpointSchema, createGetRevocationListEndpointSchema, createIssueHostCertificateEndpointSchema, createIssueUserCertificateEndpointSchema, createRenewHostCertificateEndpointSchema, createRevokeCertificateEndpointSchema, ProofHeader, } from "./schema.js";
|
|
10
|
+
import { logger } from "../../logger.js";
|
|
11
|
+
/**
|
|
12
|
+
* The path the v4 API is served under, which is part of the request a proof
|
|
13
|
+
* of possession is made for
|
|
14
|
+
*/
|
|
15
|
+
export const BasePath = "/api/v4";
|
|
16
|
+
/**
|
|
17
|
+
* Ensures a proof of possession was made with the private key for a public key
|
|
18
|
+
* and for this request, so it cannot be replayed against another endpoint or
|
|
19
|
+
* for another certificate.
|
|
20
|
+
*
|
|
21
|
+
* @param l The logger for the request
|
|
22
|
+
* @param proof The proof of possession from the request
|
|
23
|
+
* @param key The public key the proof must be made with
|
|
24
|
+
* @param method The HTTP method of the request
|
|
25
|
+
* @param path The path of the request below {@link BasePath}, with any parameters filled in
|
|
26
|
+
* @throws {@link InputValidationException} when the proof is not valid for the key and request
|
|
27
|
+
*/
|
|
28
|
+
const verifyProof = async (l, proof, key, method, path) => {
|
|
29
|
+
if (!proof.matches(key)) {
|
|
30
|
+
l.warn("proof of possession fingerprint did not match public key");
|
|
31
|
+
throw new InputValidationException("proof of possession fingerprint did not match public key", ["headers", ProofHeader]);
|
|
32
|
+
}
|
|
33
|
+
if (!await proof.verifyRequest(method, `${BasePath}${path}`)) {
|
|
34
|
+
l.warn("proof of possession signature validation failed");
|
|
35
|
+
throw new InputValidationException("proof of possession signature validation failed", ["headers", ProofHeader]);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const CaPublicKeyEndpoint = (env) => {
|
|
39
|
+
return class extends OpenAPIRoute {
|
|
40
|
+
schema = createCaPublicKeyEndpointSchema();
|
|
41
|
+
async handle(c) {
|
|
42
|
+
const l = logger(env).with(...group("request", "action", "ca"));
|
|
43
|
+
return await caPublicKey(c, l);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const IssueUserCertificateEndpoint = (env) => {
|
|
48
|
+
return class extends OpenAPIRoute {
|
|
49
|
+
schema = createIssueUserCertificateEndpointSchema(env);
|
|
50
|
+
async handle(c) {
|
|
51
|
+
const data = await this.getValidatedData();
|
|
52
|
+
const l = logger(env).with(...group("request", "type", "user", "action", "request"), ...group("auth_token", "email", data.headers.Authorization.email, "sub", data.headers.Authorization.sub), ...group("id_token", "sub", data.body.identity.sub));
|
|
53
|
+
await verifyProof(l, data.headers[ProofHeader], data.body.public_key, "POST", "/user/certificates");
|
|
54
|
+
if (data.body.identity.sub !== data.headers.Authorization.sub) {
|
|
55
|
+
l.error("token subjects did not match");
|
|
56
|
+
throw new ForbiddenException("Possible token substitution as subjects for authentication and identity tokens did not match");
|
|
57
|
+
}
|
|
58
|
+
const opts = {
|
|
59
|
+
lifetime: data.body.lifetime,
|
|
60
|
+
principals: data.body.identity.principals,
|
|
61
|
+
extensions: data.body.extensions,
|
|
62
|
+
};
|
|
63
|
+
return await issueCertificate(c, l, () => createSignedCertificate(c.env, data.headers.Authorization.email, data.body.public_key, opts), CertificateType.User);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const RevocationListEndpoint = (env, certificateType) => {
|
|
68
|
+
return class extends OpenAPIRoute {
|
|
69
|
+
schema = createGetRevocationListEndpointSchema(certificateType);
|
|
70
|
+
async handle(c) {
|
|
71
|
+
const l = logger(env).with(...group("request", "type", certificateTypeName(certificateType), "action", "krl"));
|
|
72
|
+
return await revocationList(c, l, certificateType);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
const IssueHostCertificateEndpoint = (env) => {
|
|
77
|
+
return class extends OpenAPIRoute {
|
|
78
|
+
schema = createIssueHostCertificateEndpointSchema(env);
|
|
79
|
+
async handle(c) {
|
|
80
|
+
const data = await this.getValidatedData();
|
|
81
|
+
const l = logger(env).with(...group("request", "type", "host", "action", "request"), ...group("auth_token", "email", data.headers.Authorization.email, "sub", data.headers.Authorization.sub), ...group("id_token", "sub", data.body.identity.sub));
|
|
82
|
+
await verifyProof(l, data.headers[ProofHeader], data.body.public_key, "POST", "/host/certificates");
|
|
83
|
+
// check id and access token are for the same user
|
|
84
|
+
if (data.body.identity.sub !== data.headers.Authorization.sub) {
|
|
85
|
+
l.error("token subjects did not match");
|
|
86
|
+
throw new ForbiddenException("possible token substitution as subjects for authentication and identity tokens did not match");
|
|
87
|
+
}
|
|
88
|
+
// check user can issue host certificates
|
|
89
|
+
if (!split(c.env.SSH_HOST_CERTIFICATE_ALLOWED_EMAILS).includes(data.headers.Authorization.email) && !data.body.identity.principals.some((p) => split(c.env.SSH_HOST_CERTIFICATE_ALLOWED_ROLES).includes(p))) {
|
|
90
|
+
l.error("unauthorized host certificate request");
|
|
91
|
+
throw new UnauthorizedException("User not allowed to issue host certificates");
|
|
92
|
+
}
|
|
93
|
+
const opts = {
|
|
94
|
+
lifetime: data.body.lifetime,
|
|
95
|
+
principals: data.body.principals,
|
|
96
|
+
};
|
|
97
|
+
return await issueCertificate(c, l, () => createSignedHostCertificate(c.env, data.body.public_key, opts), CertificateType.Host);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const RenewHostCertificateEndpoint = (env) => {
|
|
102
|
+
return class extends OpenAPIRoute {
|
|
103
|
+
schema = createRenewHostCertificateEndpointSchema(env);
|
|
104
|
+
async handle(c) {
|
|
105
|
+
const data = await this.getValidatedData();
|
|
106
|
+
const serial = data.params.serial;
|
|
107
|
+
const l = logger(env).with(...group("request", "type", "host", "action", "renewal", "serial", serial));
|
|
108
|
+
// the serial in the path is what the proof was made for, so it
|
|
109
|
+
// must be the certificate being renewed
|
|
110
|
+
if (data.body.certificate.serial !== serial) {
|
|
111
|
+
l.warn("certificate serial did not match the serial in the path");
|
|
112
|
+
throw new InputValidationException("certificate serial did not match the serial in the path", ["body", "certificate"]);
|
|
113
|
+
}
|
|
114
|
+
await verifyProof(l, data.headers[ProofHeader], data.body.certificate.publicKey, "POST", `/host/certificates/${serial}/renew`);
|
|
115
|
+
// use smaller of the current certificate lifetime and the requested lifetime
|
|
116
|
+
const originalLifetime = (data.body.certificate.validBefore.getTime() - data.body.certificate.validAfter.getTime()) / 1000;
|
|
117
|
+
const lifetime = originalLifetime > data.body.lifetime
|
|
118
|
+
? data.body.lifetime
|
|
119
|
+
: originalLifetime;
|
|
120
|
+
const opts = {
|
|
121
|
+
lifetime: lifetime,
|
|
122
|
+
principals: data.body.certificate.principals,
|
|
123
|
+
};
|
|
124
|
+
return await issueCertificate(c, l, () => createSignedHostCertificate(c.env, data.body.certificate.publicKey, opts), CertificateType.Host, data.body.certificate);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
const RevokeCertificateEndpoint = (env, certificateType) => {
|
|
129
|
+
return class extends OpenAPIRoute {
|
|
130
|
+
schema = createRevokeCertificateEndpointSchema(env, certificateType);
|
|
131
|
+
async handle(c) {
|
|
132
|
+
const data = await this.getValidatedData();
|
|
133
|
+
const serial = data.params.serial;
|
|
134
|
+
const proof = data.headers[ProofHeader];
|
|
135
|
+
const l = logger(env).with(...group("request", "type", certificateTypeName(certificateType), "action", "revoke", "serial", serial));
|
|
136
|
+
// the key the proof was made with is the key the certificate must
|
|
137
|
+
// have been issued for
|
|
138
|
+
await verifyProof(l, proof, proof.signaturePubkey, "DELETE", `/${certificateTypeName(certificateType)}/certificates/${serial}`);
|
|
139
|
+
return await revoke(c, l, serial, proof.signaturePubkey, certificateType);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
export const createApi = (env) => {
|
|
144
|
+
const api = fromHono(new Hono());
|
|
145
|
+
api.get("/ca", CaPublicKeyEndpoint(env));
|
|
146
|
+
api.post("/user/certificates", IssueUserCertificateEndpoint(env));
|
|
147
|
+
api.delete("/user/certificates/:serial", RevokeCertificateEndpoint(env, CertificateType.User));
|
|
148
|
+
api.get("/user/krl", RevocationListEndpoint(env, CertificateType.User));
|
|
149
|
+
api.post("/host/certificates", IssueHostCertificateEndpoint(env));
|
|
150
|
+
api.post("/host/certificates/:serial/renew", RenewHostCertificateEndpoint(env));
|
|
151
|
+
api.delete("/host/certificates/:serial", RevokeCertificateEndpoint(env, CertificateType.Host));
|
|
152
|
+
api.get("/host/krl", RevocationListEndpoint(env, CertificateType.Host));
|
|
153
|
+
return api;
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/v4/index.ts"],"names":[],"mappings":"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"}
|