Generated: 2026-07-31
Complete reference for all configuration parameters in the VC system.
These environment variables control service behavior outside of the YAML configuration file.
| Variable | Description | Example |
|---|---|---|
VC_CONFIG_YAML |
Path to the YAML configuration file. Each service reads this on startup. | config.yaml |
SSL_CERT_FILE |
Path to a CA certificate file that Go's crypto/x509 trusts for TLS verification. Required when services use self-signed or private CA certificates for inter-service HTTPS. |
/pki/rootCA.crt |
Shared configuration used across all services.
Path:
.common
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
production |
bool |
Production mode | - | true |
No |
log |
object |
Logging configuration | - | - | No |
mongo |
object |
MongoDB configuration | - | - | No |
tracing |
object |
OpenTelemetry tracing configuration | - | - | No |
metrics |
object |
OpenTelemetry metrics configuration | - | - | No |
kafka |
object |
Kafka message broker configuration | - | - | No |
secret_file_path |
string |
Path to a separate YAML file containing secrets; when set, secret values in config.yaml are cleared and only non-empty fields from the secrets file are applied. | "/etc/vc/secrets.yaml" |
- | No |
ha |
object |
High-availability mode. When Enable is true, caches use MongoDB (Common.Mongo.URI) instead of in-memory storage so state is shared across instances. | - | - | No |
branding |
object |
Custom branding configuration (logo and favicon paths) | - | - | No |
credential_metadata |
object |
OAuth2 scope values to their credential configuration, required by apigw, issuer, and verifier Key: OAuth2 scope (e.g., "pid", "ehic", "diploma") - matches AuthorizationContext.Scope Each entry contains the VCTM reference, format, and other configuration for that credential type | - | - | No |
Path:
.common.log
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
folder_path |
string |
Path to the log folder | "/var/log/vc" |
- | No |
Path:
.common.mongo
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
uri |
string |
MongoDB connection URI | "mongodb://user:password@mongo:27017/vc" |
- | Yes |
tls |
bool |
TLS for the MongoDB connection. Can also be enabled via the connection URI parameter "tls=true". | - | false |
No |
ca_file_path |
string |
Path to a PEM-encoded CA certificate used to verify the MongoDB server's certificate. When empty, the system root CAs are used. | - | - | No |
cert_file_path |
string |
Path to a PEM-encoded client certificate for mutual TLS (mTLS). Must be set together with KeyFilePath. | - | - | No |
key_file_path |
string |
Path to a PEM-encoded client private key for mutual TLS (mTLS). Must be set together with CertFilePath. | - | - | No |
Path:
.common.tracing,.common.metrics
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Enable activates OpenTelemetry tracing | - | false |
No |
addr |
string |
OTEL collector address | "jaeger:4318" |
- | Yes (if enabled) |
timeout |
int64 |
Timeout in seconds | - | 10 |
No |
Path:
.common.kafka
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Kafka integration | - | false |
No |
brokers |
[]string |
List of Kafka broker addresses | ["kafka0:9092", "kafka1:9092"] |
- | Yes (if enabled) |
sasl |
object |
SASL authentication for Kafka connections | - | - | No |
mtls |
object |
Mutual TLS (mTLS) for Kafka broker connections | - | - | No |
Path:
.common.kafka.sasl
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Enable activates SASL authentication | - | false |
No |
mechanism |
string |
SASL mechanism (PLAIN, SCRAM-SHA-256, SCRAM-SHA-512) | - | SCRAM-SHA-512 |
Yes (if enabled) |
username |
string |
SASL username | - | - | Yes (if enabled) |
password |
string |
SASL password | - | - | Yes (if enabled) |
Path:
.common.kafka.mtls
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
MTLS for the connection | - | false |
No |
ca_cert_path |
string |
Path to a CA certificate for verifying the remote peer (optional; uses system roots if empty) | - | - | No |
cert_file_path |
string |
Path to a client certificate for mutual authentication | - | - | Yes (if enabled) |
key_file_path |
string |
Path to the client private key | - | - | Yes (if enabled) |
insecure_skip_verify |
bool |
InsecureSkipVerify disables certificate verification (TESTING ONLY — never use in production) | - | false |
No |
Path:
.common.ha
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
HA mode; when true caches are backed by MongoDB instead of in-memory storage. | - | false |
No |
cache_database_name |
string |
MongoDB database name used for caches. | - | vc_cache |
No |
Path:
.common.branding
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
logo_path |
string |
File path to a custom logo PNG image; when empty, the built-in SUNET logo is used | - | - | No |
favicon_path |
string |
File path to a custom favicon PNG image; when empty, the built-in SUNET favicon is used | - | - | No |
Path:
.common.credential_metadata.<credential scope>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
display |
array |
Display: OPTIONAL. A non-empty array of objects, where each object contains the display properties of the supported Credential for a certain language. | - | - | No |
claims |
array |
Claims: OPTIONAL. A non-empty array of claims description objects as defined in Appendix B.2. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
name |
string |
Name: REQUIRED. String value of a display name for the Credential. | - | - | Yes |
locale |
string |
Locale: OPTIONAL. String value that identifies the language of this object represented as a language tag taken from values defined in BCP47 [RFC5646]. Multiple display objects MAY be included for separate languages. There MUST be only one object for each language identifier. | - | - | No |
description |
string |
Description: OPTIONAL. String value of a description of the Credential. | - | - | No |
background_color |
string |
BackgroundColor: OPTIONAL. String value of a background color of the Credential represented as numerical color values defined in CSS Color Module Level 37 [CSS-Color]. | - | - | No |
logo |
object |
Logo: OPTIONAL. Object with information about the logo of the Credential | - | - | No |
background_image |
object |
BackgroundImage: OPTIONAL. Object with information about the background image of the Credential. At least the following parameter MUST be included: | - | - | No |
text_color |
string |
TextColor: OPTIONAL. String value of a text color of the Credential represented as numerical color values defined in CSS Color Module Level 37 [CSS-Color]. | - | - | No |
rendering |
object |
Rendering: OPTIONAL | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[].logo,.common.credential_metadata.<credential scope>.display[].rendering.simple.logo,.apigw.issuer_metadata.display[].logo
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
uri |
string |
URI: REQUIRED. String value that contains a URI where the Wallet can obtain the logo of the Credential Issuer. The Wallet needs to determine the scheme, since the URI value could use the https: scheme, the data: scheme, etc. | - | - | Yes |
alt_text |
string |
AltText: OPTIONAL. String value of the alternative text for the logo image. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[].background_image
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
uri |
string |
URI REQUIRED. String value that contains a URI where the Wallet can obtain the background image of the Credential from the Credential Issuer. The Wallet needs to determine the scheme, since the URI value could use the https: scheme, the data: scheme, etc. | - | - | Yes |
Path:
.common.credential_metadata.<credential scope>.display[].rendering
as defined in ISO/IEC 18013-5 and referenced by OpenID4VCI mdoc rendering extensions.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
simple |
object |
Simple: OPTIONAL. Object containing simple rendering information, such as a logo. | - | - | No |
svg_templates |
array |
SvgTemplates: OPTIONAL. A non-empty array of SVG template objects used to render the Credential. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[].rendering.simple
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
logo |
object |
Logo: OPTIONAL. Object with information about the logo to use for simple rendering. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[].rendering.svg_templates[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
uri |
string |
URI: REQUIRED. String value that contains a URI where the Wallet can obtain the SVG template. | - | - | Yes |
uri_integrity |
string |
URIIntegrity: OPTIONAL. Subresource integrity hash (e.g. "sha256-...") of the SVG template, allowing the Wallet to verify the integrity of the fetched resource. | - | - | No |
properties |
object |
Properties: OPTIONAL. Object describing the rendering properties this template is suited for, such as orientation, color scheme, and contrast. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.display[].rendering.svg_templates[].properties
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
orientation |
string |
Orientation: OPTIONAL. String value, e.g. "portrait" or "landscape". | - | - | No |
color_scheme |
string |
ColorScheme: OPTIONAL. String value, e.g. "light" or "dark". | - | - | No |
contrast |
string |
Contrast: OPTIONAL. String value, e.g. "normal" or "high". | - | - | No |
Path:
.common.credential_metadata.<credential scope>.claims[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
path |
array |
Path: REQUIRED. A non-empty array representing a claims path pointer that specifies the path to a claim within the credential. A nil entry denotes a wildcard over an array's elements (e.g. ["nationalities", null]), matching the claims path pointer semantics used by presentation/DCQL and VCTM. | - | - | Yes |
svg_id |
string |
SVGID: OPTIONAL. A string linking the claim to a specific element ID in an SVG background template. | - | - | No |
mandatory |
bool |
Mandatory: OPTIONAL. Boolean which, when set to true, indicates that the Credential Issuer will always include this claim. | - | - | No |
display |
array |
Display: OPTIONAL. A non-empty array of objects containing display properties for the claim. | - | - | No |
Path:
.common.credential_metadata.<credential scope>.claims[].display[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
name |
string |
Name: OPTIONAL. String value of a display name for the claim. | - | - | No |
label |
string |
Label: OPTIONAL. Same as Name — included for compatibility with consumers (e.g. wallet-common's dataUriResolver) that expect a "label" field. | - | - | No |
locale |
string |
Locale: OPTIONAL. String value that identifies the language of this object. | - | - | No |
Configuration for the API Gateway service that handles credential issuance requests.
Path:
.apigw
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_server |
object |
HTTP API server configuration | - | - | Yes |
admin_ui_enable |
bool |
The admin web UI. When false (default), the /ui routes are not registered. This must be explicitly set to true to enable the admin interface. | - | false |
No |
key_config |
object |
Signing key configuration | - | - | Yes |
data_sources |
object |
Credential types to their data sources | - | - | Yes |
auth_providers |
object |
How users authenticate (SAML, OIDC) | - | - | No |
remotes |
object |
Named external API connections referenced by DataSources.ExternalAPI | "ladok" |
- | No |
delivery |
object |
Delivery groups credential delivery to wallets (OpenID4VCI, credential offers) | - | - | Yes |
issuer_metadata |
object |
OpenID4VCI issuer metadata | - | - | No |
public_url |
string |
Public URL of this service (must be valid HTTP/HTTPS URL) | "https://issuer.sunet.se" |
- | Yes |
issuer_client |
object |
GRPC client config for issuer | - | - | Yes |
registry_client |
object |
GRPC client config for registry | - | - | Yes |
identity_mapping_import |
object |
Automatic import of identity mappings from JSON files at startup. When configured, APIGW reads JSON files and imports them into the identity mappings collection on first startup (skipped if data already exists). | - | - | No |
trust |
object |
Trust evaluation configuration for OpenID4VP credential validation. When configured, credentials presented via VP are validated against a PDP. | - | - | No |
federation |
object |
OpenID Federation entity configuration. When enabled, serves /.well-known/openid-federation as a self-signed JWT. | - | - | No |
rate_limit |
object |
Per-endpoint rate limiting for the APIGW. | - | - | No |
Path:
.apigw.api_server,.issuer.api_server,.verifier.api_server,.registry.api_server
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
addr |
string |
Listen address for the HTTP server | - | :8080 |
No |
served_by_header |
string |
The X-Served-By response header value for HA troubleshooting. Empty (default): header is not set. "hostname": uses os.Hostname(). Any other value is used as-is. | - | - | No |
tls |
object |
TLS | - | - | No |
api_auth |
object |
API Auth | - | - | No |
cors |
object |
CORS | - | - | No |
trust_proxy_tls |
bool |
The Secure flag on session cookies even when TLS is not enabled on this server. Use this when running behind a TLS-terminating reverse proxy. | - | false |
No |
Path:
.apigw.api_server.tls,.issuer.api_server.tls,.verifier.api_server.tls,.registry.api_server.tls
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
TLS | - | false |
No |
cert_file_path |
string |
Path to the TLS certificate | - | - | Yes (if enabled) |
key_file_path |
string |
Path to the TLS private key | - | - | Yes (if enabled) |
Path:
.apigw.api_server.api_auth,.issuer.api_server.api_auth,.verifier.api_server.api_auth,.registry.api_server.api_auth
JWKS and OIDC are mutually exclusive If neither is enabled, no authentication is applied (open access)
When Rules (and/or RulesFile) are configured, each authenticated request is checked against a SPOCP engine. A query of the form
(vc (service )(method <HTTP_METHOD>)(path <REQUEST_PATH>)(subject <JWT_SUBJECT>)(authentic_source
is evaluated; the request is allowed only if a matching rule exists. All six parts are required in every rule. Use * as wildcard for fields you don't want to restrict. The value is supplied by the calling service at middleware registration time. When two services share endpoints, rules for one service do not grant access to the other. When no rules are configured, any valid Bearer JWT grants access.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
jwks |
object |
Static JWKS Bearer token authentication configuration When enabled, requests are validated against a manually configured JWKS URL | - | - | No |
oidc |
object |
OIDC Bearer token authentication configuration When enabled, the JWKS endpoint is auto-discovered from the issuer's .well-known/openid-configuration and Bearer JWTs are validated locally The RP fields (client_id, redirect_uri, etc.) also enable the admin UI login flow via OIDC redirect | - | - | No |
rules |
[]string |
SPOCP S-expression authorization rules loaded into an in-process engine. All six parts (service, method, path, subject, authentic_source, scope) are mandatory in every rule — use * for wildcards. Rules apply regardless of whether JWKS or OIDC is the active auth method | ["(vc (service apigw)(method POST)(path /api/v1/upload)(subject alice)(authentic_source SUNET)(scope eduid))"] |
- | No |
rules_file |
string |
Optional path to a file containing SPOCP rules (one per line) Rules from this file are loaded in addition to the inline Rules list | - | - | No |
Path:
.apigw.api_server.api_auth.jwks,.issuer.api_server.api_auth.jwks,.verifier.api_server.api_auth.jwks,.registry.api_server.api_auth.jwks
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Static JWKS Bearer token authentication | - | false |
No |
jwks_url |
string |
URL of the JSON Web Key Set used to validate token signatures. Mutually exclusive with jwks_file_path; exactly one must be set when enable is true | "https://auth.example.com/.well-known/jwks.json" |
- | No (mutually exclusive with jwks_file_path) |
jwks_file_path |
string |
Local file path to a JWKS JSON file used to validate token signatures. Mutually exclusive with jwks_url; exactly one must be set when enable is true | - | - | No (mutually exclusive with jwks_url) |
issuer |
string |
Expected "iss" claim. Tokens with a different issuer are rejected | - | - | Yes (if enabled) |
audience |
string |
Expected "aud" claim. Tokens that do not contain this audience are rejected | - | - | Yes (if enabled) |
Path:
.apigw.api_server.api_auth.oidc,.issuer.api_server.api_auth.oidc,.verifier.api_server.api_auth.oidc,.registry.api_server.api_auth.oidc
It serves two purposes:
- API auth: Bearer JWTs in Authorization headers are validated locally against the provider's JWKS (auto-discovered from IssuerURL).
- Admin UI login: the RP fields (ClientID, RedirectURI, Scopes) enable an authorization-code redirect flow so admins log in via the OIDC provider.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
OIDC authentication | - | false |
No |
issuer_url |
string |
OIDC provider's issuer URL used for discovery and "iss" claim validation. | "https://auth.example.com" |
- | Yes (if enabled) |
audience |
string |
Expected "aud" claim. Tokens that do not contain this audience are rejected. | - | - | Yes (if enabled) |
client_id |
string |
OAuth2 client identifier registered with the OIDC provider. | - | - | Yes (if enabled) |
client_secret |
string |
OAuth2 client secret. May be empty for public clients. | - | - | No |
redirect_uri |
string |
Callback URL for the admin UI OIDC login flow (e.g. "https://apigw.example.com/ui/callback"). | "https://apigw.example.com/ui/callback" |
- | Yes (if enabled) |
scopes |
[]string |
OAuth2/OIDC scopes to request (default: ["openid"]). | - | - | No |
Path:
.apigw.api_server.cors,.issuer.api_server.cors,.verifier.api_server.cors,.registry.api_server.cors
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
allowed_origins |
[]string |
List of allowed CORS origins | ["https://wallet.sunet.se", "https://app.sunet.se"] |
[] |
No |
Path:
.apigw.key_config,.issuer.key_config,.verifier.key_config,.registry.token_status_lists.key_config
Supports both file-based and HSM-based keys with explicit control.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
private_key_path |
string |
File-based configuration | - | - | Yes (if pkcs11 not set) |
chain_path |
string |
Path to certificate chain (optional) | - | - | No |
pkcs11 |
object |
HSM-based configuration | - | - | Yes (if private_key_path not set) |
source |
object |
Source selection (determines which config to use) If empty, tries in order: File (if FilePath set), then HSM (if HSM set) | - | - | No |
enable_file |
bool |
File-based key loading (default: true if FilePath set) | - | - | No |
enable_hsm |
bool |
HSM-based key loading (default: true if HSM set) | - | - | No |
priority |
array |
Fallback order when both are enabled If nil, uses Source field or auto-detects based on what's configured | ["hsm", "file"] |
- | No |
Path:
.apigw.key_config.pkcs11,.issuer.key_config.pkcs11,.verifier.key_config.pkcs11,.registry.token_status_lists.key_config.pkcs11
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
module_path |
string |
Path to the PKCS#11 library | "/usr/lib/softhsm/libsofthsm2.so" |
- | No |
slot_id |
uint |
HSM slot ID | 0 |
- | No |
pin |
string |
User PIN for the slot | "1234" |
- | No |
key_label |
string |
Label of the key to use | "my-signing-key" |
- | No |
key_id |
string |
Identifier for the JWT kid header | "key-1" |
- | No |
Path:
.apigw.data_sources
Each key under a data source is a credential type.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
datastore |
object |
Credential types backed by a pre-loaded datastore (e.g. MongoDB) | - | - | No |
assertion |
object |
Credential types backed by authentication assertions (SAML attributes or OIDC claims) | - | - | No |
external_api |
object |
Credential types backed by an external API Each credential references a named remote defined in APIGW.Remotes | - | - | No |
Path:
.apigw.data_sources.datastore
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
scopes |
object |
Credential scope names to their datastore configuration | - | - | No |
import |
object |
Automatic data import from JSON files at startup. When configured, APIGW reads JSON files and imports them into the datastore on first startup (skipped if data already exists). | - | - | No |
Path:
.apigw.data_sources.datastore.scopes.<credential scope>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
auth_provider |
string |
Auth provider for this credential type (openid4vp, saml, or oidc) | - | - | Yes |
auth_claims |
[]string |
The normalized claim names used for datastore identity lookup when auth_provider is saml or oidc. Not used for openid4vp (use AuthScopes instead). These names must match the BSON field names under "identities." in the datastore. Use attribute_mappings (in auth_providers) to normalize provider-specific attribute names (e.g. SAML urn:oid:2.5.4.42, eIDAS date_of_birth) to these canonical names. Available identity fields: given_name, family_name, birth_date, birth_place, authentic_source_person_id, personal_administrative_number. | [given_name, family_name, birth_date] |
- | No |
auth_scopes |
object |
Credential scope keys to their per-scope authentication config. Used only for openid4vp: the wallet must present a credential matching any one of the listed scopes (OR logic). Each entry specifies which claims to extract from that particular credential type. | - | - | No |
Path:
.apigw.data_sources.datastore.scopes.<credential scope>.auth_scopes.<key>
Each entry represents one acceptable credential type the wallet can present.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
auth_claims |
[]string |
The identity claims to extract from this credential type. | [given_name, family_name, birth_date] |
- | Yes |
Path:
.apigw.data_sources.datastore.import
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
file_paths |
[]string |
JSON files to import into the datastore. Each JSON file should contain a map of person IDs to CompleteDocument objects. Import is skipped if the datastore already contains data. | ["./bootstrapping/pid.json", "./bootstrapping/ehic.json"] |
- | Yes |
users |
[]string |
Users limits which person IDs to import. If empty, all persons are imported. | ["100", "102"] |
- | No |
Path:
.apigw.data_sources.assertion
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
scopes |
object |
Credential scope names to their assertion configuration | - | - | No |
Path:
.apigw.data_sources.assertion.scopes.<credential scope>
The data comes directly from the SAML attributes or OIDC claims.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
auth_provider |
string |
Auth provider for this credential type (saml or oidc) | - | - | Yes |
Path:
.apigw.data_sources.external_api
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
scopes |
object |
Credential scope names to their external API configuration | - | - | No |
Path:
.apigw.data_sources.external_api.scopes.<credential scope>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
remote |
string |
Name of a remote defined in Remotes | - | - | Yes |
auth_provider |
string |
Auth provider to identify the user (saml or oidc) | - | - | Yes |
attribute_mapping |
object |
How to map API response data to credential claims | - | - | No |
Path:
.apigw.data_sources.external_api.scopes.<credential scope>.attribute_mapping.<attribute>,.apigw.auth_providers.saml.attribute_mapping.<attribute>,.apigw.auth_providers.oidc.attribute_mapping.<attribute>
Generic across protocols (SAML, OIDC, etc.) - uses protocol-specific identifiers as keys
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
claim |
string |
Target claim name (supports dot-notation for nesting) | "identity.given_name" |
- | Yes |
required |
bool |
Required indicates if this attribute must be present in the assertion/response | - | false |
No |
transform |
string |
Optional transformation to apply Supported: "lowercase", "uppercase", "trim", "country_alpha2", "country_alpha3" | - | - | No |
default |
string |
Optional default value if attribute is missing | - | - | No |
as_array |
bool |
AsArray wraps a scalar value in a single-element array before setting the claim. No-op when the value is already a slice (e.g. multi-valued OIDC claim). | - | - | No |
Path:
.apigw.auth_providers
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
saml |
object |
The SAML SP auth provider | - | - | No |
oidc |
object |
The OIDC RP auth provider | - | - | No |
Path:
.apigw.auth_providers.saml
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
SAML support (default: false) | - | false |
No |
entity_id |
string |
SAML SP entity identifier (typically the metadata URL) | "https://issuer.sunet.se/saml/metadata" |
- | Yes (if enabled) |
metadata_url |
string |
Public URL where SP metadata is served (optional, auto-generated if empty) | - | - | No |
mdq_server |
string |
Base URL for MDQ (Metadata Query Protocol) server (must end with /) Mutually exclusive with StaticIDPMetadata | "https://md.sunet.se/entities/" |
- | No |
static_idp_metadata |
object |
A single static IdP as alternative to MDQ Mutually exclusive with MDQServer | - | - | No |
certificate_path |
string |
Path to X.509 certificate for SAML signing/encryption TODO(pki): Migrate to pki.KeyConfig for consistency with other services and to enable HSM-backed SAML signing keys in the future. | - | - | Yes (if enabled) |
private_key_path |
string |
Path to private key for SAML signing/encryption TODO(pki): See CertificatePath TODO — both fields would be replaced by a single KeyConfig. | - | - | Yes (if enabled) |
acs_endpoint |
string |
Assertion Consumer Service URL where IdP sends SAML responses | "https://issuer.sunet.se/saml/acs" |
- | Yes (if enabled) |
session_duration |
int |
Maximum time in seconds an in-flight SAML authentication flow (AuthnRequest → Response) may remain active before it expires | - | 300 |
No |
attribute_mapping |
object |
AttributeMapping normalizes provider-specific attribute names (e.g. SAML OIDs) to canonical claim names. Applied to ALL attributes in the assertion. Which normalized attributes are used depends on the data source: - assertion: VCTM determines which go into the credential - datastore: auth_claims determines which are used for DB identity lookup | - | - | Yes (if enabled) |
metadata_signing_cert_path |
string |
Path to the X.509 certificate used to verify metadata signatures. When set, all fetched metadata (MDQ and static) must carry a valid XML signature from this certificate. | - | - | No |
allow_unsigned_metadata |
bool |
AllowUnsignedMetadata permits MDQ/URL metadata without signature verification. This is INSECURE (MITM → fake IdP) and should only be used in development. When false (default), MDQ and URL metadata sources require MetadataSigningCertPath. Local metadata files are allowed unsigned regardless (with a startup warning). | - | false |
No |
metadata_cache_ttl |
int |
MetadataCacheTTL in seconds (default: 3600) - how long to cache IdP metadata from MDQ | - | - | No |
Path:
.apigw.auth_providers.saml.static_idp_metadata
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
entity_id |
string |
IdP entity identifier | - | - | Yes |
metadata_path |
string |
File path to IdP metadata XML (mutually exclusive with MetadataURL) | - | - | Yes (if metadata_url not set; mutually exclusive) |
metadata_url |
string |
HTTP(S) URL to fetch IdP metadata from (mutually exclusive with MetadataPath) | - | - | No |
Path:
.apigw.auth_providers.oidc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
OIDC RP support (default: false) | - | false |
No |
registration |
object |
How the client obtains credentials from the OIDC Provider. Exactly one of preconfigured or dynamic must be set: - preconfigured: pre-registered client_id and client_secret - dynamic: RFC 7591 dynamic client registration (credentials obtained at startup) | - | - | Yes (if enabled) |
redirect_uri |
string |
Callback URL where the OIDC Provider sends the authorization response | "https://issuer.sunet.se/oidcrp/callback" |
- | Yes (if enabled) |
issuer_url |
string |
OIDC Provider's issuer URL for discovery Used for .well-known/openid-configuration discovery | "https://accounts.google.com" |
- | Yes (if enabled) |
scopes |
[]string |
OAuth2/OIDC scopes to request (at least one scope is required, e.g. "openid") | - | ["openid", "profile", "email"] |
No |
session_duration |
int |
Maximum time in seconds an in-flight OIDC authorization flow (state, nonce, PKCE verifier) may remain active before it expires | - | 300 |
No |
client_name |
string |
Human-readable name for the OIDC client, shown during dynamic registration or consent | - | - | No |
client_uri |
string |
URL to the client's homepage, used for display during consent | - | - | No |
logo_uri |
string |
URL to the client's logo image, shown during consent screens | - | - | No |
contacts |
[]string |
List of email addresses for responsible parties of this client | - | - | No |
tos_uri |
string |
URL to the client's Terms of Service document | - | - | No |
policy_uri |
string |
URL to the client's Privacy Policy document | - | - | No |
attribute_mapping |
object |
AttributeMapping normalizes OIDC claim names to canonical claim names. Optional: when omitted, OIDC claims pass through as-is (standard names already match). Which normalized attributes are used depends on the data source: - assertion: VCTM determines which go into the credential - datastore: auth_claims determines which are used for DB identity lookup | - | - | No |
Path:
.apigw.auth_providers.oidc.registration
Exactly one of Preconfigured or Dynamic must be set.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
preconfigured |
object |
Preconfigured uses pre-registered client credentials. Set this when the client is already registered with the OIDC Provider. | - | - | Yes (if dynamic not set; mutually exclusive) |
dynamic |
object |
Dynamic uses RFC 7591 dynamic client registration. Set this when the client should register itself at startup. | - | - | Yes (if preconfigured not set; mutually exclusive) |
Path:
.apigw.auth_providers.oidc.registration.preconfigured
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Enable activates preconfigured client credentials | - | - | No |
client_id |
string |
OIDC client identifier | - | - | Yes (if enabled) |
client_secret |
string |
OIDC client secret | - | - | Yes (if enabled) |
Path:
.apigw.auth_providers.oidc.registration.dynamic
When set, client credentials are obtained automatically at startup and persisted in the database.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Enable activates dynamic client registration | - | - | No |
initial_access_token |
string |
Bearer token for registration Required by some OIDC Providers (e.g., Keycloak) | - | - | Yes (if enabled) |
Path:
.apigw.remotes.<remote name>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
type |
string (eduapi|ooapi) |
API protocol type | - | - | Yes |
base_url |
string |
Base URL of the API endpoint | "https://api.ladok.se/eduapi" |
- | Yes |
token_url |
string |
OAuth 2.0 token endpoint for Client Credentials Grant | "https://api.ladok.se/oauth2/token" |
- | Yes |
client_id |
string |
OAuth 2.0 client identifier | - | - | Yes |
client_secret |
string |
OAuth 2.0 client secret | - | - | Yes |
scopes |
[]string |
OAuth 2.0 scopes to request | - | - | No |
timeout |
duration |
HTTP client timeout | - | 10s |
No |
Path:
.apigw.delivery
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
openid4vci |
object |
The OpenID4VCI Authorization Server for wallet credential issuance | - | - | Yes |
credential_offers |
object |
Credential offer wallet configurations | - | - | Yes |
Path:
.apigw.delivery.openid4vci
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
token_endpoint |
string |
OAuth2 token endpoint URL | "https://verifier.sunet.se/token" |
- | Yes |
clients |
object |
OAuth2 client configurations | - | - | Yes |
allow_unverified_client_assertion |
bool |
Accepting client_assertion (private_key_jwt) WITHOUT signature verification. This is INSECURE and only intended for conformance testing environments. When false (default), client_assertion is rejected. TODO(security): Remove this flag once full RFC 7523 verification is implemented. | - | false |
No |
grant_types |
[]string |
List of grant types this issuer supports. Supported values: authorization_code, urn:ietf:params:oauth:grant-type:pre-authorized_code, refresh_token | - | ["authorization_code", "urn:ietf:params:oauth:grant-type:pre-authorized_code"] |
No |
refresh_token_duration |
int |
Refresh token duration in seconds. Only applicable when grant_types includes "refresh_token". | - | 86400 |
No |
Path:
.apigw.delivery.openid4vci.clients.<client id>,.verifier.inbound.openid4vp.clients.<client id>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
type |
string |
Client type per RFC 6749 Section 2.1 ("public" or "confidential"). Defaults to "public" since registered clients are wallets (native/web apps) that cannot securely store credentials and rely on PKCE instead. | - | public |
No |
redirect_uri |
[]string |
List of allowed redirect URIs for the client. Accepts either a single string or an array of strings in YAML/JSON. | "https://example.com/callback" |
- | Yes |
scopes |
[]string |
List of OAuth2 scopes allowed for the client | - | - | Yes |
jwks_uri |
string |
URL to the client's JWKS for verifying client_assertion signatures (RFC 7523). Required for confidential clients using private_key_jwt authentication. | - | - | No |
Path:
.apigw.delivery.credential_offers
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
issuer_url |
string |
Issuer URL for credential offers | - | - | Yes |
wallets |
object |
Wallet redirect configurations | - | - | Yes |
Path:
.apigw.delivery.credential_offers.wallets.<wallet name>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
label |
string |
Display label for the wallet | - | - | Yes |
redirect_uri |
string |
Wallet redirect URI | "eudi-wallet://credential-offer" |
- | Yes |
Path:
.apigw.issuer_metadata
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
authorization_servers |
[]string |
The authorization server URLs | - | - | No |
deferred_credential_endpoint |
string |
Deferred credential endpoint | - | - | No |
notification_endpoint |
string |
Notification endpoint | - | - | No |
cryptographic_binding_methods_supported |
[]string |
The supported binding methods | - | - | No |
credential_signing_alg_values_supported |
[]string |
The supported signing algorithms | - | - | No |
proof_signing_alg_values_supported |
[]string |
The supported proof algorithms | - | - | No |
credential_response_encryption |
object |
Response encryption configuration | - | - | No |
batch_credential_issuance |
object |
Batch issuance configuration | - | - | No |
display |
array |
Display metadata | - | - | No |
mdoc_iacas_uri |
string |
URL where IACA certificates are published for mDOC verification. When configured, this is included in .well-known/openid-credential-issuer metadata so verifiers can dynamically discover trust anchors for ISO 18013-5 credentials. | - | - | No |
Path:
.apigw.issuer_metadata.credential_response_encryption
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
alg_values_supported |
[]string |
AlgValuesSupported: REQUIRED. Array containing a list of the JWE [RFC7516] encryption algorithms (alg values) [RFC7518] supported by the Credential and Batch Credential Endpoint to encode the Credential or Batch Credential Response in a JWT [RFC7519]. | - | - | Yes |
enc_values_supported |
[]string |
EncValuesSupported: REQUIRED. Array containing a list of the JWE [RFC7516] encryption algorithms (enc values) [RFC7518] supported by the Credential and Batch Credential Endpoint to encode the Credential or Batch Credential Response in a JWT [RFC7519]. | - | - | Yes |
encryption_required |
bool |
EncryptionRequired: REQUIRED. Boolean value specifying whether the Credential Issuer requires the additional encryption on top of TLS for the Credential Response. If the value is true, the Credential Issuer requires encryption for every Credential Response and therefore the Wallet MUST provide encryption keys in the Credential Request. If the value is false, the Wallet MAY chose whether it provides encryption keys or not. | - | - | No |
Path:
.apigw.issuer_metadata.batch_credential_issuance
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
batch_size |
int |
BatchSize: REQUIRED. Integer value specifying the maximum array size for the proofs parameter in a Credential Request. | - | - | Yes |
Path:
.apigw.issuer_metadata.display[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
name |
string |
Name: OPTIONAL. String value of a display name for the Credential Issuer. | - | - | No |
locale |
string |
Locale: OPTIONAL. String value that identifies the language of this object represented as a language tag taken from values defined in BCP47 [RFC5646]. There MUST be only one object for each language identifier. | - | - | No |
logo |
object |
Logo: OPTIONAL. Object with information about the logo of the Credential Issuer. Below is a non-exhaustive list of parameters that MAY be included: | - | - | No |
Path:
.apigw.issuer_client,.apigw.registry_client,.issuer.registry_client
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
addr |
string |
GRPC server address | "issuer:8090" |
- | Yes |
tls |
bool |
TLS | - | false |
No |
cert_file_path |
string |
Client certificate for mTLS | - | - | No |
key_file_path |
string |
Client private key for mTLS | - | - | No |
ca_file_path |
string |
CA certificate to verify the server | - | - | No |
server_name |
string |
Server name for TLS verification (optional) | - | - | No |
Path:
.apigw.identity_mapping_import
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
file_paths |
[]string |
JSON files containing identity mappings to import. Each JSON file should contain a map of person IDs to arrays of IdentityMapping objects. Import is skipped if the identity mappings collection already contains data. | ["./bootstrapping/identity_mappings.json"] |
- | Yes |
users |
[]string |
Users limits which person IDs to import. If empty, all persons are imported. | ["100", "102"] |
- | No |
Path:
.apigw.trust,.verifier.trust
This is used for validating W3C VC Data Integrity proofs and other trust-related operations.
Trust evaluation operates in one of two modes:
- When PDPURL is configured: "default deny" mode - all trust decisions go through the PDP
- When PDPURL is empty: "allow all" mode - keys are resolved but always considered trusted
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
pdp_url |
string |
URL of the AuthZEN PDP (Policy Decision Point) service for trust evaluation. When set, operates in "default deny" mode - trust decisions require PDP approval. When empty, operates in "allow all" mode - resolved keys are always considered trusted. | "https://trust.sunet.se/pdp" |
- | No |
local_did_methods |
[]string |
Which DID methods can be resolved locally without go-trust. Self-contained methods like "did:key" and "did:jwk" are always resolved locally. | - | ["did:key", "did:jwk"] |
No |
trust_policies |
object |
Per-role trust evaluation policies. The key is the role (e.g., "issuer", "verifier") and the value contains policy settings. | - | - | No |
allowed_signature_algorithms |
[]string |
AllowedSignatureAlgorithms restricts which JWT signature algorithms are accepted. If empty, defaults to a secure set: ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512, EdDSA. The "none" algorithm is NEVER allowed regardless of configuration. | ["ES256", "ES384", "ES512", "EdDSA"] |
- | No |
wallet_attestation |
object |
Wallet attestation-based client authentication. This is a trust-evaluation mechanism (delegates to the PDP above), so it lives here rather than under delivery.openid4vci. | - | - | No |
Path:
.apigw.trust.trust_policies.<role>,.verifier.trust.trust_policies.<role>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
trust_frameworks |
[]string |
The accepted trust frameworks for this role. | ["did:web", "did:ebsi", "etsi-tl", "openid-federation", "x509"] |
- | No |
trust_anchors |
[]string |
Trusted root entities for this role. Format depends on the trust framework (e.g., DID for did:web, federation entity for OpenID Fed). | - | - | No |
require_revocation_check |
bool |
RequireRevocationCheck enforces revocation status checking for this role. Default: false | - | false |
No |
Path:
.apigw.trust.wallet_attestation,.verifier.trust.wallet_attestation
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enabled |
bool |
Wallet attestation-based authentication. When true and PDPURL is configured, wallets can authenticate using a provider-signed attestation JWT instead of pre-registration in Clients. The PDP validates the wallet provider against configured trust lists/federation. PKCE remains mandatory as the primary code-binding mechanism. | - | false |
No |
policy |
object |
SPOCP-based authorization for wallet attestation. When configured, after the PDP validates the wallet provider, the SPOCP engine checks whether the attestation tier (attestation_source) is authorized for the requested scope. When empty, all trusted wallets are authorized (default open). | - | - | No |
Path:
.apigw.trust.wallet_attestation.policy,.verifier.trust.wallet_attestation.policy
Each rule is an S-expression of the form:
(wallet (attestation_source )(scope )(issuer ))
Use * as wildcard. When no rules are configured, any trusted wallet is authorized. Example rules:
(wallet (attestation_source ios_app_attest)(scope pid)(issuer *)) — allow iOS Tier 4+ for PID (wallet (attestation_source android_play_integrity)(scope pid)(issuer *)) — allow Android Tier 4+ for PID (wallet (attestation_source *)(scope ehic)(issuer *)) — allow any tier for EHIC
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
rules |
[]string |
Inline SPOCP rules. | - | - | No |
rules_file |
string |
Path to a file containing SPOCP rules (one per line, # comments). | - | - | No |
Path:
.apigw.federation,.verifier.federation
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enabled |
bool |
The federation entity configuration endpoint. | - | false |
No |
entity_id |
string |
Entity identifier (defaults to PublicURL if empty). | - | - | No |
authority_hints |
[]string |
Superior authority entity identifiers. | - | - | No |
organization_name |
string |
Human-readable organization name. | - | - | No |
logo_uri |
string |
Organization logo URL. | - | - | No |
trust_marks |
array |
TrustMarks contains pre-issued trust mark JWTs. | - | - | No |
ttl |
int64 |
Validity period of the entity configuration in seconds. Default: 86400 (24 hours). | - | 86400 |
No |
Path:
.apigw.federation.trust_marks[],.verifier.federation.trust_marks[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
id |
string |
Trust mark identifier. | - | - | Yes |
jwt |
string |
Trust mark JWT string. | - | - | Yes |
Path:
.apigw.rate_limit
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
token_requests_per_minute |
int |
Maximum token endpoint requests per minute per IP. Default: 20 | - | 20 |
No |
credential_requests_per_minute |
int |
Maximum credential endpoint requests per minute per IP. Default: 30 | - | 30 |
No |
datastore_requests_per_minute |
int |
Maximum datastore endpoint requests per minute per IP. Default: 60 | - | 60 |
No |
Configuration for the Issuer service that signs and issues verifiable credentials.
Path:
.issuer
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_server |
object |
HTTP API server configuration | - | - | Yes |
grpc_server |
object |
GRPC server configuration | - | - | Yes |
key_config |
object |
Signing key configuration | - | - | Yes |
jwt_attribute |
object |
JWT credential attribute configuration | - | - | Yes |
issuer_url |
string |
Issuer identifier URL | "https://issuer.sunet.se" |
- | Yes |
registry_client |
object |
Registry gRPC client config | - | - | No |
mdoc |
object |
MDL/mdoc configuration | - | - | No |
audit_log |
object |
Audit log configuration | - | - | No |
sign_metadata_rate_limit |
object |
The rate limiter for the SignMetadata gRPC endpoint. In HA setups each APIGW node refreshes two documents (VCI+OAuth2), so the defaults should accommodate the expected cluster size. Default: 2 req/s, burst 20. | - | - | No |
pseudonym_seed |
bool |
PseudonymSeed, if true, makes the issuer attach a random seed as the pseudonym_seed claim. | - | - | No |
Path:
.issuer.grpc_server,.registry.grpc_server
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
addr |
string |
GRPC server listen address | - | :8090 |
No |
tls |
object |
MTLS configuration | - | - | No |
Path:
.issuer.grpc_server.tls,.registry.grpc_server.tls
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Enable | - | false |
No |
cert_file_path |
string |
Server certificate | - | /pki/grpc_server.crt |
Yes (if enabled) |
key_file_path |
string |
Server private key | - | /pki/grpc_server.key |
Yes (if enabled) |
client_ca_path |
string |
CA to verify client certificates (for mTLS) | - | /pki/client_ca.crt |
Yes (if enabled) |
allowed_client_fingerprints |
object |
SHA256 fingerprint -> friendly name | a1b2c3...: issuer-prod |
- | No |
allowed_client_dns |
object |
Friendly name -> Certificate Subject DN | apigw-prod: CN=apigw,O=SUNET |
- | No |
Path:
.issuer.jwt_attribute
In a later state this should be placed under authentic source in order to issue credentials based on that configuration.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
issuer |
string |
Issuer of the token | https://issuer.sunet.se |
- | Yes |
static_host |
string |
Static host of the issuer, expose static files, like pictures. | - | - | No |
enable_not_before |
bool |
The time not before which the token is valid | - | false |
No |
valid_duration |
int64 |
Valid duration of the token in seconds | - | 3600 |
No |
verifiable_credential_type |
string |
VerifiableCredentialType URL | https://credential.sunet.se/identity_credential |
- | Yes |
status |
string |
Status status of the Verifiable Credential | - | - | No |
kid |
string |
Kid key id of the signing key | - | - | No |
Path:
.issuer.mdoc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
certificate_chain_path |
string |
Path to the PEM certificate chain TODO(pki): Consider folding into pki.KeyConfig.ChainPath to unify certificate chain loading with the standard key material configuration pattern. | - | - | Yes |
default_validity |
duration |
Default credential validity (default: 365 days) | - | 8760h |
No |
digest_algorithm |
string |
Digest algorithm: "SHA-256", "SHA-384", or "SHA-512" | - | SHA-256 |
No |
Path:
.issuer.audit_log
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Audit logging | - | false |
No |
destinations |
[]string |
List of log destinations (console/stdout, file path, or HTTP URL) | ["stdout", "/var/log/audit.log", "https://audit.sunet.se/webhook"] |
- | Yes (if enabled) |
file_sync_interval |
duration |
Fsync behavior for file destinations. 0 = fsync after every write (strict durability, lower throughput). >0 = periodic batched fsync at the given interval (better throughput, bounded data-loss window). Has no effect on console or webhook destinations. | - | 5s |
No |
Path:
.issuer.sign_metadata_rate_limit
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
requests_per_second |
float64 |
Sustained rate limit in requests per second. Default: 2 | - | 2 |
No |
burst |
int |
Maximum number of requests allowed in a single burst. Default: 20 | - | 20 |
No |
Configuration for the Verifier service that verifies credentials and acts as an OIDC Provider.
Path:
.verifier
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_server |
object |
HTTP API server configuration | - | - | Yes |
public_url |
string |
Public URL of this service (must be valid HTTP/HTTPS URL) | "https://verifier.sunet.se" |
- | Yes |
key_config |
object |
Signing key configuration | - | - | Yes |
client_id_scheme |
string |
ClientIDScheme determines how the verifier identifies itself to wallets. Supported values: "x509_san_dns" (default), "did". When "did", the DID field must be set and /.well-known/did.json is served. | - | x509_san_dns |
No |
did |
string |
Verifier's DID identity (e.g., "did:web:verifier.example.com"). Required when ClientIDScheme is "did". | - | - | No |
preferred_vp_formats |
object |
Informational VP formats and algorithms supported by wallets | - | - | No |
supported_wallets |
object |
Supported wallet configurations | - | - | No |
inbound |
object |
Inbound groups inbound credential verification | - | - | No |
outbound |
object |
Outbound groups outbound identity assertion | - | - | No |
digital_credentials |
object |
W3C Digital Credentials API configuration | - | - | No |
authorization_page_css |
object |
Authorization page styling configuration | - | - | No |
credential_display |
object |
Credential display settings | - | - | No |
trust |
object |
Trust evaluation configuration | - | - | No |
federation |
object |
OpenID Federation entity configuration. When enabled, serves /.well-known/openid-federation as a self-signed JWT. | - | - | No |
presets |
object |
Predefined verification request presets shown in the UI. The map key is the human-readable label (e.g., "PID", "PID + EHIC"). Each preset maps credential_metadata scopes to optional claim overrides. A nil scope value requests all VCTM claims; use claims/exclude_claims to narrow. | "PID":{"pid":null},"PID + EHIC":{"pid":null,"ehic":null} |
- | No |
combined_presentation |
object |
Combined presentation verification (ARF 3.0 §6.6.3.10). When multiple credentials are presented, this verifies they belong to the same holder. | - | - | No |
revocation |
object |
Credential revocation checking at presentation time (ARF 3.0 §6.6.3.7). When enabled, the Verifier checks Token Status List references in presented credentials. | - | - | No |
Path:
.verifier.preferred_vp_formats
Used in client_metadata and Wallet metadata to indicate supported formats and algorithms.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
ldp_vc |
object |
Configuration for W3C VC Data Integrity format (ldp_vc) | - | - | No |
jwt_vc_json |
object |
Configuration for JWT-based W3C VC format (jwt_vc_json) | - | - | No |
dc+sd-jwt |
object |
Configuration for SD-JWT VC format (dc+sd-jwt) | - | - | No |
mso_mdoc |
object |
Configuration for ISO mdoc format (mso_mdoc) | - | - | No |
Path:
.verifier.preferred_vp_formats.ldp_vc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
proof_type_values |
[]string |
Non-empty array containing identifiers of proof types supported. If present, the proof type of the presented VC/VP MUST match one of the array values. | ["DataIntegrityProof", "Ed25519Signature2020"] |
- | No |
cryptosuite_values |
[]string |
Non-empty array containing identifiers of crypto suites supported. Used when one of the algorithms in ProofTypeValues supports multiple crypto suites. | ["ecdsa-rdfc-2019", "ecdsa-sd-2023", "eddsa-rdfc-2022", "bbs-2023"] |
- | No |
Path:
.verifier.preferred_vp_formats.jwt_vc_json
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
alg_values |
[]string |
Non-empty array containing identifiers of cryptographic algorithms supported. If present, the alg JOSE header of the presented VC/VP MUST match one of the array values. | - | - | No |
Path:
.verifier.preferred_vp_formats.dc+sd-jwt
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
sd-jwt_alg_values |
[]string |
Non-empty array containing cryptographic algorithm identifiers supported for the Issuer-signed JWT of an SD-JWT. | - | - | No |
kb-jwt_alg_values |
[]string |
Non-empty array containing cryptographic algorithm identifiers supported for a Key Binding JWT (KB-JWT). | - | - | No |
Path:
.verifier.preferred_vp_formats.mso_mdoc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
issuerauth_alg_values |
[]int |
Non-empty array containing cryptographic algorithm identifiers supported for IssuerAuth COSE signatures. | - | - | No |
deviceauth_alg_values |
[]int |
Non-empty array containing cryptographic algorithm identifiers supported for DeviceAuth COSE signatures or MACs. | - | - | No |
Path:
.verifier.inbound
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
openid4vp |
object |
OpenID4VP configuration for accepting wallet presentations | - | - | Yes |
Path:
.verifier.inbound.openid4vp
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
presentation_timeout |
int |
Presentation timeout in seconds | - | 300 |
No |
supported_credentials |
array |
Supported credential configurations | - | - | Yes |
presentation_requests_dir |
string |
Optional directory with presentation request templates | - | - | No |
token_endpoint |
string |
OAuth2 token endpoint URL used for VP token exchange | "https://verifier.sunet.se/token" |
- | Yes |
clients |
object |
OAuth2 client configurations for RP interactions | - | - | Yes |
Path:
.verifier.inbound.openid4vp.supported_credentials[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
vct |
string |
Verifiable credential type | "urn:eudi:pid:1" |
- | Yes |
scopes |
[]string |
OIDC scopes that grant access to this credential | - | - | Yes |
Path:
.verifier.outbound
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
oidc_provider |
object |
OIDC Provider configuration for asserting verified identity to downstream RPs | - | - | No |
Path:
.verifier.outbound.oidc_provider
This configures how the verifier issues ID tokens and access tokens to relying parties. Note: This is NOT related to verifiable credential issuance (see IssuerConfig for VC issuance). The signing key is shared from the parent Verifier.KeyConfig.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
issuer |
string |
OIDC Provider identifier that appears in ID tokens and discovery metadata. This identifies the verifier as an OpenID Provider. Must match the 'iss' claim in all issued ID tokens. | "https://verifier.sunet.se" |
- | Yes |
session_duration |
int |
Session duration in seconds | - | 3600 |
No |
code_duration |
int |
Authorization code duration in seconds | - | 300 |
No |
access_token_duration |
int |
Access token duration in seconds | - | 3600 |
No |
id_token_duration |
int |
ID token duration in seconds | - | 3600 |
No |
refresh_token_duration |
int |
Refresh token duration in seconds | - | 86400 |
No |
subject_type |
string |
Subject type: "public" or "pairwise" | - | - | Yes |
subject_salt |
string |
Salt for pairwise subject generation | - | - | Yes |
enable_userinfo |
bool |
Whether the verifier-OP advertises a userinfo_endpoint in its discovery metadata and issues JWT access tokens (RFC 9068 at+jwt). When true (default), the OP advertises userinfo_endpoint in discovery and returns an access token alongside the ID token. The userinfo endpoint is stateless: it validates the JWT signature and returns the embedded claims. When false, only ID tokens are returned — no access_token or userinfo endpoint. | - | true |
No |
static_clients |
array |
List of pre-configured OIDC clients These clients are checked in addition to dynamically registered clients | - | - | No |
Path:
.verifier.outbound.oidc_provider.static_clients[]
Static clients are configured in YAML and do not require dynamic registration. These clients are checked in addition to dynamically registered clients stored in the database.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
client_id |
string |
Unique identifier for the client | - | - | Yes |
client_secret |
string |
Client secret for authentication. Can be defined in the secrets file under verifier.oidc_op.static_clients as a map of client_id to client_secret. Required unless TokenEndpointAuthMethod is "none" (public client). | - | - | No |
redirect_uris |
[]string |
List of allowed redirect URIs for this client | - | - | Yes |
allowed_scopes |
[]string |
List of scopes this client is allowed to request. If empty, defaults to standard OIDC scopes (openid, profile, email, address, phone). | - | - | No |
token_endpoint_auth_method |
string |
Authentication method for the token endpoint. Supported values: client_secret_basic, client_secret_post, none (public client) Default: "client_secret_basic" | - | client_secret_basic |
No |
grant_types |
[]string |
List of allowed grant types. Supported values: authorization_code, refresh_token Default: ["authorization_code"] | - | ["authorization_code"] |
No |
response_types |
[]string |
List of allowed response types. Supported values: code Default: ["code"] | - | ["code"] |
No |
client_name |
string |
Optional human-readable name for the client | - | - | No |
Path:
.verifier.digital_credentials
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
W3C Digital Credentials API support in browser | - | false |
No |
use_jar |
bool |
JWT Authorization Request (JAR) for wallet communication When true, request objects are signed JWTs instead of plain JSON | - | false |
No |
preferred_formats |
[]string |
The order of preference for credential formats Supported values: "vc+sd-jwt", "dc+sd-jwt", "mso_mdoc" Default: ["vc+sd-jwt", "dc+sd-jwt", "mso_mdoc"] | - | ["vc+sd-jwt", "dc+sd-jwt", "mso_mdoc"] |
No |
response_mode |
string |
The OpenID4VP response mode for DC API flows Supported values: "dc_api.jwt" (encrypted), "direct_post.jwt" (signed), "direct_post" Default: "dc_api.jwt" | - | dc_api.jwt |
No |
allow_qr_fallback |
bool |
Automatic fallback to QR code if DC API is unavailable Default: true | - | true |
No |
deep_link_scheme |
string |
DeepLinkScheme for mobile wallet integration | "eudi-wallet://" |
- | No |
Path:
.verifier.authorization_page_css
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
custom_css |
string |
Inline CSS that will be injected into the authorization page Allows deployers to override default styling without modifying templates | - | - | No |
css_file |
string |
Path to an external CSS file to include If both CustomCSS and CSSFile are provided, both are included | - | - | No |
theme |
string |
Predefined color scheme: "light" (default), "dark", "blue", "purple" | - | light |
No |
primary_color |
string |
PrimaryColor overrides the primary brand color | "#667eea" |
- | No |
secondary_color |
string |
SecondaryColor overrides the secondary brand color | "#764ba2" |
- | No |
logo_url |
string |
A URL to a custom logo image | - | - | No |
title |
string |
Title overrides the page title (default: "Wallet Authorization") | - | - | No |
subtitle |
string |
Subtitle overrides the page subtitle | - | - | No |
Path:
.verifier.credential_display
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
Users to optionally view credential details before completing authorization When enabled, a checkbox appears on the authorization page | - | false |
No |
require_confirmation |
bool |
Users to review credentials before proceeding When true, the credential display step is mandatory (checkbox is pre-checked and disabled) | - | false |
No |
show_raw_credential |
bool |
The raw VP token/credential in the display page Useful for debugging and technical users | - | false |
No |
show_claims |
bool |
The parsed claims that will be sent to the RP Recommended for transparency and user consent | - | true |
No |
allow_edit |
bool |
Users to redact certain claims before sending to RP (future feature) Currently not implemented | - | false |
No |
Path:
.verifier.presets.<preset label>.<scope>
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
claims |
array |
Specific claims to request. If empty, all VCTM claims are used. | - | - | No |
exclude_claims |
array |
Claims to exclude from the DCQL query. | - | - | No |
validations |
array |
Optional rules applied server-side after claims extraction | - | - | No |
Path:
.verifier.presets.<preset label>.<scope>.claims[],.verifier.presets.<preset label>.<scope>.exclude_claims[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
path |
[]string |
Claim path segments | ["birthdate"], ["address", "locality"] |
- | Yes |
Path:
.verifier.presets.<preset label>.<scope>.validations[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
rule |
string |
Validation rule to apply, e.g., "age_over". | "age_over" |
- | Yes |
path |
[]string |
Claim path to validate, e.g., ["birthdate"]. | ["birthdate"] |
- | Yes |
value |
object |
Threshold or expected value for the validation. | 18 |
- | Yes |
Path:
.verifier.combined_presentation
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enabled |
bool |
Enabled activates combined presentation binding verification. | - | - | No |
enforcement |
string (enforce|warn|disabled) |
Enforcement determines how binding verification results are handled: - "enforce": reject the presentation if binding cannot be established - "warn": log a warning but allow the presentation through (per ARF 3.0 ACP_08) - "disabled": skip binding verification entirely | - | warn |
No |
binding_attributes |
array |
Attribute-based binding checks. | - | - | No |
key_binding_enabled |
bool |
KeyBindingEnabled activates key-based binding (cnf.jwk / device key comparison). Cross-format comparison (SD-JWT cnf.jwk vs mDoc device key) is always supported since both are converted to RFC 7638 JWK thumbprints. | - | - | No |
Path:
.verifier.combined_presentation.binding_attributes[]
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
paths |
[]string |
Claim paths that must ALL match across credentials (AND semantics). | ["family_name", "birth_date", "place_of_birth.locality"] |
- | Yes |
Path:
.verifier.revocation
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enabled |
bool |
Enabled activates revocation status checking for presented credentials. | - | - | No |
cache_ttl |
int |
Duration in seconds to cache fetched status list tokens. | - | 300 |
No |
fail_open |
bool |
FailOpen determines behavior when the status list is unreachable or unparseable: - true: log warning and allow the credential through (fail-open) - false: reject the credential (fail-closed) | - | true |
No |
skip_scopes |
[]string |
Credential scopes exempt from revocation checking (e.g., short-lived credentials valid < 24 hours per ARF 3.0 §6.6.3.7). | - | - | No |
Configuration for the Registry service that manages credential status.
Path:
.registry
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_server |
object |
HTTP API server configuration | - | - | Yes |
public_url |
string |
Public URL of this service (must be valid HTTP/HTTPS URL) | "https://registry.sunet.se" |
- | Yes |
grpc_server |
object |
GRPC server configuration | - | - | Yes |
token_status_lists |
object |
Token Status List configuration | - | - | Yes |
admin_gui |
object |
Admin GUI configuration | - | - | No |
Path:
.registry.token_status_lists
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
key_config |
object |
Key configuration for signing Token Status List tokens. | - | - | Yes |
token_refresh_interval |
int64 |
How often (in seconds) new Token Status List tokens are generated. Default: 43200 (12 hours). Min: 301 (>5 minutes), Max: 86400 (24 hours) | - | 43200 |
No |
section_size |
int64 |
Number of entries (decoys) per section. Default: 1000000 (1 million) | - | 1000000 |
No |
rate_limit_requests_per_minute |
int |
Maximum requests per minute per IP for token status list endpoints. Default: 60 | - | 60 |
No |
Path:
.registry.admin_gui
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
enable |
bool |
The admin GUI | - | false |
No |
username |
string |
Admin username | - | admin |
Yes (if enabled) |
password |
string |
Admin password | - | - | Yes (if enabled) |
The structure of the separate secrets file.
Path:
(root)
When Common.SecretFilePath is set, ApplySecrets merges these values into the main config: the Mongo URI is only used when the main config has none. For each service section (apigw, registry, verifier) that is present in the secrets file, the corresponding secret fields in the main config are cleared and replaced by the secrets-file values. Sections omitted from the secrets file are left untouched.
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
common |
object |
Common | - | - | No |
apigw |
object |
APIGW | - | - | No |
registry |
object |
Registry | - | - | No |
verifier |
object |
Verifier | - | - | No |
Path:
.common
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
mongo |
object |
Mongo | - | - | No |
Path:
.common.mongo
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
uri |
string |
MongoDB connection string, which may include authentication credentials | - | - | No |
Path:
.apigw
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_server |
object |
API Server | - | - | No |
auth_providers |
object |
Auth Providers | - | - | No |
Path:
.apigw.api_server
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
api_auth |
object |
API Auth | - | - | No |
Path:
.apigw.api_server.api_auth
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
oidc |
object |
OIDC | - | - | No |
Path:
.apigw.api_server.api_auth.oidc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
client_secret |
string |
OAuth2 client secret for the OIDC provider | - | - | No |
Path:
.apigw.auth_providers
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
oidc |
object |
OIDC | - | - | No |
Path:
.apigw.auth_providers.oidc
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
registration |
object |
Registration | - | - | No |
Path:
.apigw.auth_providers.oidc.registration
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
preconfigured |
object |
Preconfigured | - | - | No |
dynamic |
object |
Dynamic | - | - | No |
Path:
.apigw.auth_providers.oidc.registration.preconfigured
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
client_secret |
string |
Shared secret for the pre-configured OIDC RP client | - | - | No |
Path:
.apigw.auth_providers.oidc.registration.dynamic
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
initial_access_token |
string |
Bearer token required by the OP for dynamic client registration | - | - | No |
Path:
.registry
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
admin_gui |
object |
Admin GUI | - | - | No |
Path:
.registry.admin_gui
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
password |
string |
Admin GUI login password | - | - | No |
Path:
.verifier
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
outbound |
object |
Outbound | - | - | No |
Path:
.verifier.outbound
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
oidc_provider |
object |
OIDC Provider | - | - | No |
Path:
.verifier.outbound.oidc_provider
| Field | Type | Description | Example | Default | Required |
|---|---|---|---|---|---|
subject_salt |
string |
Secret value used to derive pairwise subject identifiers for OIDC clients | - | - | No |
static_clients |
object |
Client_id to client_secret for static OIDC clients. Only clients listed here will have their secrets applied; clients not present in this map keep whatever value the main config provides (which will be empty after ApplySecrets clears them). | <client_id>: "<client_secret>" |
- | No |
Path:
file referenced by .common.secret_file_path
common:
mongo:
uri: "mongodb://user:password@mongo:27017/vc"
apigw:
api_server:
api_auth:
oidc:
client_secret: "your-oidc-client-secret"
auth_providers:
oidc:
registration:
preconfigured:
client_secret: "your-oidc-client-secret"
dynamic:
initial_access_token: "<secret-value>"
registry:
admin_gui:
password: "change-me-in-production"
verifier:
outbound:
oidc_provider:
subject_salt: "random-salt-for-pairwise-subjects"
static_clients:
<client_id>: "<client_secret>"