Well Known — Versola Docs
VersolaVersola/docs
Pre-1.00.7.1versola.kzGitHub

Well Known

Reference for the Well Known screen of the admin console — the JWKS that Versola publishes, how to generate, add and delete signing keys, and the server metadata document

The Well Known screen manages the public configuration that Versola serves to the outside: the JSON Web Key Set (JWKS) that lets clients and APIs verify your tokens, and the server metadata document. You use it to generate a signing key, publish a key you hold elsewhere, or retire an old one. A key only signs tokens for a tenant after you select it under Token Signing Key on Challenges & Security.

Before you start

NeedPermission
See the keys and the metadatajwks:read
Generate, add, edit or delete keys, edit the metadatajwks:manage

The screen is global, not scoped to the tenant selector. Without jwks:manage the + Add Key, Generate Key, ✎ and ✕ controls are not shown.

Well Known: JWKS and Server Metadata
Well Known page: the JWKS list with a verify-only PS256 key, a verify-only ES256 key and an ES256 key marked Can sign, the algorithm selector with Generate Key, and the Server Metadata JSON below.

JWKS

Each key is a card with its kid, its type and algorithm (for example EC · ES256), a badge and the JWK as published. The badge tells you what Versola can do with the key:

BadgeMeaning
Can signCentral holds the private half and the key has a known alg. A tenant can select it as its Token Signing Key.
Verify onlyCentral holds only the public JWK. The key is published so verifiers accept it, but nothing signs with it.

A deployment that is seeded from bootstrap.jwks starts with verify-only keys, because Central never receives their private halves. Generate a key to get one that can sign.

Algorithms

The selector next to Generate Key offers three algorithms:

AlgorithmKey generatedNotes
PS256RSA-2048The default choice when a new tenant has no key selected.
ES256EC, curve P-256Also acceptable under FAPI 2.0.
RS256RSA-2048Can be generated on any tenant but selected for signing only on a tenant with the Standard security profile. Central refuses it on a FAPI 2.0 tenant.

PS256 and ES256 are both allowed on either profile. HS256 is not offered: a shared secret has nothing to publish in a JWKS. The kid of a generated key is a timestamp plus the algorithm, for example 2026-10-14_07-29-17-es256.

Generate Key

Generate Key creates a key pair for the selected algorithm, publishes the public half at once and stores the private half in Central, encrypted at rest. The private key is not shown and cannot be downloaded.

The note under the buttons states the consequence: a generated key is published for verification immediately but signs nothing until a tenant selects it under Challenges & Security, so every verifier learns the key before anything issues tokens under it.

+ Add Key

+ Add Key opens Add JWK, a JWK JSON field where you paste a public JWK. Use it to publish a key whose private half you keep elsewhere. The console requires kid and kty; Central requires a kid and answers JWK must contain a 'kid' field or Invalid JWK JSON otherwise. A key added this way is always Verify only.

Add JWK
Add JWK form under the algorithm selector, with a JWK JSON text area and the Add Key and Cancel buttons.

Edit and delete

The ✎ icon opens the JWK of an existing key for editing; the kid cannot be changed (delete the key and add a new one instead). The ✕ icon asks for confirmation in a Delete JWK dialog and then removes the key from the JWKS.

Central refuses to delete a key that a tenant still signs with, with Key '<kid>' is the signing key of <tenants>. Select another key for them before deleting it. Move those tenants to another key first. Once a key is deleted, it is no longer published, so nothing can verify tokens that were signed with it.

Where the keys are used

ConsumerUses
auth, signingFor each tenant, the key selected as Token Signing Key signs access tokens, ID tokens and logout tokens. The algorithm comes from the key. A tenant with no selection signs with the private key in the jwt.private-key configuration of auth.
auth, publishingGET /.well-known/jwks.json returns the public halves of all keys, with Cache-Control: public, max-age=86400. It needs no authentication. Resource servers should refetch on an unknown kid instead of waiting for the cache to expire.
edgeVerifies tokens with the public halves it syncs from Central. It never receives a private key.
CentralVerifies the tokens of the admin console with the same keys.

The format of the set is RFC 7517. The Central endpoints behind this screen (/configuration/jwks) are described in the OpenAPI reference.

Rotating a signing key

The screen supports a rotation in three steps:

  1. Generate Key for the algorithm you want. The new key is published and nobody signs with it yet.
  2. Open Challenges & Security for each tenant and select the new key under Token Signing Key. auth switches to it after it has synced the key; until then it keeps signing with the previous key.
  3. Delete the old key when no token you still need to verify is signed with it. Wait at least as long as the longest-lived token signed with it and as long as verifiers cache the JWKS (24 hours for responses of auth).

Versola does not rotate keys on a schedule and does not retire them for you.

Server Metadata

Below the keys, Server Metadata shows the authorization server metadata document as JSON. ✎ opens it for editing. The console requires issuer, authorization_endpoint, token_endpoint, jwks_uri and response_types_supported and refuses to save without them. auth serves the document at /.well-known/openid-configuration and /.well-known/oauth-authorization-server. The authorization_details_types_supported member is kept in step with the types you register on Challenges & Security. See RFC 8414.

Next steps