@andrewheberle/serverless-ssh-ca 0.22.0 → 0.23.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 +55 -1
- package/dist/api/operations.d.ts +49 -0
- package/dist/api/operations.d.ts.map +1 -0
- package/dist/api/operations.js +175 -0
- package/dist/api/operations.js.map +1 -0
- package/dist/api/schema.d.ts +71 -0
- package/dist/api/schema.d.ts.map +1 -0
- package/dist/api/schema.js +107 -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 +10 -100
- 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 +182 -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 +17 -5
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +39 -23
- package/dist/db/index.js.map +1 -1
- package/dist/krl.d.ts +1 -1
- package/dist/krl.d.ts.map +1 -1
- package/dist/krl.js +9 -163
- package/dist/krl.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.map +1 -1
- package/dist/router.js +3 -1
- 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 +80 -0
- package/dist/ssh/keys.d.ts.map +1 -0
- package/dist/ssh/keys.js +249 -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 +12 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +40 -21
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +87 -54
- package/dist/utils.js.map +1 -1
- package/openapi.json +1542 -1
- package/package.json +4 -3
- package/src/api/operations.ts +211 -0
- package/src/api/schema.ts +137 -0
- package/src/api/v3/index.ts +20 -248
- package/src/api/v3/schema.ts +26 -125
- package/src/api/v4/index.ts +265 -0
- package/src/api/v4/schema.ts +235 -0
- package/src/certificate.ts +62 -123
- package/src/db/index.ts +41 -26
- package/src/krl.ts +10 -195
- package/src/proof.ts +65 -31
- package/src/router.ts +3 -1
- package/src/ssh/certificate.ts +236 -0
- package/src/ssh/encoding.ts +81 -0
- package/src/ssh/keys.ts +294 -0
- package/src/ssh/signer.ts +129 -0
- package/src/types.ts +12 -18
- package/src/utils.ts +99 -69
package/openapi.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Serverless SSH CA API",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "4.0.0"
|
|
6
6
|
},
|
|
7
7
|
"components": {
|
|
8
8
|
"securitySchemes": {
|
|
@@ -203,6 +203,103 @@
|
|
|
203
203
|
"public_key",
|
|
204
204
|
"proof"
|
|
205
205
|
]
|
|
206
|
+
},
|
|
207
|
+
"User Certificate Issue Request": {
|
|
208
|
+
"type": "object",
|
|
209
|
+
"properties": {
|
|
210
|
+
"public_key": {
|
|
211
|
+
"type": "string",
|
|
212
|
+
"format": "byte",
|
|
213
|
+
"description": "SSH public key to sign",
|
|
214
|
+
"example": "ZWNkc2Etc2hhMi1uaXN0cDI1NiBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEF5TlRZQUFBQUlibWx6ZEhBeU5UWUFBQUJCQkdNcFNKdHRmMEl0dE5DVmMyOFR6WEZSMUQweHZPM25wNjdWemVBUXNiZFpza3JEY1lqU2x3SjZIUERtVHBYYVUwbEVhWDlMNFloYy9jQ2YxTWU5RlRrPQo="
|
|
215
|
+
},
|
|
216
|
+
"identity": {
|
|
217
|
+
"type": "string",
|
|
218
|
+
"description": "Identity Token JWT from OIDC IdP",
|
|
219
|
+
"example": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzc1NzAzMDk1fQ.ri_neAWnhMNK3LzlsrBcQYymSM4yRjmNSZZSeZiXhrEqtEz6c3cXk0Esq765umGjpUsWcosL-OFrDJlyAjTDnhrd9oV08uc_CW0rQRsJIGEuRo3ryxkLdVu9mGoZWEUb9KwjGJrwxvr-0cPWx5jaDyKwJcqMvtV_bEITUD51sDB1Vm89QfYRO_pGJo2vrRzSvMjpUenRpwPay4lYIBxl41_4YpR9Rc6VrIZuYsjV2iqEZ4eBrygMA7zPR_hN7l7s95FddLOzj5NsK57VT4uLHwYohx2oqMzw3M-B9HsZIQin_9q61pZFQXepzJth0woXiZheU27llnfHX967PhNQyg"
|
|
220
|
+
},
|
|
221
|
+
"extensions": {
|
|
222
|
+
"type": "array",
|
|
223
|
+
"items": {
|
|
224
|
+
"type": "string"
|
|
225
|
+
},
|
|
226
|
+
"default": [
|
|
227
|
+
"permit-X11-forwarding",
|
|
228
|
+
"permit-agent-forwarding",
|
|
229
|
+
"permit-port-forwarding",
|
|
230
|
+
"permit-pty",
|
|
231
|
+
"permit-user-rc"
|
|
232
|
+
],
|
|
233
|
+
"description": "Extensions to include in the issued SSH certificate"
|
|
234
|
+
},
|
|
235
|
+
"lifetime": {
|
|
236
|
+
"type": "integer",
|
|
237
|
+
"minimum": 300,
|
|
238
|
+
"maximum": 86400,
|
|
239
|
+
"default": 86400,
|
|
240
|
+
"description": "Lifetime of issued SSH certificate"
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"required": [
|
|
244
|
+
"public_key",
|
|
245
|
+
"identity"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
"Host Certificate Issue Request": {
|
|
249
|
+
"type": "object",
|
|
250
|
+
"properties": {
|
|
251
|
+
"public_key": {
|
|
252
|
+
"type": "string",
|
|
253
|
+
"format": "byte",
|
|
254
|
+
"description": "SSH public key to sign",
|
|
255
|
+
"example": "ZWNkc2Etc2hhMi1uaXN0cDI1NiBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEF5TlRZQUFBQUlibWx6ZEhBeU5UWUFBQUJCQkdNcFNKdHRmMEl0dE5DVmMyOFR6WEZSMUQweHZPM25wNjdWemVBUXNiZFpza3JEY1lqU2x3SjZIUERtVHBYYVUwbEVhWDlMNFloYy9jQ2YxTWU5RlRrPQo="
|
|
256
|
+
},
|
|
257
|
+
"identity": {
|
|
258
|
+
"type": "string",
|
|
259
|
+
"description": "Identity Token JWT from OIDC IdP",
|
|
260
|
+
"example": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzc1NzAzMDk1fQ.ri_neAWnhMNK3LzlsrBcQYymSM4yRjmNSZZSeZiXhrEqtEz6c3cXk0Esq765umGjpUsWcosL-OFrDJlyAjTDnhrd9oV08uc_CW0rQRsJIGEuRo3ryxkLdVu9mGoZWEUb9KwjGJrwxvr-0cPWx5jaDyKwJcqMvtV_bEITUD51sDB1Vm89QfYRO_pGJo2vrRzSvMjpUenRpwPay4lYIBxl41_4YpR9Rc6VrIZuYsjV2iqEZ4eBrygMA7zPR_hN7l7s95FddLOzj5NsK57VT4uLHwYohx2oqMzw3M-B9HsZIQin_9q61pZFQXepzJth0woXiZheU27llnfHX967PhNQyg"
|
|
261
|
+
},
|
|
262
|
+
"principals": {
|
|
263
|
+
"type": "array",
|
|
264
|
+
"items": {
|
|
265
|
+
"type": "string"
|
|
266
|
+
},
|
|
267
|
+
"minItems": 1,
|
|
268
|
+
"description": "List of principals to include on the issued certificate"
|
|
269
|
+
},
|
|
270
|
+
"lifetime": {
|
|
271
|
+
"type": "integer",
|
|
272
|
+
"minimum": 86400,
|
|
273
|
+
"maximum": 2592000,
|
|
274
|
+
"default": 2592000,
|
|
275
|
+
"description": "Lifetime of issued Host SSH certificate"
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"required": [
|
|
279
|
+
"public_key",
|
|
280
|
+
"identity",
|
|
281
|
+
"principals"
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
"Host Certificate Renewal Request": {
|
|
285
|
+
"type": "object",
|
|
286
|
+
"properties": {
|
|
287
|
+
"certificate": {
|
|
288
|
+
"type": "string",
|
|
289
|
+
"format": "byte",
|
|
290
|
+
"description": "SSH certificate to renew, which must have the serial number in the path"
|
|
291
|
+
},
|
|
292
|
+
"lifetime": {
|
|
293
|
+
"type": "integer",
|
|
294
|
+
"minimum": 86400,
|
|
295
|
+
"maximum": 2592000,
|
|
296
|
+
"default": 2592000,
|
|
297
|
+
"description": "Lifetime of renewed Host SSH certificate"
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"required": [
|
|
301
|
+
"certificate"
|
|
302
|
+
]
|
|
206
303
|
}
|
|
207
304
|
},
|
|
208
305
|
"parameters": {}
|
|
@@ -213,6 +310,8 @@
|
|
|
213
310
|
"tags": [
|
|
214
311
|
"CA"
|
|
215
312
|
],
|
|
313
|
+
"summary": "Get the CA public key",
|
|
314
|
+
"description": "Returns the public key of the SSH Certificate Authority in OpenSSH format, for use in `TrustedUserCAKeys` on SSH servers or `@cert-authority` entries in `known_hosts` on SSH clients.",
|
|
216
315
|
"operationId": "get_ca",
|
|
217
316
|
"responses": {
|
|
218
317
|
"200": {
|
|
@@ -273,6 +372,8 @@
|
|
|
273
372
|
"tags": [
|
|
274
373
|
"User"
|
|
275
374
|
],
|
|
375
|
+
"summary": "Request a user certificate",
|
|
376
|
+
"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.",
|
|
276
377
|
"security": [
|
|
277
378
|
{
|
|
278
379
|
"oidcAuth": []
|
|
@@ -535,6 +636,7 @@
|
|
|
535
636
|
"User"
|
|
536
637
|
],
|
|
537
638
|
"summary": "Get the Key Revocation List for user certificates",
|
|
639
|
+
"description": "Returns the OpenSSH Key Revocation List (KRL) of revoked user certificates issued by this CA, along with an SSHSIG signature made by the CA key so the KRL can be verified before use.",
|
|
538
640
|
"operationId": "get_user_krl",
|
|
539
641
|
"responses": {
|
|
540
642
|
"200": {
|
|
@@ -596,6 +698,7 @@
|
|
|
596
698
|
"User"
|
|
597
699
|
],
|
|
598
700
|
"summary": "Revoke a user certificate",
|
|
701
|
+
"description": "Revokes a user certificate issued by this CA, identified by its serial number, and adds it to the user 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.",
|
|
599
702
|
"operationId": "post_user_revoke",
|
|
600
703
|
"requestBody": {
|
|
601
704
|
"content": {
|
|
@@ -879,6 +982,8 @@
|
|
|
879
982
|
"tags": [
|
|
880
983
|
"Host"
|
|
881
984
|
],
|
|
985
|
+
"summary": "Request a host certificate",
|
|
986
|
+
"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.",
|
|
882
987
|
"security": [
|
|
883
988
|
{
|
|
884
989
|
"oidcAuth": []
|
|
@@ -1140,6 +1245,8 @@
|
|
|
1140
1245
|
"tags": [
|
|
1141
1246
|
"Host"
|
|
1142
1247
|
],
|
|
1248
|
+
"summary": "Renew a host certificate",
|
|
1249
|
+
"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.",
|
|
1143
1250
|
"operationId": "post_host_renew",
|
|
1144
1251
|
"requestBody": {
|
|
1145
1252
|
"content": {
|
|
@@ -1384,6 +1491,7 @@
|
|
|
1384
1491
|
"Host"
|
|
1385
1492
|
],
|
|
1386
1493
|
"summary": "Get the Key Revocation List for host certificates",
|
|
1494
|
+
"description": "Returns the OpenSSH Key Revocation List (KRL) of revoked host certificates issued by this CA, along with an SSHSIG signature made by the CA key so the KRL can be verified before use.",
|
|
1387
1495
|
"operationId": "get_host_krl",
|
|
1388
1496
|
"responses": {
|
|
1389
1497
|
"200": {
|
|
@@ -1445,6 +1553,7 @@
|
|
|
1445
1553
|
"Host"
|
|
1446
1554
|
],
|
|
1447
1555
|
"summary": "Revoke a host certificate",
|
|
1556
|
+
"description": "Revokes a host certificate issued by this CA, identified by its serial number, and adds it to the host 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.",
|
|
1448
1557
|
"operationId": "post_host_revoke",
|
|
1449
1558
|
"requestBody": {
|
|
1450
1559
|
"content": {
|
|
@@ -1722,6 +1831,1438 @@
|
|
|
1722
1831
|
}
|
|
1723
1832
|
}
|
|
1724
1833
|
}
|
|
1834
|
+
},
|
|
1835
|
+
"/api/v4/ca": {
|
|
1836
|
+
"get": {
|
|
1837
|
+
"tags": [
|
|
1838
|
+
"CA"
|
|
1839
|
+
],
|
|
1840
|
+
"summary": "Get the CA public key",
|
|
1841
|
+
"description": "Returns the public key of the SSH Certificate Authority in OpenSSH format, for use in `TrustedUserCAKeys` on SSH servers or `@cert-authority` entries in `known_hosts` on SSH clients.",
|
|
1842
|
+
"operationId": "get_ca_public_key",
|
|
1843
|
+
"responses": {
|
|
1844
|
+
"200": {
|
|
1845
|
+
"description": "Returns SSH Certificate Authority Public Key",
|
|
1846
|
+
"content": {
|
|
1847
|
+
"text/plain": {
|
|
1848
|
+
"schema": {
|
|
1849
|
+
"type": "string"
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
},
|
|
1854
|
+
"500": {
|
|
1855
|
+
"description": "Internal Server Error",
|
|
1856
|
+
"content": {
|
|
1857
|
+
"application/json": {
|
|
1858
|
+
"schema": {
|
|
1859
|
+
"type": "object",
|
|
1860
|
+
"properties": {
|
|
1861
|
+
"success": {
|
|
1862
|
+
"type": "boolean",
|
|
1863
|
+
"enum": [
|
|
1864
|
+
false
|
|
1865
|
+
]
|
|
1866
|
+
},
|
|
1867
|
+
"errors": {
|
|
1868
|
+
"type": "array",
|
|
1869
|
+
"items": {
|
|
1870
|
+
"type": "object",
|
|
1871
|
+
"properties": {
|
|
1872
|
+
"code": {
|
|
1873
|
+
"type": "number"
|
|
1874
|
+
},
|
|
1875
|
+
"message": {
|
|
1876
|
+
"type": "string"
|
|
1877
|
+
}
|
|
1878
|
+
},
|
|
1879
|
+
"required": [
|
|
1880
|
+
"code",
|
|
1881
|
+
"message"
|
|
1882
|
+
]
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
},
|
|
1886
|
+
"required": [
|
|
1887
|
+
"success",
|
|
1888
|
+
"errors"
|
|
1889
|
+
]
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
},
|
|
1897
|
+
"/api/v4/user/certificates": {
|
|
1898
|
+
"post": {
|
|
1899
|
+
"tags": [
|
|
1900
|
+
"User"
|
|
1901
|
+
],
|
|
1902
|
+
"operationId": "issue_user_certificate",
|
|
1903
|
+
"summary": "Request a user certificate",
|
|
1904
|
+
"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 for `public_key` in the `Proof-Of-Possession` header made for this request. Principals on the issued certificate are derived from the identity token.",
|
|
1905
|
+
"security": [
|
|
1906
|
+
{
|
|
1907
|
+
"oidcAuth": []
|
|
1908
|
+
}
|
|
1909
|
+
],
|
|
1910
|
+
"parameters": [
|
|
1911
|
+
{
|
|
1912
|
+
"schema": {
|
|
1913
|
+
"type": "string",
|
|
1914
|
+
"description": "Access Token JWT from OIDC IdP",
|
|
1915
|
+
"example": "Bearer eyJ..."
|
|
1916
|
+
},
|
|
1917
|
+
"required": true,
|
|
1918
|
+
"description": "Access Token JWT from OIDC IdP",
|
|
1919
|
+
"name": "Authorization",
|
|
1920
|
+
"in": "header"
|
|
1921
|
+
},
|
|
1922
|
+
{
|
|
1923
|
+
"schema": {
|
|
1924
|
+
"type": "string",
|
|
1925
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
1926
|
+
"example": "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0K..."
|
|
1927
|
+
},
|
|
1928
|
+
"required": true,
|
|
1929
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
1930
|
+
"name": "Proof-Of-Possession",
|
|
1931
|
+
"in": "header"
|
|
1932
|
+
}
|
|
1933
|
+
],
|
|
1934
|
+
"requestBody": {
|
|
1935
|
+
"content": {
|
|
1936
|
+
"application/json": {
|
|
1937
|
+
"schema": {
|
|
1938
|
+
"$ref": "#/components/schemas/User Certificate Issue Request"
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
},
|
|
1943
|
+
"responses": {
|
|
1944
|
+
"200": {
|
|
1945
|
+
"description": "SSH User Certificate issued successfully",
|
|
1946
|
+
"content": {
|
|
1947
|
+
"application/json": {
|
|
1948
|
+
"schema": {
|
|
1949
|
+
"$ref": "#/components/schemas/Certificate Response"
|
|
1950
|
+
}
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
},
|
|
1954
|
+
"400": {
|
|
1955
|
+
"description": "Input Validation Error",
|
|
1956
|
+
"content": {
|
|
1957
|
+
"application/json": {
|
|
1958
|
+
"schema": {
|
|
1959
|
+
"type": "object",
|
|
1960
|
+
"properties": {
|
|
1961
|
+
"success": {
|
|
1962
|
+
"type": "boolean",
|
|
1963
|
+
"enum": [
|
|
1964
|
+
false
|
|
1965
|
+
]
|
|
1966
|
+
},
|
|
1967
|
+
"errors": {
|
|
1968
|
+
"type": "array",
|
|
1969
|
+
"items": {
|
|
1970
|
+
"type": "object",
|
|
1971
|
+
"properties": {
|
|
1972
|
+
"code": {
|
|
1973
|
+
"type": "number"
|
|
1974
|
+
},
|
|
1975
|
+
"message": {
|
|
1976
|
+
"type": "string"
|
|
1977
|
+
},
|
|
1978
|
+
"path": {
|
|
1979
|
+
"type": "array",
|
|
1980
|
+
"items": {
|
|
1981
|
+
"type": "string"
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
},
|
|
1985
|
+
"required": [
|
|
1986
|
+
"code",
|
|
1987
|
+
"message",
|
|
1988
|
+
"path"
|
|
1989
|
+
]
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1992
|
+
},
|
|
1993
|
+
"required": [
|
|
1994
|
+
"success",
|
|
1995
|
+
"errors"
|
|
1996
|
+
]
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
},
|
|
2001
|
+
"401": {
|
|
2002
|
+
"description": "Unauthorized",
|
|
2003
|
+
"content": {
|
|
2004
|
+
"application/json": {
|
|
2005
|
+
"schema": {
|
|
2006
|
+
"type": "object",
|
|
2007
|
+
"properties": {
|
|
2008
|
+
"success": {
|
|
2009
|
+
"type": "boolean",
|
|
2010
|
+
"enum": [
|
|
2011
|
+
false
|
|
2012
|
+
]
|
|
2013
|
+
},
|
|
2014
|
+
"errors": {
|
|
2015
|
+
"type": "array",
|
|
2016
|
+
"items": {
|
|
2017
|
+
"type": "object",
|
|
2018
|
+
"properties": {
|
|
2019
|
+
"code": {
|
|
2020
|
+
"type": "number"
|
|
2021
|
+
},
|
|
2022
|
+
"message": {
|
|
2023
|
+
"type": "string"
|
|
2024
|
+
}
|
|
2025
|
+
},
|
|
2026
|
+
"required": [
|
|
2027
|
+
"code",
|
|
2028
|
+
"message"
|
|
2029
|
+
]
|
|
2030
|
+
}
|
|
2031
|
+
}
|
|
2032
|
+
},
|
|
2033
|
+
"required": [
|
|
2034
|
+
"success",
|
|
2035
|
+
"errors"
|
|
2036
|
+
]
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
},
|
|
2041
|
+
"403": {
|
|
2042
|
+
"description": "Forbidden",
|
|
2043
|
+
"content": {
|
|
2044
|
+
"application/json": {
|
|
2045
|
+
"schema": {
|
|
2046
|
+
"type": "object",
|
|
2047
|
+
"properties": {
|
|
2048
|
+
"success": {
|
|
2049
|
+
"type": "boolean",
|
|
2050
|
+
"enum": [
|
|
2051
|
+
false
|
|
2052
|
+
]
|
|
2053
|
+
},
|
|
2054
|
+
"errors": {
|
|
2055
|
+
"type": "array",
|
|
2056
|
+
"items": {
|
|
2057
|
+
"type": "object",
|
|
2058
|
+
"properties": {
|
|
2059
|
+
"code": {
|
|
2060
|
+
"type": "number"
|
|
2061
|
+
},
|
|
2062
|
+
"message": {
|
|
2063
|
+
"type": "string"
|
|
2064
|
+
}
|
|
2065
|
+
},
|
|
2066
|
+
"required": [
|
|
2067
|
+
"code",
|
|
2068
|
+
"message"
|
|
2069
|
+
]
|
|
2070
|
+
}
|
|
2071
|
+
}
|
|
2072
|
+
},
|
|
2073
|
+
"required": [
|
|
2074
|
+
"success",
|
|
2075
|
+
"errors"
|
|
2076
|
+
]
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
}
|
|
2080
|
+
},
|
|
2081
|
+
"422": {
|
|
2082
|
+
"description": "Unprocessable Entity",
|
|
2083
|
+
"content": {
|
|
2084
|
+
"application/json": {
|
|
2085
|
+
"schema": {
|
|
2086
|
+
"type": "object",
|
|
2087
|
+
"properties": {
|
|
2088
|
+
"success": {
|
|
2089
|
+
"type": "boolean",
|
|
2090
|
+
"enum": [
|
|
2091
|
+
false
|
|
2092
|
+
]
|
|
2093
|
+
},
|
|
2094
|
+
"errors": {
|
|
2095
|
+
"type": "array",
|
|
2096
|
+
"items": {
|
|
2097
|
+
"type": "object",
|
|
2098
|
+
"properties": {
|
|
2099
|
+
"code": {
|
|
2100
|
+
"type": "number"
|
|
2101
|
+
},
|
|
2102
|
+
"message": {
|
|
2103
|
+
"type": "string"
|
|
2104
|
+
},
|
|
2105
|
+
"path": {
|
|
2106
|
+
"type": "array",
|
|
2107
|
+
"items": {
|
|
2108
|
+
"type": "string"
|
|
2109
|
+
}
|
|
2110
|
+
}
|
|
2111
|
+
},
|
|
2112
|
+
"required": [
|
|
2113
|
+
"code",
|
|
2114
|
+
"message",
|
|
2115
|
+
"path"
|
|
2116
|
+
]
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
},
|
|
2120
|
+
"required": [
|
|
2121
|
+
"success",
|
|
2122
|
+
"errors"
|
|
2123
|
+
]
|
|
2124
|
+
}
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
},
|
|
2128
|
+
"500": {
|
|
2129
|
+
"description": "Internal Server Error",
|
|
2130
|
+
"content": {
|
|
2131
|
+
"application/json": {
|
|
2132
|
+
"schema": {
|
|
2133
|
+
"type": "object",
|
|
2134
|
+
"properties": {
|
|
2135
|
+
"success": {
|
|
2136
|
+
"type": "boolean",
|
|
2137
|
+
"enum": [
|
|
2138
|
+
false
|
|
2139
|
+
]
|
|
2140
|
+
},
|
|
2141
|
+
"errors": {
|
|
2142
|
+
"type": "array",
|
|
2143
|
+
"items": {
|
|
2144
|
+
"type": "object",
|
|
2145
|
+
"properties": {
|
|
2146
|
+
"code": {
|
|
2147
|
+
"type": "number"
|
|
2148
|
+
},
|
|
2149
|
+
"message": {
|
|
2150
|
+
"type": "string"
|
|
2151
|
+
}
|
|
2152
|
+
},
|
|
2153
|
+
"required": [
|
|
2154
|
+
"code",
|
|
2155
|
+
"message"
|
|
2156
|
+
]
|
|
2157
|
+
}
|
|
2158
|
+
}
|
|
2159
|
+
},
|
|
2160
|
+
"required": [
|
|
2161
|
+
"success",
|
|
2162
|
+
"errors"
|
|
2163
|
+
]
|
|
2164
|
+
}
|
|
2165
|
+
}
|
|
2166
|
+
}
|
|
2167
|
+
}
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
},
|
|
2171
|
+
"/api/v4/user/certificates/{serial}": {
|
|
2172
|
+
"delete": {
|
|
2173
|
+
"tags": [
|
|
2174
|
+
"User"
|
|
2175
|
+
],
|
|
2176
|
+
"operationId": "revoke_user_certificate",
|
|
2177
|
+
"summary": "Revoke a user certificate",
|
|
2178
|
+
"description": "Revokes a user certificate issued by this CA and adds it to the user Key Revocation List. The `Proof-Of-Possession` header must contain a proof of possession of the private key for the public key that the certificate was issued for, made for this request. A certificate issued for a different public key is reported as not found.",
|
|
2179
|
+
"parameters": [
|
|
2180
|
+
{
|
|
2181
|
+
"schema": {
|
|
2182
|
+
"type": "string",
|
|
2183
|
+
"pattern": "^(0|[1-9]\\d*)$",
|
|
2184
|
+
"description": "Serial number of the certificate",
|
|
2185
|
+
"example": "12345678901234567890"
|
|
2186
|
+
},
|
|
2187
|
+
"required": true,
|
|
2188
|
+
"description": "Serial number of the certificate",
|
|
2189
|
+
"name": "serial",
|
|
2190
|
+
"in": "path"
|
|
2191
|
+
},
|
|
2192
|
+
{
|
|
2193
|
+
"schema": {
|
|
2194
|
+
"type": "string",
|
|
2195
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2196
|
+
"example": "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0K..."
|
|
2197
|
+
},
|
|
2198
|
+
"required": true,
|
|
2199
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2200
|
+
"name": "Proof-Of-Possession",
|
|
2201
|
+
"in": "header"
|
|
2202
|
+
}
|
|
2203
|
+
],
|
|
2204
|
+
"responses": {
|
|
2205
|
+
"200": {
|
|
2206
|
+
"description": "SSH user certificate revoked successfully",
|
|
2207
|
+
"content": {
|
|
2208
|
+
"application/json": {
|
|
2209
|
+
"schema": {
|
|
2210
|
+
"$ref": "#/components/schemas/Revocation Response"
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2214
|
+
},
|
|
2215
|
+
"400": {
|
|
2216
|
+
"description": "Input Validation Error",
|
|
2217
|
+
"content": {
|
|
2218
|
+
"application/json": {
|
|
2219
|
+
"schema": {
|
|
2220
|
+
"type": "object",
|
|
2221
|
+
"properties": {
|
|
2222
|
+
"success": {
|
|
2223
|
+
"type": "boolean",
|
|
2224
|
+
"enum": [
|
|
2225
|
+
false
|
|
2226
|
+
]
|
|
2227
|
+
},
|
|
2228
|
+
"errors": {
|
|
2229
|
+
"type": "array",
|
|
2230
|
+
"items": {
|
|
2231
|
+
"type": "object",
|
|
2232
|
+
"properties": {
|
|
2233
|
+
"code": {
|
|
2234
|
+
"type": "number"
|
|
2235
|
+
},
|
|
2236
|
+
"message": {
|
|
2237
|
+
"type": "string"
|
|
2238
|
+
},
|
|
2239
|
+
"path": {
|
|
2240
|
+
"type": "array",
|
|
2241
|
+
"items": {
|
|
2242
|
+
"type": "string"
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
},
|
|
2246
|
+
"required": [
|
|
2247
|
+
"code",
|
|
2248
|
+
"message",
|
|
2249
|
+
"path"
|
|
2250
|
+
]
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
},
|
|
2254
|
+
"required": [
|
|
2255
|
+
"success",
|
|
2256
|
+
"errors"
|
|
2257
|
+
]
|
|
2258
|
+
}
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
},
|
|
2262
|
+
"404": {
|
|
2263
|
+
"description": "Not Found",
|
|
2264
|
+
"content": {
|
|
2265
|
+
"application/json": {
|
|
2266
|
+
"schema": {
|
|
2267
|
+
"type": "object",
|
|
2268
|
+
"properties": {
|
|
2269
|
+
"success": {
|
|
2270
|
+
"type": "boolean",
|
|
2271
|
+
"enum": [
|
|
2272
|
+
false
|
|
2273
|
+
]
|
|
2274
|
+
},
|
|
2275
|
+
"errors": {
|
|
2276
|
+
"type": "array",
|
|
2277
|
+
"items": {
|
|
2278
|
+
"type": "object",
|
|
2279
|
+
"properties": {
|
|
2280
|
+
"code": {
|
|
2281
|
+
"type": "number"
|
|
2282
|
+
},
|
|
2283
|
+
"message": {
|
|
2284
|
+
"type": "string"
|
|
2285
|
+
}
|
|
2286
|
+
},
|
|
2287
|
+
"required": [
|
|
2288
|
+
"code",
|
|
2289
|
+
"message"
|
|
2290
|
+
]
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
},
|
|
2294
|
+
"required": [
|
|
2295
|
+
"success",
|
|
2296
|
+
"errors"
|
|
2297
|
+
]
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
},
|
|
2302
|
+
"409": {
|
|
2303
|
+
"description": "Conflict",
|
|
2304
|
+
"content": {
|
|
2305
|
+
"application/json": {
|
|
2306
|
+
"schema": {
|
|
2307
|
+
"type": "object",
|
|
2308
|
+
"properties": {
|
|
2309
|
+
"success": {
|
|
2310
|
+
"type": "boolean",
|
|
2311
|
+
"enum": [
|
|
2312
|
+
false
|
|
2313
|
+
]
|
|
2314
|
+
},
|
|
2315
|
+
"errors": {
|
|
2316
|
+
"type": "array",
|
|
2317
|
+
"items": {
|
|
2318
|
+
"type": "object",
|
|
2319
|
+
"properties": {
|
|
2320
|
+
"code": {
|
|
2321
|
+
"type": "number"
|
|
2322
|
+
},
|
|
2323
|
+
"message": {
|
|
2324
|
+
"type": "string"
|
|
2325
|
+
}
|
|
2326
|
+
},
|
|
2327
|
+
"required": [
|
|
2328
|
+
"code",
|
|
2329
|
+
"message"
|
|
2330
|
+
]
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
},
|
|
2334
|
+
"required": [
|
|
2335
|
+
"success",
|
|
2336
|
+
"errors"
|
|
2337
|
+
]
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
}
|
|
2341
|
+
},
|
|
2342
|
+
"500": {
|
|
2343
|
+
"description": "Internal Server Error",
|
|
2344
|
+
"content": {
|
|
2345
|
+
"application/json": {
|
|
2346
|
+
"schema": {
|
|
2347
|
+
"type": "object",
|
|
2348
|
+
"properties": {
|
|
2349
|
+
"success": {
|
|
2350
|
+
"type": "boolean",
|
|
2351
|
+
"enum": [
|
|
2352
|
+
false
|
|
2353
|
+
]
|
|
2354
|
+
},
|
|
2355
|
+
"errors": {
|
|
2356
|
+
"type": "array",
|
|
2357
|
+
"items": {
|
|
2358
|
+
"type": "object",
|
|
2359
|
+
"properties": {
|
|
2360
|
+
"code": {
|
|
2361
|
+
"type": "number"
|
|
2362
|
+
},
|
|
2363
|
+
"message": {
|
|
2364
|
+
"type": "string"
|
|
2365
|
+
}
|
|
2366
|
+
},
|
|
2367
|
+
"required": [
|
|
2368
|
+
"code",
|
|
2369
|
+
"message"
|
|
2370
|
+
]
|
|
2371
|
+
}
|
|
2372
|
+
}
|
|
2373
|
+
},
|
|
2374
|
+
"required": [
|
|
2375
|
+
"success",
|
|
2376
|
+
"errors"
|
|
2377
|
+
]
|
|
2378
|
+
}
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2384
|
+
},
|
|
2385
|
+
"/api/v4/user/krl": {
|
|
2386
|
+
"get": {
|
|
2387
|
+
"tags": [
|
|
2388
|
+
"User"
|
|
2389
|
+
],
|
|
2390
|
+
"summary": "Get the Key Revocation List for user certificates",
|
|
2391
|
+
"description": "Returns the OpenSSH Key Revocation List (KRL) of revoked user certificates issued by this CA, along with an SSHSIG signature made by the CA key so the KRL can be verified before use.",
|
|
2392
|
+
"operationId": "get_user_revocation_list",
|
|
2393
|
+
"responses": {
|
|
2394
|
+
"200": {
|
|
2395
|
+
"description": "Returns an Open SSH Key Revocation List of revoked user certificates as BASE64 and an SSHSIG signature for verification",
|
|
2396
|
+
"content": {
|
|
2397
|
+
"application/json": {
|
|
2398
|
+
"schema": {
|
|
2399
|
+
"$ref": "#/components/schemas/Key Revocation List Response"
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
}
|
|
2403
|
+
},
|
|
2404
|
+
"500": {
|
|
2405
|
+
"description": "Internal Server Error",
|
|
2406
|
+
"content": {
|
|
2407
|
+
"application/json": {
|
|
2408
|
+
"schema": {
|
|
2409
|
+
"type": "object",
|
|
2410
|
+
"properties": {
|
|
2411
|
+
"success": {
|
|
2412
|
+
"type": "boolean",
|
|
2413
|
+
"enum": [
|
|
2414
|
+
false
|
|
2415
|
+
]
|
|
2416
|
+
},
|
|
2417
|
+
"errors": {
|
|
2418
|
+
"type": "array",
|
|
2419
|
+
"items": {
|
|
2420
|
+
"type": "object",
|
|
2421
|
+
"properties": {
|
|
2422
|
+
"code": {
|
|
2423
|
+
"type": "number"
|
|
2424
|
+
},
|
|
2425
|
+
"message": {
|
|
2426
|
+
"type": "string"
|
|
2427
|
+
}
|
|
2428
|
+
},
|
|
2429
|
+
"required": [
|
|
2430
|
+
"code",
|
|
2431
|
+
"message"
|
|
2432
|
+
]
|
|
2433
|
+
}
|
|
2434
|
+
}
|
|
2435
|
+
},
|
|
2436
|
+
"required": [
|
|
2437
|
+
"success",
|
|
2438
|
+
"errors"
|
|
2439
|
+
]
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
}
|
|
2444
|
+
}
|
|
2445
|
+
}
|
|
2446
|
+
},
|
|
2447
|
+
"/api/v4/host/certificates": {
|
|
2448
|
+
"post": {
|
|
2449
|
+
"tags": [
|
|
2450
|
+
"Host"
|
|
2451
|
+
],
|
|
2452
|
+
"operationId": "issue_host_certificate",
|
|
2453
|
+
"summary": "Request a host certificate",
|
|
2454
|
+
"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 for `public_key` in the `Proof-Of-Possession` header made for this request. The user must be permitted to request host certificates by email address or role.",
|
|
2455
|
+
"security": [
|
|
2456
|
+
{
|
|
2457
|
+
"oidcAuth": []
|
|
2458
|
+
}
|
|
2459
|
+
],
|
|
2460
|
+
"parameters": [
|
|
2461
|
+
{
|
|
2462
|
+
"schema": {
|
|
2463
|
+
"type": "string",
|
|
2464
|
+
"description": "Access Token JWT from OIDC IdP",
|
|
2465
|
+
"example": "Bearer eyJ..."
|
|
2466
|
+
},
|
|
2467
|
+
"required": true,
|
|
2468
|
+
"description": "Access Token JWT from OIDC IdP",
|
|
2469
|
+
"name": "Authorization",
|
|
2470
|
+
"in": "header"
|
|
2471
|
+
},
|
|
2472
|
+
{
|
|
2473
|
+
"schema": {
|
|
2474
|
+
"type": "string",
|
|
2475
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2476
|
+
"example": "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0K..."
|
|
2477
|
+
},
|
|
2478
|
+
"required": true,
|
|
2479
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2480
|
+
"name": "Proof-Of-Possession",
|
|
2481
|
+
"in": "header"
|
|
2482
|
+
}
|
|
2483
|
+
],
|
|
2484
|
+
"requestBody": {
|
|
2485
|
+
"content": {
|
|
2486
|
+
"application/json": {
|
|
2487
|
+
"schema": {
|
|
2488
|
+
"$ref": "#/components/schemas/Host Certificate Issue Request"
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
}
|
|
2492
|
+
},
|
|
2493
|
+
"responses": {
|
|
2494
|
+
"200": {
|
|
2495
|
+
"description": "SSH Host Certificate issued successfully",
|
|
2496
|
+
"content": {
|
|
2497
|
+
"application/json": {
|
|
2498
|
+
"schema": {
|
|
2499
|
+
"$ref": "#/components/schemas/Certificate Response"
|
|
2500
|
+
}
|
|
2501
|
+
}
|
|
2502
|
+
}
|
|
2503
|
+
},
|
|
2504
|
+
"400": {
|
|
2505
|
+
"description": "Input Validation Error",
|
|
2506
|
+
"content": {
|
|
2507
|
+
"application/json": {
|
|
2508
|
+
"schema": {
|
|
2509
|
+
"type": "object",
|
|
2510
|
+
"properties": {
|
|
2511
|
+
"success": {
|
|
2512
|
+
"type": "boolean",
|
|
2513
|
+
"enum": [
|
|
2514
|
+
false
|
|
2515
|
+
]
|
|
2516
|
+
},
|
|
2517
|
+
"errors": {
|
|
2518
|
+
"type": "array",
|
|
2519
|
+
"items": {
|
|
2520
|
+
"type": "object",
|
|
2521
|
+
"properties": {
|
|
2522
|
+
"code": {
|
|
2523
|
+
"type": "number"
|
|
2524
|
+
},
|
|
2525
|
+
"message": {
|
|
2526
|
+
"type": "string"
|
|
2527
|
+
},
|
|
2528
|
+
"path": {
|
|
2529
|
+
"type": "array",
|
|
2530
|
+
"items": {
|
|
2531
|
+
"type": "string"
|
|
2532
|
+
}
|
|
2533
|
+
}
|
|
2534
|
+
},
|
|
2535
|
+
"required": [
|
|
2536
|
+
"code",
|
|
2537
|
+
"message",
|
|
2538
|
+
"path"
|
|
2539
|
+
]
|
|
2540
|
+
}
|
|
2541
|
+
}
|
|
2542
|
+
},
|
|
2543
|
+
"required": [
|
|
2544
|
+
"success",
|
|
2545
|
+
"errors"
|
|
2546
|
+
]
|
|
2547
|
+
}
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
},
|
|
2551
|
+
"401": {
|
|
2552
|
+
"description": "Unauthorized",
|
|
2553
|
+
"content": {
|
|
2554
|
+
"application/json": {
|
|
2555
|
+
"schema": {
|
|
2556
|
+
"type": "object",
|
|
2557
|
+
"properties": {
|
|
2558
|
+
"success": {
|
|
2559
|
+
"type": "boolean",
|
|
2560
|
+
"enum": [
|
|
2561
|
+
false
|
|
2562
|
+
]
|
|
2563
|
+
},
|
|
2564
|
+
"errors": {
|
|
2565
|
+
"type": "array",
|
|
2566
|
+
"items": {
|
|
2567
|
+
"type": "object",
|
|
2568
|
+
"properties": {
|
|
2569
|
+
"code": {
|
|
2570
|
+
"type": "number"
|
|
2571
|
+
},
|
|
2572
|
+
"message": {
|
|
2573
|
+
"type": "string"
|
|
2574
|
+
}
|
|
2575
|
+
},
|
|
2576
|
+
"required": [
|
|
2577
|
+
"code",
|
|
2578
|
+
"message"
|
|
2579
|
+
]
|
|
2580
|
+
}
|
|
2581
|
+
}
|
|
2582
|
+
},
|
|
2583
|
+
"required": [
|
|
2584
|
+
"success",
|
|
2585
|
+
"errors"
|
|
2586
|
+
]
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
}
|
|
2590
|
+
},
|
|
2591
|
+
"403": {
|
|
2592
|
+
"description": "Forbidden",
|
|
2593
|
+
"content": {
|
|
2594
|
+
"application/json": {
|
|
2595
|
+
"schema": {
|
|
2596
|
+
"type": "object",
|
|
2597
|
+
"properties": {
|
|
2598
|
+
"success": {
|
|
2599
|
+
"type": "boolean",
|
|
2600
|
+
"enum": [
|
|
2601
|
+
false
|
|
2602
|
+
]
|
|
2603
|
+
},
|
|
2604
|
+
"errors": {
|
|
2605
|
+
"type": "array",
|
|
2606
|
+
"items": {
|
|
2607
|
+
"type": "object",
|
|
2608
|
+
"properties": {
|
|
2609
|
+
"code": {
|
|
2610
|
+
"type": "number"
|
|
2611
|
+
},
|
|
2612
|
+
"message": {
|
|
2613
|
+
"type": "string"
|
|
2614
|
+
}
|
|
2615
|
+
},
|
|
2616
|
+
"required": [
|
|
2617
|
+
"code",
|
|
2618
|
+
"message"
|
|
2619
|
+
]
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2622
|
+
},
|
|
2623
|
+
"required": [
|
|
2624
|
+
"success",
|
|
2625
|
+
"errors"
|
|
2626
|
+
]
|
|
2627
|
+
}
|
|
2628
|
+
}
|
|
2629
|
+
}
|
|
2630
|
+
},
|
|
2631
|
+
"422": {
|
|
2632
|
+
"description": "Unprocessable Entity",
|
|
2633
|
+
"content": {
|
|
2634
|
+
"application/json": {
|
|
2635
|
+
"schema": {
|
|
2636
|
+
"type": "object",
|
|
2637
|
+
"properties": {
|
|
2638
|
+
"success": {
|
|
2639
|
+
"type": "boolean",
|
|
2640
|
+
"enum": [
|
|
2641
|
+
false
|
|
2642
|
+
]
|
|
2643
|
+
},
|
|
2644
|
+
"errors": {
|
|
2645
|
+
"type": "array",
|
|
2646
|
+
"items": {
|
|
2647
|
+
"type": "object",
|
|
2648
|
+
"properties": {
|
|
2649
|
+
"code": {
|
|
2650
|
+
"type": "number"
|
|
2651
|
+
},
|
|
2652
|
+
"message": {
|
|
2653
|
+
"type": "string"
|
|
2654
|
+
},
|
|
2655
|
+
"path": {
|
|
2656
|
+
"type": "array",
|
|
2657
|
+
"items": {
|
|
2658
|
+
"type": "string"
|
|
2659
|
+
}
|
|
2660
|
+
}
|
|
2661
|
+
},
|
|
2662
|
+
"required": [
|
|
2663
|
+
"code",
|
|
2664
|
+
"message",
|
|
2665
|
+
"path"
|
|
2666
|
+
]
|
|
2667
|
+
}
|
|
2668
|
+
}
|
|
2669
|
+
},
|
|
2670
|
+
"required": [
|
|
2671
|
+
"success",
|
|
2672
|
+
"errors"
|
|
2673
|
+
]
|
|
2674
|
+
}
|
|
2675
|
+
}
|
|
2676
|
+
}
|
|
2677
|
+
},
|
|
2678
|
+
"500": {
|
|
2679
|
+
"description": "Internal Server Error",
|
|
2680
|
+
"content": {
|
|
2681
|
+
"application/json": {
|
|
2682
|
+
"schema": {
|
|
2683
|
+
"type": "object",
|
|
2684
|
+
"properties": {
|
|
2685
|
+
"success": {
|
|
2686
|
+
"type": "boolean",
|
|
2687
|
+
"enum": [
|
|
2688
|
+
false
|
|
2689
|
+
]
|
|
2690
|
+
},
|
|
2691
|
+
"errors": {
|
|
2692
|
+
"type": "array",
|
|
2693
|
+
"items": {
|
|
2694
|
+
"type": "object",
|
|
2695
|
+
"properties": {
|
|
2696
|
+
"code": {
|
|
2697
|
+
"type": "number"
|
|
2698
|
+
},
|
|
2699
|
+
"message": {
|
|
2700
|
+
"type": "string"
|
|
2701
|
+
}
|
|
2702
|
+
},
|
|
2703
|
+
"required": [
|
|
2704
|
+
"code",
|
|
2705
|
+
"message"
|
|
2706
|
+
]
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
},
|
|
2710
|
+
"required": [
|
|
2711
|
+
"success",
|
|
2712
|
+
"errors"
|
|
2713
|
+
]
|
|
2714
|
+
}
|
|
2715
|
+
}
|
|
2716
|
+
}
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
},
|
|
2721
|
+
"/api/v4/host/certificates/{serial}/renew": {
|
|
2722
|
+
"post": {
|
|
2723
|
+
"tags": [
|
|
2724
|
+
"Host"
|
|
2725
|
+
],
|
|
2726
|
+
"operationId": "renew_host_certificate",
|
|
2727
|
+
"summary": "Renew a host certificate",
|
|
2728
|
+
"description": "Issues a new SSH host certificate for the same public key and principals as an existing, unexpired and unrevoked host certificate issued by this CA. No OIDC authentication is required; instead the `Proof-Of-Possession` header must contain a proof of possession of the private key for the existing certificate made for this request. The lifetime of the renewed certificate is no longer than that of the existing certificate.",
|
|
2729
|
+
"parameters": [
|
|
2730
|
+
{
|
|
2731
|
+
"schema": {
|
|
2732
|
+
"type": "string",
|
|
2733
|
+
"pattern": "^(0|[1-9]\\d*)$",
|
|
2734
|
+
"description": "Serial number of the certificate",
|
|
2735
|
+
"example": "12345678901234567890"
|
|
2736
|
+
},
|
|
2737
|
+
"required": true,
|
|
2738
|
+
"description": "Serial number of the certificate",
|
|
2739
|
+
"name": "serial",
|
|
2740
|
+
"in": "path"
|
|
2741
|
+
},
|
|
2742
|
+
{
|
|
2743
|
+
"schema": {
|
|
2744
|
+
"type": "string",
|
|
2745
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2746
|
+
"example": "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0K..."
|
|
2747
|
+
},
|
|
2748
|
+
"required": true,
|
|
2749
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
2750
|
+
"name": "Proof-Of-Possession",
|
|
2751
|
+
"in": "header"
|
|
2752
|
+
}
|
|
2753
|
+
],
|
|
2754
|
+
"requestBody": {
|
|
2755
|
+
"content": {
|
|
2756
|
+
"application/json": {
|
|
2757
|
+
"schema": {
|
|
2758
|
+
"$ref": "#/components/schemas/Host Certificate Renewal Request"
|
|
2759
|
+
}
|
|
2760
|
+
}
|
|
2761
|
+
}
|
|
2762
|
+
},
|
|
2763
|
+
"responses": {
|
|
2764
|
+
"200": {
|
|
2765
|
+
"description": "SSH Host Certificate renewed successfully",
|
|
2766
|
+
"content": {
|
|
2767
|
+
"application/json": {
|
|
2768
|
+
"schema": {
|
|
2769
|
+
"$ref": "#/components/schemas/Certificate Response"
|
|
2770
|
+
}
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
},
|
|
2774
|
+
"400": {
|
|
2775
|
+
"description": "Input Validation Error",
|
|
2776
|
+
"content": {
|
|
2777
|
+
"application/json": {
|
|
2778
|
+
"schema": {
|
|
2779
|
+
"type": "object",
|
|
2780
|
+
"properties": {
|
|
2781
|
+
"success": {
|
|
2782
|
+
"type": "boolean",
|
|
2783
|
+
"enum": [
|
|
2784
|
+
false
|
|
2785
|
+
]
|
|
2786
|
+
},
|
|
2787
|
+
"errors": {
|
|
2788
|
+
"type": "array",
|
|
2789
|
+
"items": {
|
|
2790
|
+
"type": "object",
|
|
2791
|
+
"properties": {
|
|
2792
|
+
"code": {
|
|
2793
|
+
"type": "number"
|
|
2794
|
+
},
|
|
2795
|
+
"message": {
|
|
2796
|
+
"type": "string"
|
|
2797
|
+
},
|
|
2798
|
+
"path": {
|
|
2799
|
+
"type": "array",
|
|
2800
|
+
"items": {
|
|
2801
|
+
"type": "string"
|
|
2802
|
+
}
|
|
2803
|
+
}
|
|
2804
|
+
},
|
|
2805
|
+
"required": [
|
|
2806
|
+
"code",
|
|
2807
|
+
"message",
|
|
2808
|
+
"path"
|
|
2809
|
+
]
|
|
2810
|
+
}
|
|
2811
|
+
}
|
|
2812
|
+
},
|
|
2813
|
+
"required": [
|
|
2814
|
+
"success",
|
|
2815
|
+
"errors"
|
|
2816
|
+
]
|
|
2817
|
+
}
|
|
2818
|
+
}
|
|
2819
|
+
}
|
|
2820
|
+
},
|
|
2821
|
+
"401": {
|
|
2822
|
+
"description": "Unauthorized",
|
|
2823
|
+
"content": {
|
|
2824
|
+
"application/json": {
|
|
2825
|
+
"schema": {
|
|
2826
|
+
"type": "object",
|
|
2827
|
+
"properties": {
|
|
2828
|
+
"success": {
|
|
2829
|
+
"type": "boolean",
|
|
2830
|
+
"enum": [
|
|
2831
|
+
false
|
|
2832
|
+
]
|
|
2833
|
+
},
|
|
2834
|
+
"errors": {
|
|
2835
|
+
"type": "array",
|
|
2836
|
+
"items": {
|
|
2837
|
+
"type": "object",
|
|
2838
|
+
"properties": {
|
|
2839
|
+
"code": {
|
|
2840
|
+
"type": "number"
|
|
2841
|
+
},
|
|
2842
|
+
"message": {
|
|
2843
|
+
"type": "string"
|
|
2844
|
+
}
|
|
2845
|
+
},
|
|
2846
|
+
"required": [
|
|
2847
|
+
"code",
|
|
2848
|
+
"message"
|
|
2849
|
+
]
|
|
2850
|
+
}
|
|
2851
|
+
}
|
|
2852
|
+
},
|
|
2853
|
+
"required": [
|
|
2854
|
+
"success",
|
|
2855
|
+
"errors"
|
|
2856
|
+
]
|
|
2857
|
+
}
|
|
2858
|
+
}
|
|
2859
|
+
}
|
|
2860
|
+
},
|
|
2861
|
+
"403": {
|
|
2862
|
+
"description": "Forbidden",
|
|
2863
|
+
"content": {
|
|
2864
|
+
"application/json": {
|
|
2865
|
+
"schema": {
|
|
2866
|
+
"type": "object",
|
|
2867
|
+
"properties": {
|
|
2868
|
+
"success": {
|
|
2869
|
+
"type": "boolean",
|
|
2870
|
+
"enum": [
|
|
2871
|
+
false
|
|
2872
|
+
]
|
|
2873
|
+
},
|
|
2874
|
+
"errors": {
|
|
2875
|
+
"type": "array",
|
|
2876
|
+
"items": {
|
|
2877
|
+
"type": "object",
|
|
2878
|
+
"properties": {
|
|
2879
|
+
"code": {
|
|
2880
|
+
"type": "number"
|
|
2881
|
+
},
|
|
2882
|
+
"message": {
|
|
2883
|
+
"type": "string"
|
|
2884
|
+
}
|
|
2885
|
+
},
|
|
2886
|
+
"required": [
|
|
2887
|
+
"code",
|
|
2888
|
+
"message"
|
|
2889
|
+
]
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
},
|
|
2893
|
+
"required": [
|
|
2894
|
+
"success",
|
|
2895
|
+
"errors"
|
|
2896
|
+
]
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
}
|
|
2900
|
+
},
|
|
2901
|
+
"422": {
|
|
2902
|
+
"description": "Unprocessable Entity",
|
|
2903
|
+
"content": {
|
|
2904
|
+
"application/json": {
|
|
2905
|
+
"schema": {
|
|
2906
|
+
"type": "object",
|
|
2907
|
+
"properties": {
|
|
2908
|
+
"success": {
|
|
2909
|
+
"type": "boolean",
|
|
2910
|
+
"enum": [
|
|
2911
|
+
false
|
|
2912
|
+
]
|
|
2913
|
+
},
|
|
2914
|
+
"errors": {
|
|
2915
|
+
"type": "array",
|
|
2916
|
+
"items": {
|
|
2917
|
+
"type": "object",
|
|
2918
|
+
"properties": {
|
|
2919
|
+
"code": {
|
|
2920
|
+
"type": "number"
|
|
2921
|
+
},
|
|
2922
|
+
"message": {
|
|
2923
|
+
"type": "string"
|
|
2924
|
+
},
|
|
2925
|
+
"path": {
|
|
2926
|
+
"type": "array",
|
|
2927
|
+
"items": {
|
|
2928
|
+
"type": "string"
|
|
2929
|
+
}
|
|
2930
|
+
}
|
|
2931
|
+
},
|
|
2932
|
+
"required": [
|
|
2933
|
+
"code",
|
|
2934
|
+
"message",
|
|
2935
|
+
"path"
|
|
2936
|
+
]
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2939
|
+
},
|
|
2940
|
+
"required": [
|
|
2941
|
+
"success",
|
|
2942
|
+
"errors"
|
|
2943
|
+
]
|
|
2944
|
+
}
|
|
2945
|
+
}
|
|
2946
|
+
}
|
|
2947
|
+
},
|
|
2948
|
+
"500": {
|
|
2949
|
+
"description": "Internal Server Error",
|
|
2950
|
+
"content": {
|
|
2951
|
+
"application/json": {
|
|
2952
|
+
"schema": {
|
|
2953
|
+
"type": "object",
|
|
2954
|
+
"properties": {
|
|
2955
|
+
"success": {
|
|
2956
|
+
"type": "boolean",
|
|
2957
|
+
"enum": [
|
|
2958
|
+
false
|
|
2959
|
+
]
|
|
2960
|
+
},
|
|
2961
|
+
"errors": {
|
|
2962
|
+
"type": "array",
|
|
2963
|
+
"items": {
|
|
2964
|
+
"type": "object",
|
|
2965
|
+
"properties": {
|
|
2966
|
+
"code": {
|
|
2967
|
+
"type": "number"
|
|
2968
|
+
},
|
|
2969
|
+
"message": {
|
|
2970
|
+
"type": "string"
|
|
2971
|
+
}
|
|
2972
|
+
},
|
|
2973
|
+
"required": [
|
|
2974
|
+
"code",
|
|
2975
|
+
"message"
|
|
2976
|
+
]
|
|
2977
|
+
}
|
|
2978
|
+
}
|
|
2979
|
+
},
|
|
2980
|
+
"required": [
|
|
2981
|
+
"success",
|
|
2982
|
+
"errors"
|
|
2983
|
+
]
|
|
2984
|
+
}
|
|
2985
|
+
}
|
|
2986
|
+
}
|
|
2987
|
+
}
|
|
2988
|
+
}
|
|
2989
|
+
}
|
|
2990
|
+
},
|
|
2991
|
+
"/api/v4/host/certificates/{serial}": {
|
|
2992
|
+
"delete": {
|
|
2993
|
+
"tags": [
|
|
2994
|
+
"Host"
|
|
2995
|
+
],
|
|
2996
|
+
"operationId": "revoke_host_certificate",
|
|
2997
|
+
"summary": "Revoke a host certificate",
|
|
2998
|
+
"description": "Revokes a host certificate issued by this CA and adds it to the host Key Revocation List. The `Proof-Of-Possession` header must contain a proof of possession of the private key for the public key that the certificate was issued for, made for this request. A certificate issued for a different public key is reported as not found.",
|
|
2999
|
+
"parameters": [
|
|
3000
|
+
{
|
|
3001
|
+
"schema": {
|
|
3002
|
+
"type": "string",
|
|
3003
|
+
"pattern": "^(0|[1-9]\\d*)$",
|
|
3004
|
+
"description": "Serial number of the certificate",
|
|
3005
|
+
"example": "12345678901234567890"
|
|
3006
|
+
},
|
|
3007
|
+
"required": true,
|
|
3008
|
+
"description": "Serial number of the certificate",
|
|
3009
|
+
"name": "serial",
|
|
3010
|
+
"in": "path"
|
|
3011
|
+
},
|
|
3012
|
+
{
|
|
3013
|
+
"schema": {
|
|
3014
|
+
"type": "string",
|
|
3015
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
3016
|
+
"example": "1765696780805.SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs.LS0tLS1CRUdJTiBTU0ggU0lHTkFUVVJFLS0tLS0K..."
|
|
3017
|
+
},
|
|
3018
|
+
"required": true,
|
|
3019
|
+
"description": "Proof of possession of the private key comprising of `${timestamp}.${fingerprint}.${signature}`. The signature is a BASE64 encoded armored SSHSIG signature, made with the `request-proof-of-possession@com.github.serverless-ssh-ca.andrewheberle` namespace, of `${timestamp}.${fingerprint}.${METHOD} ${path}` where `${METHOD} ${path}` is the request the proof is for, for example `DELETE /api/v4/user/certificates/12345678901234567890`. The timestamp is in milliseconds since the Unix epoch.",
|
|
3020
|
+
"name": "Proof-Of-Possession",
|
|
3021
|
+
"in": "header"
|
|
3022
|
+
}
|
|
3023
|
+
],
|
|
3024
|
+
"responses": {
|
|
3025
|
+
"200": {
|
|
3026
|
+
"description": "SSH host certificate revoked successfully",
|
|
3027
|
+
"content": {
|
|
3028
|
+
"application/json": {
|
|
3029
|
+
"schema": {
|
|
3030
|
+
"$ref": "#/components/schemas/Revocation Response"
|
|
3031
|
+
}
|
|
3032
|
+
}
|
|
3033
|
+
}
|
|
3034
|
+
},
|
|
3035
|
+
"400": {
|
|
3036
|
+
"description": "Input Validation Error",
|
|
3037
|
+
"content": {
|
|
3038
|
+
"application/json": {
|
|
3039
|
+
"schema": {
|
|
3040
|
+
"type": "object",
|
|
3041
|
+
"properties": {
|
|
3042
|
+
"success": {
|
|
3043
|
+
"type": "boolean",
|
|
3044
|
+
"enum": [
|
|
3045
|
+
false
|
|
3046
|
+
]
|
|
3047
|
+
},
|
|
3048
|
+
"errors": {
|
|
3049
|
+
"type": "array",
|
|
3050
|
+
"items": {
|
|
3051
|
+
"type": "object",
|
|
3052
|
+
"properties": {
|
|
3053
|
+
"code": {
|
|
3054
|
+
"type": "number"
|
|
3055
|
+
},
|
|
3056
|
+
"message": {
|
|
3057
|
+
"type": "string"
|
|
3058
|
+
},
|
|
3059
|
+
"path": {
|
|
3060
|
+
"type": "array",
|
|
3061
|
+
"items": {
|
|
3062
|
+
"type": "string"
|
|
3063
|
+
}
|
|
3064
|
+
}
|
|
3065
|
+
},
|
|
3066
|
+
"required": [
|
|
3067
|
+
"code",
|
|
3068
|
+
"message",
|
|
3069
|
+
"path"
|
|
3070
|
+
]
|
|
3071
|
+
}
|
|
3072
|
+
}
|
|
3073
|
+
},
|
|
3074
|
+
"required": [
|
|
3075
|
+
"success",
|
|
3076
|
+
"errors"
|
|
3077
|
+
]
|
|
3078
|
+
}
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
},
|
|
3082
|
+
"404": {
|
|
3083
|
+
"description": "Not Found",
|
|
3084
|
+
"content": {
|
|
3085
|
+
"application/json": {
|
|
3086
|
+
"schema": {
|
|
3087
|
+
"type": "object",
|
|
3088
|
+
"properties": {
|
|
3089
|
+
"success": {
|
|
3090
|
+
"type": "boolean",
|
|
3091
|
+
"enum": [
|
|
3092
|
+
false
|
|
3093
|
+
]
|
|
3094
|
+
},
|
|
3095
|
+
"errors": {
|
|
3096
|
+
"type": "array",
|
|
3097
|
+
"items": {
|
|
3098
|
+
"type": "object",
|
|
3099
|
+
"properties": {
|
|
3100
|
+
"code": {
|
|
3101
|
+
"type": "number"
|
|
3102
|
+
},
|
|
3103
|
+
"message": {
|
|
3104
|
+
"type": "string"
|
|
3105
|
+
}
|
|
3106
|
+
},
|
|
3107
|
+
"required": [
|
|
3108
|
+
"code",
|
|
3109
|
+
"message"
|
|
3110
|
+
]
|
|
3111
|
+
}
|
|
3112
|
+
}
|
|
3113
|
+
},
|
|
3114
|
+
"required": [
|
|
3115
|
+
"success",
|
|
3116
|
+
"errors"
|
|
3117
|
+
]
|
|
3118
|
+
}
|
|
3119
|
+
}
|
|
3120
|
+
}
|
|
3121
|
+
},
|
|
3122
|
+
"409": {
|
|
3123
|
+
"description": "Conflict",
|
|
3124
|
+
"content": {
|
|
3125
|
+
"application/json": {
|
|
3126
|
+
"schema": {
|
|
3127
|
+
"type": "object",
|
|
3128
|
+
"properties": {
|
|
3129
|
+
"success": {
|
|
3130
|
+
"type": "boolean",
|
|
3131
|
+
"enum": [
|
|
3132
|
+
false
|
|
3133
|
+
]
|
|
3134
|
+
},
|
|
3135
|
+
"errors": {
|
|
3136
|
+
"type": "array",
|
|
3137
|
+
"items": {
|
|
3138
|
+
"type": "object",
|
|
3139
|
+
"properties": {
|
|
3140
|
+
"code": {
|
|
3141
|
+
"type": "number"
|
|
3142
|
+
},
|
|
3143
|
+
"message": {
|
|
3144
|
+
"type": "string"
|
|
3145
|
+
}
|
|
3146
|
+
},
|
|
3147
|
+
"required": [
|
|
3148
|
+
"code",
|
|
3149
|
+
"message"
|
|
3150
|
+
]
|
|
3151
|
+
}
|
|
3152
|
+
}
|
|
3153
|
+
},
|
|
3154
|
+
"required": [
|
|
3155
|
+
"success",
|
|
3156
|
+
"errors"
|
|
3157
|
+
]
|
|
3158
|
+
}
|
|
3159
|
+
}
|
|
3160
|
+
}
|
|
3161
|
+
},
|
|
3162
|
+
"500": {
|
|
3163
|
+
"description": "Internal Server Error",
|
|
3164
|
+
"content": {
|
|
3165
|
+
"application/json": {
|
|
3166
|
+
"schema": {
|
|
3167
|
+
"type": "object",
|
|
3168
|
+
"properties": {
|
|
3169
|
+
"success": {
|
|
3170
|
+
"type": "boolean",
|
|
3171
|
+
"enum": [
|
|
3172
|
+
false
|
|
3173
|
+
]
|
|
3174
|
+
},
|
|
3175
|
+
"errors": {
|
|
3176
|
+
"type": "array",
|
|
3177
|
+
"items": {
|
|
3178
|
+
"type": "object",
|
|
3179
|
+
"properties": {
|
|
3180
|
+
"code": {
|
|
3181
|
+
"type": "number"
|
|
3182
|
+
},
|
|
3183
|
+
"message": {
|
|
3184
|
+
"type": "string"
|
|
3185
|
+
}
|
|
3186
|
+
},
|
|
3187
|
+
"required": [
|
|
3188
|
+
"code",
|
|
3189
|
+
"message"
|
|
3190
|
+
]
|
|
3191
|
+
}
|
|
3192
|
+
}
|
|
3193
|
+
},
|
|
3194
|
+
"required": [
|
|
3195
|
+
"success",
|
|
3196
|
+
"errors"
|
|
3197
|
+
]
|
|
3198
|
+
}
|
|
3199
|
+
}
|
|
3200
|
+
}
|
|
3201
|
+
}
|
|
3202
|
+
}
|
|
3203
|
+
}
|
|
3204
|
+
},
|
|
3205
|
+
"/api/v4/host/krl": {
|
|
3206
|
+
"get": {
|
|
3207
|
+
"tags": [
|
|
3208
|
+
"Host"
|
|
3209
|
+
],
|
|
3210
|
+
"summary": "Get the Key Revocation List for host certificates",
|
|
3211
|
+
"description": "Returns the OpenSSH Key Revocation List (KRL) of revoked host certificates issued by this CA, along with an SSHSIG signature made by the CA key so the KRL can be verified before use.",
|
|
3212
|
+
"operationId": "get_host_revocation_list",
|
|
3213
|
+
"responses": {
|
|
3214
|
+
"200": {
|
|
3215
|
+
"description": "Returns an Open SSH Key Revocation List of revoked host certificates as BASE64 and an SSHSIG signature for verification",
|
|
3216
|
+
"content": {
|
|
3217
|
+
"application/json": {
|
|
3218
|
+
"schema": {
|
|
3219
|
+
"$ref": "#/components/schemas/Key Revocation List Response"
|
|
3220
|
+
}
|
|
3221
|
+
}
|
|
3222
|
+
}
|
|
3223
|
+
},
|
|
3224
|
+
"500": {
|
|
3225
|
+
"description": "Internal Server Error",
|
|
3226
|
+
"content": {
|
|
3227
|
+
"application/json": {
|
|
3228
|
+
"schema": {
|
|
3229
|
+
"type": "object",
|
|
3230
|
+
"properties": {
|
|
3231
|
+
"success": {
|
|
3232
|
+
"type": "boolean",
|
|
3233
|
+
"enum": [
|
|
3234
|
+
false
|
|
3235
|
+
]
|
|
3236
|
+
},
|
|
3237
|
+
"errors": {
|
|
3238
|
+
"type": "array",
|
|
3239
|
+
"items": {
|
|
3240
|
+
"type": "object",
|
|
3241
|
+
"properties": {
|
|
3242
|
+
"code": {
|
|
3243
|
+
"type": "number"
|
|
3244
|
+
},
|
|
3245
|
+
"message": {
|
|
3246
|
+
"type": "string"
|
|
3247
|
+
}
|
|
3248
|
+
},
|
|
3249
|
+
"required": [
|
|
3250
|
+
"code",
|
|
3251
|
+
"message"
|
|
3252
|
+
]
|
|
3253
|
+
}
|
|
3254
|
+
}
|
|
3255
|
+
},
|
|
3256
|
+
"required": [
|
|
3257
|
+
"success",
|
|
3258
|
+
"errors"
|
|
3259
|
+
]
|
|
3260
|
+
}
|
|
3261
|
+
}
|
|
3262
|
+
}
|
|
3263
|
+
}
|
|
3264
|
+
}
|
|
3265
|
+
}
|
|
1725
3266
|
}
|
|
1726
3267
|
},
|
|
1727
3268
|
"webhooks": {}
|