Skip to content

Trust Marks

These database-managed options control trust mark publication, issuance specs, trust mark types, and trust mark ownership/issuance delegation. They are managed via the Admin API, lhsetup, or lhmigrate config2db.

See also the Trust Marks feature documentation for how trust mark issuance works in practice.

Published Trust Marks (trust_marks)

list

Trust marks about this LightHouse entity that are published in the Entity Configuration. These are trust marks held by this entity, not trust marks it issues.

Tool Command
Admin API GET/POST /api/v1/admin/entity-configuration/trust-marks
Admin API GET/PUT/PATCH/DELETE /api/v1/admin/entity-configuration/trust-marks/{trustMarkID}
lhsetup lhsetup --only=trust_marks (add/remove)
config2db lhmigrate config2db --only=trust_marks

Fields per Trust Mark

trust_mark_type

string required

The identifier (URI) for the type of this trust mark.

trust_mark_issuer

uri required if trust_mark not given

The entity ID of the trust mark issuer. If given (instead of trust_mark), refresh is set to true and LightHouse will obtain trust mark JWTs dynamically from the issuer.

trust_mark

string required if trust_mark_issuer not given

A trust mark JWT string to publish in the Entity Configuration. If it expires, it must be manually updated or automatic refreshing enabled via refresh.

refresh

boolean false

When true, LightHouse automatically fetches a new trust mark JWT from the trust mark issuer when the old one expires.

min_lifetime

duration 10 seconds

When refresh is true, LightHouse ensures the published trust mark JWT will not expire before this lifetime whenever an Entity Configuration is requested.

refresh_grace_period

duration 1 hour

When refresh is true, LightHouse checks if the trust mark expires within this grace period on every Entity Configuration request. If it does, the old (still valid) JWT is kept while a refresh is requested in the background.

refresh_rate_limit

duration

When refresh is true, this limits how frequently a refresh is attempted, preventing excessive requests to the trust mark issuer.

self_issuance_spec

object / mapping

When set, LightHouse self-issues the trust mark JWT instead of fetching it from an external issuer. The spec contains:

Field Type Description
lifetime integer (seconds) Lifetime of each self-issued trust mark JWT
ref uri The ref URI inside the trust mark JWT
logo_uri uri The logo URI inside the trust mark JWT
additional_claims object / mapping Additional claims included in the self-issued trust mark JWT
include_extra_claims_in_info boolean Whether to include extra claims in the trust mark info
Example published trust mark
{
  "trust_mark_type": "https://example.com/tm",
  "trust_mark_issuer": "https://example.com/tmi",
  "refresh": true,
  "min_lifetime": 300,
  "refresh_grace_period": 7200
}
Example self-issued trust mark
{
  "trust_mark_type": "https://example.com/self-issued",
  "self_issuance_spec": {
    "lifetime": 86400,
    "ref": "https://example.com/ref",
    "logo_uri": "https://example.com/logo"
  }
}

Trust Mark Specs (trust_mark_specs)

list

Defines which trust marks LightHouse can issue. Each spec describes a trust mark type and its issuance properties, including lifetime, eligibility rules, and per-subject overrides.

Tool Command
Admin API GET/POST /api/v1/admin/trust-marks/issuance-spec
Admin API GET/PUT/PATCH/DELETE /api/v1/admin/trust-marks/issuance-spec/{trustMarkSpecID}
lhsetup lhsetup --only=trust_mark_specs (add/remove)
config2db lhmigrate config2db --only=trust_mark_specs

Fields per Trust Mark Spec

trust_mark_type

string required

The trust mark type (ID) of the trust mark.

lifetime

integer (seconds)

The lifetime of each issued trust mark JWT.

ref

uri

The ref URI inside the trust mark JWT, as defined in the OpenID Federation Specification.

logo_uri

uri

The logo URI inside the trust mark JWT.

delegation_jwt

string

The delegation JWT inside the trust mark JWT. Required if this LightHouse instance is not the trust mark owner but issues trust marks on behalf of the owner.

additional_claims

object / mapping

Additional claims included in every trust mark JWT issued under this spec.

description

string

Human-readable description of the trust mark spec.

eligibility_config

object / mapping

Configuration that determines how trust mark eligibility is evaluated. See Eligibility Modes in the feature documentation for details.

Field Type Description
mode string Eligibility mode: db_only, check_only, db_or_check, db_and_check, custom
checker object Entity checker configuration (type + config). See Entity Checks
check_cache_ttl integer How long to cache eligibility check results (seconds); 0 = no cache

cache_ttl

integer (seconds)

How long to cache issued trust mark JWTs for this type. Reduces signing operations and database writes for repeated requests. 0 = no caching (default).

Example trust mark spec
{
  "trust_mark_type": "https://tm.example.org",
  "lifetime": 86400,
  "ref": "https://tm.example.org/ref",
  "logo_uri": "https://tm.example.org/logo",
  "eligibility_config": {
    "mode": "db_only"
  }
}
With a trust_path checker
{
  "trust_mark_type": "https://tm.example.org",
  "eligibility_config": {
    "mode": "db_or_check",
    "checker": {
      "type": "trust_path",
      "config": {
        "trust_anchors": ["https://ta.example.org"]
      }
    },
    "check_cache_ttl": 30
  }
}

The trust_anchors in DB checker configs are entity ID strings. Inline {"entity_id": ...} objects are also accepted and normalized to entity-ID references.

Trust Mark Subjects

Each spec maintains a list of subjects (entities) that are eligible to receive the trust mark. Each subject has a status (active, blocked, pending, inactive) and optional per-subject additional claims.

