@andrewheberle/serverless-ssh-ca 0.17.13 → 0.17.16

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.
Files changed (114) hide show
  1. package/README.md +8 -19
  2. package/dist/api/v3/index.d.ts +1 -0
  3. package/dist/api/v3/index.d.ts.map +1 -0
  4. package/dist/api/v3/index.js +2 -1
  5. package/dist/api/v3/index.js.map +1 -0
  6. package/dist/api/v3/schema.d.ts +47 -1
  7. package/dist/api/v3/schema.d.ts.map +1 -0
  8. package/dist/api/v3/schema.js +65 -61
  9. package/dist/api/v3/schema.js.map +1 -0
  10. package/dist/certificate.d.ts +1 -0
  11. package/dist/certificate.d.ts.map +1 -0
  12. package/dist/certificate.js +11 -6
  13. package/dist/certificate.js.map +1 -0
  14. package/dist/{db.d.ts → db/index.d.ts} +6 -6
  15. package/dist/db/index.d.ts.map +1 -0
  16. package/dist/db/index.js +151 -0
  17. package/dist/db/index.js.map +1 -0
  18. package/dist/db/migrations/0001_initial_schema.d.ts +3 -0
  19. package/dist/db/migrations/0001_initial_schema.d.ts.map +1 -0
  20. package/dist/db/migrations/0001_initial_schema.js +24 -0
  21. package/dist/db/migrations/0001_initial_schema.js.map +1 -0
  22. package/dist/db/migrations/index.d.ts +3 -0
  23. package/dist/db/migrations/index.d.ts.map +1 -0
  24. package/dist/db/migrations/index.js +5 -0
  25. package/dist/db/migrations/index.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/krl.d.ts +1 -0
  31. package/dist/krl.d.ts.map +1 -0
  32. package/dist/krl.js +2 -1
  33. package/dist/krl.js.map +1 -0
  34. package/dist/logger.d.ts +1 -0
  35. package/dist/logger.d.ts.map +1 -0
  36. package/dist/logger.js +13 -1
  37. package/dist/logger.js.map +1 -0
  38. package/dist/proof.d.ts +2 -0
  39. package/dist/proof.d.ts.map +1 -0
  40. package/dist/proof.js +2 -1
  41. package/dist/proof.js.map +1 -0
  42. package/dist/router.d.ts +1 -0
  43. package/dist/router.d.ts.map +1 -0
  44. package/dist/router.js +9 -1
  45. package/dist/router.js.map +1 -0
  46. package/dist/sshsig/armor.d.ts +1 -0
  47. package/dist/sshsig/armor.d.ts.map +1 -0
  48. package/dist/sshsig/armor.js +1 -0
  49. package/dist/sshsig/armor.js.map +1 -0
  50. package/dist/sshsig/formats.d.ts +1 -0
  51. package/dist/sshsig/formats.d.ts.map +1 -0
  52. package/dist/sshsig/formats.js +1 -0
  53. package/dist/sshsig/formats.js.map +1 -0
  54. package/dist/sshsig/index.d.ts +1 -0
  55. package/dist/sshsig/index.d.ts.map +1 -0
  56. package/dist/sshsig/index.js +1 -0
  57. package/dist/sshsig/index.js.map +1 -0
  58. package/dist/sshsig/reader.d.ts +1 -0
  59. package/dist/sshsig/reader.d.ts.map +1 -0
  60. package/dist/sshsig/reader.js +1 -0
  61. package/dist/sshsig/reader.js.map +1 -0
  62. package/dist/sshsig/sig.d.ts +1 -0
  63. package/dist/sshsig/sig.d.ts.map +1 -0
  64. package/dist/sshsig/sig.js +1 -0
  65. package/dist/sshsig/sig.js.map +1 -0
  66. package/dist/sshsig/sig_parser.d.ts +1 -0
  67. package/dist/sshsig/sig_parser.d.ts.map +1 -0
  68. package/dist/sshsig/sig_parser.js +1 -0
  69. package/dist/sshsig/sig_parser.js.map +1 -0
  70. package/dist/sshsig/verifier.d.ts +1 -0
  71. package/dist/sshsig/verifier.d.ts.map +1 -0
  72. package/dist/sshsig/verifier.js +1 -0
  73. package/dist/sshsig/verifier.js.map +1 -0
  74. package/dist/sshsig/writer.d.ts +1 -0
  75. package/dist/sshsig/writer.d.ts.map +1 -0
  76. package/dist/sshsig/writer.js +1 -0
  77. package/dist/sshsig/writer.js.map +1 -0
  78. package/dist/types.d.ts +8 -8
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +1 -0
  81. package/dist/types.js.map +1 -0
  82. package/dist/utils.d.ts +2 -1
  83. package/dist/utils.d.ts.map +1 -0
  84. package/dist/utils.js +14 -11
  85. package/dist/utils.js.map +1 -0
  86. package/dist/verify.d.ts +1 -0
  87. package/dist/verify.d.ts.map +1 -0
  88. package/dist/verify.js +1 -0
  89. package/dist/verify.js.map +1 -0
  90. package/package.json +26 -10
  91. package/src/api/v3/index.ts +419 -0
  92. package/src/api/v3/schema.ts +273 -0
  93. package/src/certificate.ts +220 -0
  94. package/src/db/index.ts +194 -0
  95. package/src/db/migrations/0001_initial_schema.ts +25 -0
  96. package/src/db/migrations/index.ts +6 -0
  97. package/src/index.ts +18 -0
  98. package/src/krl.ts +414 -0
  99. package/src/logger.ts +16 -0
  100. package/src/proof.ts +187 -0
  101. package/src/router.ts +42 -0
  102. package/src/sshsig/armor.ts +24 -0
  103. package/src/sshsig/formats.ts +226 -0
  104. package/src/sshsig/index.ts +47 -0
  105. package/src/sshsig/reader.ts +59 -0
  106. package/src/sshsig/sig.ts +17 -0
  107. package/src/sshsig/sig_parser.ts +90 -0
  108. package/src/sshsig/verifier.ts +85 -0
  109. package/src/sshsig/writer.ts +56 -0
  110. package/src/types.ts +48 -0
  111. package/src/utils.ts +412 -0
  112. package/src/verify.ts +25 -0
  113. package/LICENSE +0 -201
  114. package/dist/db.js +0 -111
