Loading…
Loading…
Describes how the platform verifies entitlements using signed JWT licenses, fetches public keys from a JWKS endpoint, and handles periodic re-verification.
{/* AUTO-GENERATED from the docs pipeline — do not edit by hand /} {/ source doc_id: prd-s2r-docs-public-knowledgebase-licensing-license-model · version: 1.7.7 */}
Product entitlement is determined by a cryptographically signed license, not by local configuration flags or environment variables. The product verifies the license and reads capability limits and expiry dates directly from it. This model provides a dynamic and secure method for managing entitlements.
The license is a JSON Web Token (JWT) signed with the RS256 algorithm. It serves as the single source of truth for:
max_discovered_services and max_converted_services.This platform-integrated model supersedes an earlier approach that relied on static license files bundled into the product binary.
NOTE
The v1.0 license model replaces a predecessor that used static license keys bundled into the product binary, which required a new release to rotate keys. This new model allows for dynamic key rotation and platform integration.
The license verification process involves fetching public keys from a central platform, validating the license token's signature, and periodically re-verifying it to ensure it remains valid.
To verify a license's signature, the product requires the public keys of the central licensing platform. These keys are not bundled with the product. Instead, they are fetched dynamically.
kid). When the product encounters a license signed with a kid that is not in its local cache, it re-fetches the entire JWKS from the platform. This mechanism allows the platform to rotate signing keys without requiring a product update or release.A single public key is bundled into the product binary, but it serves only as a bootstrap seed for the very first startup before the product has successfully connected to the licensing platform. It is not used for long-term verification.
NOTE
Design Rationale for Dynamic Keys Fetching keys dynamically avoids the operational risks of bundling them. If a bundled key were compromised or needed to be rotated urgently, it would require a mandatory, fleet-wide product update. The dynamic fetch model allows for key rotation to occur on the platform side, with product instances picking up the changes automatically.
The following diagram illustrates the key fetching and license verification flow:
sequenceDiagram
participant Product Instance
participant Licensing Platform
Product Instance->>Product Instance: Start-up or periodic check
alt License key (kid) not in cache
Product Instance->>Licensing Platform: GET /<JWKS_ENDPOINT>
note right of Product Instance: The exact endpoint is not specified.
Licensing Platform-->>Product Instance: Public keys (JWKS)
Product Instance->>Product Instance: Cache public keys
end
Product Instance->>Product Instance: Verify license signature with cached key
alt Verification Fails
Product Instance->>Product Instance: Enter offline grace period
Product Instance->>Product Instance: Disable licensed features
else Verification Succeeds
Product Instance->>Product Instance: Enable/continue licensed features
endLicense verification is not a one-time event. The product continuously ensures the license remains valid:
The result of the verification check is cached briefly between re-verifications. If the licensing platform is unreachable when a check is due, the product enters an offline grace period rather than failing immediately.
The license JWT contains several claims that define the terms of the entitlement. The source specifies the following claims, among others:
| Claim | Type | Description |
|---|---|---|
expiry | Timestamp | The date after which the license is no longer valid. |
| Installation Binding | String | A value that binds the license to a specific product installation, preventing it from being used on another. The source does not specify the claim name. |
max_discovered_services | Integer | The maximum number of services the installation is permitted to discover. See Capacity Counting. |
max_converted_services | Integer | The maximum number of services the installation is permitted to convert. See Capacity Counting. |
| License Format Version | String / Integer | A version identifier for the license structure itself. The product will only accept the current format version. The source does not specify the claim name. |
IMPORTANT
The product only accepts licenses with the current, expected format version. Licenses with an older or unknown format version will be rejected.
Separate from the license token, certain integrations with the central platform are authenticated using a product API key. These keys follow a strict issuance and usage policy.
(customer, product, environment) combination.If a license verification fails for any reason, the product fails closed for entitlement. This means that licensed write operations are disabled after any applicable offline grace period has expired. Entitlement is never granted silently or by default if a check fails. This is in deliberate contrast to telemetry, which is designed to fail open.
Verification can fail under the following conditions:
expiry date in the license has passed.In any of these cases, the product will surface an error and restrict functionality. For specific error codes, see Offline Grace.
| Element | v1.0 Design |
|---|---|
| Entitlement source | Signed RS256 license (source of truth; never local config alone) |
| Signature keys | Fetched from the central platform (JWKS), cached, and re-fetched on unknown key ID |
| Re-verification | On every cold start + periodically (~daily) during runtime |
| Format version | Verifier accepts the current format version; rejects others |
| Install binding | License is bound to a specific installation; cannot be replayed elsewhere |
| API keys | One per (customer, product, environment); no cross-environment reuse |
| On failure | Fail closed for entitlement (after offline grace); never assume licensed |