Tool Command
Admin API GET/POST /api/v1/admin/trust-marks/issuance-spec/{trustMarkSpecID}/subjects
Admin API GET/PUT/DELETE /api/v1/admin/trust-marks/issuance-spec/{trustMarkSpecID}/subjects/{trustMarkSubjectID}
Admin API PUT /api/v1/admin/trust-marks/issuance-spec/{trustMarkSpecID}/subjects/{trustMarkSubjectID}/status
Admin API GET/PUT/POST /api/v1/admin/trust-marks/issuance-spec/{trustMarkSpecID}/subjects/{trustMarkSubjectID}/additional-claims

Fields per Subject

Field Type Description
entity_id string Entity ID of the subject
status string active, blocked, pending, or inactive
description string Human-readable description
additional_claims object / mapping Per-subject additional claims merged into the JWT

The POST on additional-claims copies the spec-level additional claims into the subject, merging with any existing subject-level claims.

Federation Trust Marks

This section covers trust mark types, issuers, and owners — the federation-level configuration that defines which trust mark types exist in this federation, who owns them, and who is authorized to issue them, as defined in the OpenID Federation Specification.

Each can be managed through two complementary API patterns:

  • Type-centric (/trust-marks/types/{typeID}/...): Start from a trust mark type and manage its owner and issuers.
  • Entity-centric (/trust-marks/owners, /trust-marks/issuers): Start from an owner or issuer entity and manage which trust mark types it is associated with.

Trust Mark Types

list

Trust mark types are the registry of trust mark identifiers in this federation. Each type can have an optional owner and zero or more authorized issuers. Types are created implicitly by lhsetup and config2db when adding owners or issuers, but can also be managed directly via the Admin API.

Tool Command
Admin API GET/POST /api/v1/admin/trust-marks/types
Admin API GET/PUT/DELETE /api/v1/admin/trust-marks/types/{trustMarkTypeID}
lhsetup Not applicable (created implicitly when adding owners/issuers)
config2db Not applicable (created implicitly when migrating owners/issuers)

Fields per Trust Mark Type

Field Type Description
id integer Read-only identifier (assigned by the API)
trust_mark_type string The trust mark type identifier (URI)
description string Human-readable description
owner object The owner of this type, if set
issuers list The issuers authorized for this type

When creating a type, the owner and issuers can be set inline for convenience (see trust_mark_owner and trust_mark_issuers in the request body).

Create a type with owner and issuers
{
  "trust_mark_type": "https://refeds.org/sirtfi",
  "description": "Sirtfi compliance",
  "trust_mark_owner": {
    "entity_id": "https://refeds.org",
    "jwks": {"keys": [...]}
  },
  "trust_mark_issuers": [
    {"issuer": "https://issuer.example.org"}
  ]
}

Trust Mark Issuers (trust_mark_issuers)

list

Authorized trust mark issuers per trust mark type, as defined in the OpenID Federation Specification.

Type-centric API

Manage the issuers authorized for a specific trust mark type:

Tool Command
Admin API GET/PUT/POST /api/v1/admin/trust-marks/types/{trustMarkTypeID}/issuers
Admin API DELETE /api/v1/admin/trust-marks/types/{trustMarkTypeID}/issuers/{issuerID}
lhsetup lhsetup --only=trust_mark_issuers (add/remove)
config2db lhmigrate config2db --only=trust_mark_issuers

Entity-centric API

Manage issuer entities and their associated trust mark types:

Tool Command
Admin API GET/POST /api/v1/admin/trust-marks/issuers
Admin API GET/PUT/DELETE /api/v1/admin/trust-marks/issuers/{issuerID}
Admin API GET/PUT/POST/DELETE /api/v1/admin/trust-marks/issuers/{issuerID}/types

Fields per Issuer

Field Type Description
id integer Read-only identifier (assigned by the API)
issuer string Entity ID of the issuer
description string Human-readable description
types list Trust mark types this issuer is authorized for (entity-centric API only)
Add an issuer to a type (type-centric)
curl -X POST -u admin:password \
  -H "Content-Type: application/json" \
  -d '{"issuer": "https://issuer.example.org"}' \
  https://localhost:8081/api/v1/admin/trust-marks/types/1/issuers

Trust Mark Owners (trust_mark_owners)

list

Trust mark owners recognized within this federation, as defined in the OpenID Federation Specification. Each trust mark type has at most one owner, whose JWKS is used to verify delegation when another entity issues trust marks on the owner's behalf.

Type-centric API

Manage the single owner of a specific trust mark type:

Tool Command
Admin API GET/POST/PUT/DELETE /api/v1/admin/trust-marks/types/{trustMarkTypeID}/owner
lhsetup lhsetup --only=trust_mark_owners (add/remove)
config2db lhmigrate config2db --only=trust_mark_owners

Entity-centric API

Manage owner entities and their associated trust mark types:

Tool Command
Admin API GET/POST /api/v1/admin/trust-marks/owners
Admin API GET/PUT/DELETE /api/v1/admin/trust-marks/owners/{ownerID}
Admin API GET/PUT/POST/DELETE /api/v1/admin/trust-marks/owners/{ownerID}/types

Fields per Owner

Field Type Description
id integer Read-only identifier (assigned by the API)
entity_id string Entity ID of the owner
jwks object JWKS used to verify delegation JWTs
description string Human-readable description
Set the owner of a type (type-centric)
curl -X POST -u admin:password \
  -H "Content-Type: application/json" \
  -d '{
    "entity_id": "https://refeds.org",
    "jwks": {"keys": [{"kty": "RSA", "kid": "key1", "...": "..."}]}
  }' \
  https://localhost:8081/api/v1/admin/trust-marks/types/1/owner