package/dist/types.d.ts CHANGED
@@ -25,18 +25,18 @@ export interface SshCaBindings {
25
25
  PRIVATE_KEY: SecretsStoreSecret;
26
26
  SSH_CERTIFICATE_EXTENSIONS: string;
27
27
  SSH_CERTIFICATE_LIFETIME: string;
28
- SSH_CERTIFICATE_INCLUDE_SELF: string;
29
- SSH_CERTIFICATE_PRINCIPALS: string;
28
+ SSH_CERTIFICATE_INCLUDE_SELF?: string | boolean;
29
+ SSH_CERTIFICATE_PRINCIPALS?: string | string[];
30
30
  SSH_HOST_CERTIFICATE_LIFETIME: string;
31
- SSH_HOST_CERTIFICATE_ALLOWED_EMAILS: string;
32
- SSH_HOST_CERTIFICATE_ALLOWED_ROLES: string;
31
+ SSH_HOST_CERTIFICATE_ALLOWED_EMAILS?: string | string[];
32
+ SSH_HOST_CERTIFICATE_ALLOWED_ROLES?: string | string[];
33
33
  ISSUER_DN: string;
34
34
  JWT_JWKS_URL: string;
35
- JWT_AUD: string;
35
+ JWT_AUD?: string | string[];
36
36
  JWT_ISSUER: string;
37
- JWT_ALGORITHMS: string;
37
+ JWT_ALGORITHMS: string | string[];
38
38
  JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM: string;
39
- SSH_HOST_CERTIFICATE_ALLOWED_ROLES_CLAIM: string;
40
39
  CERTIFICATE_REQUEST_TIME_SKEW_MAX: string;
41
- LOG_LEVEL: string;
40
+ LOG_LEVEL?: string;
42
41
  }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;CAC5B,CAAA;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,UAAU,CAAA;IACd,wBAAwB,EAAE,MAAM,CAAA;IAChC,WAAW,EAAE,kBAAkB,CAAA;IAC/B,0BAA0B,EAAE,MAAM,CAAA;IAClC,wBAAwB,EAAE,MAAM,CAAA;IAChC,4BAA4B,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/C,0BAA0B,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9C,6BAA6B,EAAE,MAAM,CAAA;IACrC,mCAAmC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACvD,kCAAkC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACtD,SAAS,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACjC,oCAAoC,EAAE,MAAM,CAAA;IAC5C,iCAAiC,EAAE,MAAM,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB"}
