Loading…
Loading…
Describes how the platform verifies entitlement using signed JWT licenses, fetches public keys from a JWKS endpoint, and handles periodic re-verification.
This document describes the v1.0 license model, which governs product entitlement. In this model, entitlement is derived cryptographically from a signed license token, never from local configuration flags or environment variables alone. The product verifies the license and reads its capabilities and expiration date directly from the token's claims.
This platform-integrated model provides centralized control over licensing and allows for dynamic updates, such as key rotation, without requiring a new product release. It supersedes an earlier, fully offline model that relied on static license keys bundled into the product binary.
The core function of the license verification system is to confirm entitlement before enabling certain features, such as licensed write operations. It fails closed by design, meaning entitlement is never granted if verification fails for any reason.
The licensing process involves three main components: the license token itself, the management of public keys used for verification, and a lifecycle of periodic re-verification.
The license is a JSON Web Token (JWT) signed with the RS256 algorithm. The product cryptographically verifies this signature to ensure the token has not been tampered with and was issued by the legitimate licensing authority.
The token contains several claims that define the terms of the entitlement:
| Claim | Description |
|---|---|
| Expiry | A timestamp after which the license is no longer valid. |
| Installation Binding | Binds the license to a specific product installation, preventing it from being used on another installation. |
max_discovered_services | A capacity cap defining the maximum number of services the installation is permitted to discover. |
max_converted_services | A capacity cap defining the maximum number of services the installation is permitted to convert. |
| License Format Version | A version identifier for the license structure. The product only accepts the current format version and rejects all others. |
To verify the license's signature, the product requires the licensing platform's public keys. These keys are not bundled permanently into the product. Instead, they are fetched from a JSON Web Key Set (JWKS) endpoint provided by the licensing platform.
This dynamic approach allows signing keys to be rotated by the platform operator without requiring a product update.
The key retrieval and verification flow is as follows:
flowchart TD
subgraph Product Instance
A[License Verification]
B[Local Key Cache]
end
C[Licensing Platform JWKS Endpoint]
A -- 1. Receives license to verify --> A
A -- 2. Check cache for key with matching 'kid' --> B
B -- 3a. Key found --> A
A -- 4. Verify signature with cached key --> A
B -- 3b. Key not found --> D{Refetch Keys}
D -- 5. Request key set over HTTPS --> C
C -- 6. Return JWKS --> D
D -- 7. Update local cache --> B
D -- 8. Provide new key --> Akid) in the JWT header.NOTE
A single verification key is bundled into the product binary, but it serves only as a bootstrap seed for the very first start before the product has ever contacted the licensing platform. It is not used for long-term verification.
License verification is not a one-time event. The product performs checks throughout its operational lifecycle to ensure entitlement remains valid.
If the licensing platform is unreachable when a periodic re-verification is due, the product does not fail immediately. Instead, it enters an offline grace period. For more details, see the documentation on Offline Grace.
Separate from the license token, certain integrations with the licensing platform are authenticated using a product API key. These keys follow a strict scoping rule: one key per (customer, product, environment) triple.
If a license fails verification, the product fails closed for entitlement. This means that after any applicable offline grace period, all licensed write operations are disabled. The product will never "assume licensed" status if a key is missing or a signature is invalid; it will always surface an error.
Verification can fail for several reasons:
For specific error codes related to licensing failures, see the documentation on Offline Grace.
| Element | v1.0 Design |
|---|---|
| Entitlement Source | Signed RS256 license (JWT) is the source of truth. Local configuration is not used for entitlement. |
| Signature Keys | Fetched from the licensing platform's JWKS endpoint, cached, and refetched on an unknown key ID (kid). |
| Re-verification | Occurs on every cold start and periodically (approximately daily) during runtime. |
| Format Version | The verifier accepts only the current license format version and rejects all others. |
| Install Binding | The license is bound to a specific installation and cannot be replayed elsewhere. |
| API Keys | One key is used per (customer, product, environment) triple. Cross-environment reuse is forbidden. |
| On Failure | The product fails closed for entitlement after any applicable offline grace period. It never assumes a licensed state on failure. |
max_discovered_services and max_converted_services are measured.