Set the project's SSH CA validity / rotation policy.
curl --request PUT \ --url https://stratum.example.com/v1/projects/example/ssh-ca/config \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "userCertDefaultValiditySeconds": 900, "userCertMaxValiditySeconds": 3600, "hostCertMaxValiditySeconds": 31536000, "rotationGraceWindowSeconds": 86400 }'Sets the project’s SSH CA validity ceilings +
rotation grace window, lazily creating the CA if needed. Omitted
fields keep their current value. The sign-rate quota is NOT settable
here — it is an operator-only field (PATCH…/ssh-ca/quota,).
Backs the stratum_ssh_ca Terraform resource create/update. Gates on
the ssh-ca:UpdateConfig Cedar action (project-editor+).
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”body for PUT /v1/projects/{projectId}/ssh-ca/config. Every field is optional; an omitted field keeps its current value.
object
Default user-cert validity (seconds); must be <= the max.
Example
900Maximum user-cert validity ceiling (seconds).
Example
3600Maximum host-cert validity ceiling (seconds).
Example
31536000How long a rotated-out CA generation stays trusted (seconds).
Example
86400Responses
Section titled “Responses”The updated SSH CA configuration.
The project’s SSH CA as a single managed resource (the
stratum_ssh_ca Terraform resource). Combines the computed CA public
keys + generations with the configurable validity / rotation policy
and the (operator-managed) effective sign-rate quota.
object
Stable resource id (equals projectId — one SSH CA per project).
The active user CA public key (OpenSSH authorized-key form).
The active host CA public key (OpenSSH authorized-key form).
Example
{ "userCaGeneration": 1, "hostCaGeneration": 1, "userCertDefaultValiditySeconds": 900, "userCertMaxValiditySeconds": 3600, "hostCertMaxValiditySeconds": 31536000, "rotationGraceWindowSeconds": 86400, "signRatePerMinute": 100}Bad request.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}Authenticated but not authorized.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}