package/dist/types.js CHANGED
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/utils.d.ts CHANGED
@@ -55,6 +55,7 @@ type ParsedRevokeCertificate = {
55
55
  proof: ProofOfPossession;
56
56
  };
57
57
  export declare const refineRevokeCertificate: (env: SshCaBindings, val: ParsedRevokeCertificate, ctx: z.RefinementCtx) => Promise<never>;
58
- export declare const split: (v: string) => string[];
58
+ export declare const split: (v?: string | string[]) => string[];
59
59
  export declare const getPublic: (env: SshCaBindings, key?: PrivateKey) => Promise<Key>;
60
60
  export {};
61
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -40,6 +40,9 @@ export const transformProofOfPossession = (env, val, ctx) => {
40
40
  }
41
41
  };
42
42
  export const transformAuthorizationHeader = async (env, val, ctx) => {
43
+ if (!val.startsWith("Bearer ") || val.length <= 7) {
44
+ return fatalIssue(ctx, "authorization header must be a Bearer token", val);
45
+ }
43
46
  const jwt = val.replace("Bearer ", "");
44
47
  const l = logger(env);
45
48
  if (jwt === "") {
@@ -110,10 +113,6 @@ export const identityPrincipals = (env, payload, claim) => {
110
113
  claim = env.JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM;
111
114
  }
112
115
  const l = logger(env);
113
- if (claim === "__proto__" || claim === "prototype" || claim === "constructor") {
114
- l.warn("invalid principals claim configured", "claim", claim);
115
- return [];
116
- }
117
116
  const p = payload[claim];
118
117
  if (p === undefined) {
119
118
  l.warn("claim was missing despite being set in CA config", "claim", claim);
@@ -133,8 +132,8 @@ export const parseIdentity = async (env, jwt, claim) => {
133
132
  if (jwt === undefined) {
134
133
  throw new Error("missing identity token");
135
134
  }
136
- const aud = env.JWT_AUD === undefined || env.JWT_AUD === "" ? undefined : split(env.JWT_AUD);
137
- const { payload } = await verifyJWT(env, jwt, { aud: aud });
135
+ const aud = split(env.JWT_AUD);
136
+ const { payload } = await verifyJWT(env, jwt, { aud: aud.length === 0 ? undefined : aud });
138
137
  const principals = identityPrincipals(env, payload, claim);
139
138
  return {
140
139
  sub: payload.sub,
@@ -146,7 +145,7 @@ export const transformIdentityToken = async (env, val, ctx) => {
146
145
  const identity = await parseIdentity(env, val, env.JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM);
147
146
  return identity;
148
147
  }
149
- catch (err) {
148
+ catch {
150
149
  ctx.issues.push({
151
150
  code: "custom",
152
151
  message: "problem parsing identity token",
@@ -302,10 +301,13 @@ export const refineRevokeCertificate = async (env, val, ctx) => {
302
301
  }
303
302
  };
304
303
  export const split = (v) => {
305
- if (v === "" || v === undefined) {
306
- return [];
307
- }
308
- return v.split(",");
304
+ return v === undefined
305
+ ? []
306
+ : typeof v === "string"
307
+ ? v === ""
308
+ ? []
309
+ : v.split(",")
310
+ : v;
309
311
  };
310
312
  export const getPublic = async (env, key) => {
311
313
  if (key === undefined) {
@@ -320,3 +322,4 @@ export const getPublic = async (env, key) => {
320
322
  // return in ssh format trimmed of any whitespace
321
323
  return pub;
322
324
  };
325
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/verify.d.ts CHANGED
@@ -5,3 +5,4 @@ type VerifyOptions = {
5
5
  };
6
6
  export declare const verifyJWT: (env: SshCaBindings, jwt: string, opts?: VerifyOptions) => Promise<import("jose").JWTVerifyResult<CertificateRequestJWTPayload> & import("jose").ResolvedKey>;
7
7
  export {};
8
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,KAAK,aAAa,GAAG;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,SAAS,GAAU,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,OAAM,aAAkB,uGAexF,CAAA"}
package/dist/verify.js CHANGED
@@ -14,3 +14,4 @@ export const verifyJWT = async (env, jwt, opts = {}) => {
14
14
  algorithms: split(env.JWT_ALGORITHMS),
15
15
  });
16
16
  };
17
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAGpD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM/B,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAAkB,EAAE,GAAW,EAAE,OAAsB,EAAE,EAAE,EAAE;IACzF,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;IAE7D,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,MAAM,SAAS,CAA+B,GAAG,EAAE,IAAI,EAAE;YAC/D,MAAM,EAAE,GAAG,CAAC,UAAU;YACtB,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;YACrC,QAAQ,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC,CAAA;IACH,CAAC;IAEE,OAAO,MAAM,SAAS,CAA+B,GAAG,EAAE,IAAI,EAAE;QAC5D,MAAM,EAAE,GAAG,CAAC,UAAU;QACtB,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;KACxC,CAAC,CAAA;AACN,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@andrewheberle/serverless-ssh-ca",
3
- "version": "0.17.13",
3
+ "version": "0.17.16",
4
4
  "description": "A serverless SSH CA built on Cloudflare Workers",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
8
- "dist"
8
+ "dist",
9
+ "src"
9
10
  ],
10
11
  "exports": {
11
12
  ".": {
@@ -16,29 +17,37 @@
16
17
  "scripts": {
17
18
  "build": "tsc",
18
19
  "coverage": "vitest run --coverage",
19
- "test": "vitest run",
20
- "test:watch": "vitest",
20
+ "lint": "eslint",
21
21
  "prepublishOnly": "npm run build",
22
- "release": "release-it"
22
+ "release": "release-it",
23
+ "release:ci": "npm run release:patch",
24
+ "release:ci:major": "release-it major --ci",
25
+ "release:ci:minor": "release-it minor --ci",
26
+ "release:ci:patch": "release-it patch --ci",
27
+ "release:dryrun": "release-it --dry-run",
28
+ "schema": "node --require tsx/cjs scripts/export-schema.cjs",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest"
23
31
  },
24
32
  "dependencies": {
25
33
  "@andrewheberle/ts-slog": "^1.3.0",
26
- "@cloudflare/actors": "^0.0.1-beta.6",
27
34
  "@cloudflare/workers-types": "^4.20260528.1",
28
35
  "chanfana": "^3.0.0",
29
36
  "hono": "^4.10.6",
30
37
  "itty-time": "^2.0.2",
31
38
  "jose": "^6.0.12",
39
+ "workers-qb": "^1.14.0",
32
40
  "sshpk": "^1.18.0",
33
41
  "zod": "^4.0.0"
34
42
  },
35
43
  "devDependencies": {
44
+ "@eslint/js": "^10.0.1",
36
45
  "@types/sshpk": "^1.17.4",
37
- "@vitest/coverage-istanbul": "^4.1.7",
38
- "auto-changelog": "^2.5.1",
39
- "release-it": "^20.0.1",
46
+ "@vitest/coverage-v8": "^4.1.7",
47
+ "eslint": "^10.4.1",
40
48
  "tsx": "^4.21.0",
41
49
  "typescript": "^6.0.0",
50
+ "typescript-eslint": "^8.61.0",
42
51
  "vitest": "^4.1.7"
43
52
  },
44
53
  "repository": {
@@ -50,5 +59,12 @@
50
59
  "url": "https://github.com/andrewheberle/serverless-ssh-ca/issues"
51
60
  },
52
61
  "author": "Andrew Heberle",
53
- "license": "Apache-2.0"
62
+ "license": "Apache-2.0",
63
+ "release-it": {
64
+ "git": false,
65
+ "npm": {
66
+ "publish": true,
67
+ "skipChecks": true
68
+ }
69
+ }
54
70
  }
@@ -0,0 +1,419 @@
1
+ import { group } from "@andrewheberle/ts-slog"
2
+ import {
3
+ ApiException,
4
+ ConflictException,
5
+ ForbiddenException,
6
+ fromHono,
7
+ InternalServerErrorException,
8
+ NotFoundException,
9
+ OpenAPIRoute,
10
+ UnauthorizedException,
11
+ UnprocessableEntityException,
12
+ } from "chanfana"
13
+ import { Hono } from "hono"
14
+ import { AppContext } from "../../router"
15
+ import { CertificateSignerResponse } from "../../types"
16
+ import {
17
+ BadIssuerError,
18
+ CreateCertificateOptions,
19
+ CreateHostCertificateOptions,
20
+ createSignedCertificate,
21
+ createSignedHostCertificate,
22
+
23
+ } from "../../certificate"
24
+ import {
25
+ getPublic,
26
+ split,
27
+ } from "../../utils"
28
+ import {
29
+ KeyParseError,
30
+ parsePrivateKey,
31
+ } from "sshpk"
32
+ import {
33
+ CertificateType,
34
+ getRevocationList,
35
+ recordCertificate,
36
+ RevocationStatus,
37
+ revocationStatus,
38
+ revokeCertificate,
39
+ } from "../../db"
40
+ import { KRLBuilder } from "../../krl"
41
+ import {
42
+ CaPublicKeyEndpointSchema,
43
+ createUserCertificateRequestEndpointSchema,
44
+ createRevocationListEndpointSchema,
45
+ createHostCertificateRequestEndpointSchema,
46
+ createHostCertificateRenewEndpointSchema,
47
+ createRevokeCertificateEndpointSchema,
48
+ } from "./schema"
49
+ import { logger } from "../../logger"
50
+ import type { SshCaBindings } from "../../types"
51
+
52
+ const CaPublicKeyEndpoint = (env: SshCaBindings) => {
53
+ return class extends OpenAPIRoute {
54
+ override schema = CaPublicKeyEndpointSchema
55
+
56
+ override async handle(c: AppContext) {
57
+ const l = logger(env).with(
58
+ ...group("request", "action", "ca"),
59
+ )
60
+ try {
61
+ const pub = await getPublic(c.env)
62
+
63
+ return c.text(`${pub.toString("ssh").trim()}\n`)
64
+ } catch (err) {
65
+ switch (true) {
66
+ case (err instanceof KeyParseError):
67
+ l.error("error parsing private key")
68
+ throw new InternalServerErrorException("error parsing private key")
69
+ case (err instanceof ApiException):
70
+ // re-throw any exisiting chanfana error
71
+ throw err
72
+ default:
73
+ // otherwise throw as InternalServerErrorException
74
+ l.error("unhandled error", "error", err)
75
+ throw new InternalServerErrorException("internal server error")
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ const UserCertificateRequestEndpoint = (env: SshCaBindings) => {
83
+ return class extends OpenAPIRoute {
84
+ override schema = createUserCertificateRequestEndpointSchema(env)
85
+
86
+ override async handle(c: AppContext) {
87
+ const data = await this.getValidatedData<typeof this.schema>()
88
+
89
+ const l = logger(env).with(
90
+ ...group("request",
91
+ "type", "user",
92
+ "action", "request",
93
+ ),
94
+ ...group("auth_token",
95
+ "email", data.headers.Authorization.email,
96
+ "sub", data.headers.Authorization.sub,
97
+ ),
98
+ ...group("id_token",
99
+ "sub", data.body.identity.sub,
100
+ ),
101
+ )
102
+
103
+ if (data.body.identity.sub !== data.headers["Authorization"].sub) {
104
+ l.error("token subjects did not match")
105
+ throw new ForbiddenException("Possible token substitution as subjects for authentication and identity tokens did not match")
106
+ }
107
+
108
+ const opts: CreateCertificateOptions = {
109
+ lifetime: data.body.lifetime,
110
+ principals: data.body.identity.principals,
111
+ extensions: data.body.extensions,
112
+ }
113
+
114
+ try {
115
+ const certificate = await createSignedCertificate(c.env, data.headers.Authorization.email, data.body.public_key, opts)
116
+ const response: CertificateSignerResponse = {
117
+ certificate: btoa(certificate.toString("openssh"))
118
+ }
119
+
120
+ try {
121
+ await recordCertificate(c.env, certificate, data.headers.Authorization.email)
122
+ } catch (err) {
123
+ l.error("there was a problem adding issued certificate to database", "error", err)
124
+ }
125
+
126
+ l.info("completed issuing certificate",
127
+ ...group(
128
+ "certificate", "principals",
129
+ certificate.subjects.map(v => v.toString()).join(","), "serial", certificate.serial.readBigUInt64BE(0),
130
+ ),
131
+ )
132
+
133
+ return c.json(response)
134
+ } catch (err) {
135
+ switch (true) {
136
+ case (err instanceof ApiException):
137
+ // re-throw any exisiting chanfana error
138
+ throw err
139
+ default:
140
+ // otherwise throw as InternalServerErrorException
141
+ l.error("unhandled error", "error", err)
142
+ throw new InternalServerErrorException("internal server error")
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ const RevocationListEndpoint = (env: SshCaBindings) => {
150
+ return class extends OpenAPIRoute {
151
+ override schema = createRevocationListEndpointSchema()
152
+
153
+ override async handle(c: AppContext) {
154
+ const data = await this.getValidatedData<typeof this.schema>()
155
+
156
+ const l = logger(env).with(
157
+ ...group("request",
158
+ "type", data.params.certificateType,
159
+ "action", "krl",
160
+ ),
161
+ )
162
+
163
+ const certificateType = data.params.certificateType === "user" ? CertificateType.User : CertificateType.Host
164
+
165
+ try {
166
+ // get revoked serials
167
+ const serials = (await getRevocationList(c.env, certificateType)).map(v => BigInt(v))
168
+
169
+ // grab private key from secret store
170
+ const secret = await c.env.PRIVATE_KEY.get()
171
+
172
+ // parse key
173
+ const key = parsePrivateKey(secret)
174
+
175
+ // generate KRL
176
+ const krl = new KRLBuilder(key)
177
+ .addSerials(serials)
178
+
179
+ const krlBytes = krl.generate()
180
+
181
+ // convert to base64
182
+ const bytes = new Uint8Array(krlBytes)
183
+ let binary = ""
184
+ for (const byte of bytes) {
185
+ binary += String.fromCharCode(byte)
186
+ }
187
+ const base64Krl = btoa(binary)
188
+
189
+ const signature = await krl.signature()
190
+
191
+ return c.json({
192
+ krl: base64Krl,
193
+ signature: signature,
194
+ })
195
+ } catch (err) {
196
+ switch (true) {
197
+ case (err instanceof KeyParseError):
198
+ l.error("error parsing private key")
199
+ throw new InternalServerErrorException("error parsing private key")
200
+ case (err instanceof ApiException):
201
+ // re-throw any exisiting chanfana error
202
+ throw err
203
+ default:
204
+ // otherwise throw as InternalServerErrorException
205
+ l.error("unhandled error", "error", err)
206
+ throw new InternalServerErrorException("internal server error")
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+
213
+ const HostCertificateRequestEndpoint = (env: SshCaBindings) => {
214
+ return class extends OpenAPIRoute {
215
+ override schema = createHostCertificateRequestEndpointSchema(env)
216
+
217
+ override async handle(c: AppContext) {
218
+ const data = await this.getValidatedData<typeof this.schema>()
219
+
220
+ const l = logger(env).with(
221
+ ...group("request",
222
+ "type", "host",
223
+ "action", "request",
224
+ ),
225
+ ...group("auth_token",
226
+ "email", data.headers.Authorization.email,
227
+ "sub", data.headers.Authorization.sub,
228
+ ),
229
+ ...group("id_token",
230
+ "sub", data.body.identity.sub,
231
+ ),
232
+ )
233
+
234
+ // check id and access token are for the same user
235
+ if (data.body.identity.sub !== data.headers.Authorization.sub) {
236
+ l.error("token subjects did not match")
237
+ throw new ForbiddenException("possible token substitution as subjects for authentication and identity tokens did not match")
238
+ }
239
+
240
+ // check user can issue host certificates
241
+ if (!split(c.env.SSH_HOST_CERTIFICATE_ALLOWED_EMAILS).includes(data.headers.Authorization.email) && !data.body.identity.principals.some((p: string) => split(c.env.SSH_HOST_CERTIFICATE_ALLOWED_ROLES).includes(p))) {
242
+ l.error("unauthorized host certificate request")
243
+ throw new UnauthorizedException("User not allowed to issue host certificates")
244
+ }
245
+
246
+ const opts: CreateHostCertificateOptions = {
247
+ lifetime: data.body.lifetime,
248
+ principals: data.body.principals,
249
+ }
250
+
251
+ try {
252
+ const certificate = await createSignedHostCertificate(c.env, data.body.public_key, opts)
253
+ const response: CertificateSignerResponse = {
254
+ certificate: btoa(certificate.toString("openssh"))
255
+ }
256
+
257
+ try {
258
+ await recordCertificate(c.env, certificate, `host_${certificate.subjects[0]!.hostname}`, CertificateType.Host)
259
+ } catch (err) {
260
+ l.error("there was a problem adding issued certificate to database", "error", err)
261
+ }
262
+
263
+ l.info("completed issuing certificate",
264
+ ...group(
265
+ "certificate", "principals",
266
+ certificate.subjects.map(v => v.toString()).join(","), "serial", certificate.serial.readBigUInt64BE(0),
267
+ ),
268
+ )
269
+
270
+ return c.json(response)
271
+ } catch (err) {
272
+ switch (true) {
273
+ case (err instanceof ApiException):
274
+ // re-throw any exisiting chanfana error
275
+ throw err
276
+ default:
277
+ // otherwise throw as InternalServerErrorException
278
+ l.error("unhandled error", "error", err)
279
+ throw new InternalServerErrorException("internal server error")
280
+ }
281
+ }
282
+ }
283
+ }
284
+ }
285
+
286
+ const HostCertificateRenewEndpoint = (env: SshCaBindings) => {
287
+ return class extends OpenAPIRoute {
288
+ override schema = createHostCertificateRenewEndpointSchema(env)
289
+
290
+ override async handle(c: AppContext) {
291
+ const data = await this.getValidatedData<typeof this.schema>()
292
+ const serial = data.body.certificate.serial.readBigUInt64BE(0)
293
+
294
+ const l = logger(env).with(
295
+ ...group("request",
296
+ "type", "host",
297
+ "action", "renewal",
298
+ "serial", serial,
299
+ ),
300
+ )
301
+
302
+ // use smaller of the current certificate lifetime and the requested lifetime
303
+ const originalLifetime = (data.body.certificate.validUntil.getTime() - data.body.certificate.validFrom.getTime()) / 1000
304
+ const lifetime = originalLifetime > data.body.lifetime
305
+ ? data.body.lifetime
306
+ : originalLifetime
307
+
308
+ const opts: CreateHostCertificateOptions = {
309
+ lifetime: lifetime,
310
+ subjects: data.body.certificate.subjects
311
+ }
312
+
313
+ try {
314
+ const certificate = await createSignedHostCertificate(c.env, data.body.public_key, opts)
315
+ const response: CertificateSignerResponse = {
316
+ certificate: btoa(certificate.toString("openssh"))
317
+ }
318
+
319
+ try {
320
+ await recordCertificate(c.env, certificate, `host_${certificate.subjects[0]!.hostname}`, CertificateType.Host)
321
+ } catch (err) {
322
+ l.error("there was a problem adding issued certificate to database", "error", err)
323
+ }
324
+
325
+ l.info("completed issuing certificate",
326
+ ...group(
327
+ "certificate", "principals",
328
+ certificate.subjects.map(v => v.toString()).join(","), "serial", certificate.serial.readBigUInt64BE(0),
329
+ ),
330
+ )
331
+
332
+ return c.json(response)
333
+ } catch (err) {
334
+ switch (true) {
335
+ case (err instanceof ApiException):
336
+ // re-throw any exisiting chanfana error
337
+ throw err
338
+ case (err instanceof BadIssuerError):
339
+ throw new UnprocessableEntityException(err.message)
340
+ default:
341
+ // otherwise throw as InternalServerErrorException
342
+ l.error("unhandled error", "error", err)
343
+ throw new InternalServerErrorException("internal server error")
344
+ }
345
+ }
346
+ }
347
+ }
348
+ }
349
+
350
+ const RevokeCertificateEndpoint = (env: SshCaBindings) => {
351
+ return class extends OpenAPIRoute {
352
+ override schema = createRevokeCertificateEndpointSchema(env)
353
+
354
+ override async handle(c: AppContext) {
355
+ const data = await this.getValidatedData<typeof this.schema>()
356
+
357
+ const l = logger(env).with(
358
+ ...group("request", "type", data.params.certificateType, "action", "revoke", "serial", data.body.serial),
359
+ )
360
+
361
+ const certificatetype = data.params.certificateType === "user" ? CertificateType.User : CertificateType.Host
362
+
363
+ // ensure certificate can be revoked
364
+ const status = await revocationStatus(c.env, data.body.serial, data.body.public_key.toString("ssh"), certificatetype)
365
+ switch (status) {
366
+ case RevocationStatus.Revoked:
367
+ l.warn("certificate is already revoked")
368
+ throw new ConflictException("certificate is already revoked")
369
+ case RevocationStatus.Unrevokable:
370
+ l.warn("cannot revoke this certificate")
371
+ throw new ForbiddenException("cannot revoke this certificate")
372
+ case RevocationStatus.NotFound:
373
+ l.warn("certificate not found")
374
+ throw new NotFoundException("certificate not found")
375
+ }
376
+
377
+ try {
378
+ const res = await revokeCertificate(c.env, data.body.serial)
379
+
380
+ if (res.length === 0) {
381
+ throw new InternalServerErrorException("no results were returned for revocation")
382
+ }
383
+
384
+ if (res.length > 1) {
385
+ l.warn("more than one revocation result was returned", "count", res.length)
386
+ }
387
+
388
+ l.info("completed revocation")
389
+ return c.json({
390
+ revoked_at: res[0]!.revoked_at
391
+ })
392
+ } catch (err) {
393
+ switch (true) {
394
+ case (err instanceof ApiException):
395
+ // re-throw any exisiting chanfana error
396
+ throw err
397
+ default:
398
+ // otherwise throw as InternalServerErrorException
399
+ l.error("unhandled error", "error", err)
400
+ throw new InternalServerErrorException("internal server error")
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+
407
+
408
+ export const createApi = (env: SshCaBindings) => {
409
+ const api = fromHono(new Hono())
410
+
411
+ api.get("/ca", CaPublicKeyEndpoint(env))
412
+ api.post("/user/certificate", UserCertificateRequestEndpoint(env))
413
+ api.get("/:certificateType/krl", RevocationListEndpoint(env))
414
+ api.post("/host/certificate", HostCertificateRequestEndpoint(env))
415
+ api.post("/host/renew", HostCertificateRenewEndpoint(env))
416
+ api.post("/:certificateType/revoke", RevokeCertificateEndpoint(env))
417
+
418
+ return api
419
+ }