Skip to main content

Pinned to release v0.10.0. For the current default branch, see Wallet Backend Configuration Reference.

Configuration Reference

This document describes all configuration options for go-wallet-backend. Configuration is loaded from a YAML file and can be overridden by environment variables.

Environment variables use the prefix WALLET_ for the main backend and REGISTRY_ for the registry server.

Table of Contents


server

Environment prefix: WALLET_SERVER

YAML KeyEnv VariableTypeDescription
server.hostWALLET_SERVER_HOSTstring
server.portWALLET_SERVER_PORTinteger
server.admin_hostWALLET_SERVER_ADMIN_HOSTstringAdmin API bind address (defaults to Host)
server.admin_portWALLET_SERVER_ADMIN_PORTintegerInternal admin API port (0 to disable)
server.engine_hostWALLET_SERVER_ENGINE_HOSTstringWebSocket engine bind address (defaults to Host)
server.engine_portWALLET_SERVER_ENGINE_PORTintegerWebSocket engine port (defaults to Port if 0)
server.registry_hostWALLET_SERVER_REGISTRY_HOSTstringRegistry bind address (defaults to Host)
server.registry_portWALLET_SERVER_REGISTRY_PORTintegerVCTM registry port (defaults to 8097)
server.wp_hostWALLET_SERVER_WP_HOSTstringWallet-provider bind address (defaults to Host)
server.wp_portWALLET_SERVER_WP_PORTintegerWallet-provider port (0 = co-hosted with backend)
server.admin_tokenWALLET_SERVER_ADMIN_TOKENstringBearer token for admin API (auto-generated if empty)
server.admin_token_pathWALLET_SERVER_ADMIN_TOKEN_PATHstringPath to file containing admin token
server.rp_idWALLET_SERVER_RP_IDstring
server.rp_originWALLET_SERVER_RP_ORIGINstringRPOrigin is the legacy single-origin setting. Kept for backward compatibility. New deployments should use RPOrigins. When both are set, RPOrigin is prepended.
server.rp_originsWALLET_SERVER_RP_ORIGINSstring list
server.rp_nameWALLET_SERVER_RP_NAMEstring
server.base_urlWALLET_SERVER_BASE_URLstring
server.cors.allowed_originsWALLET_SERVER_CORS_ALLOWED_ORIGINSstring listAllowedOrigins is a list of origins that may access the resource. Use "*" to allow all origins (default for development).
server.cors.allowed_methodsWALLET_SERVER_CORS_ALLOWED_METHODSstring listAllowedMethods is a list of HTTP methods allowed for cross-origin requests.
server.cors.allowed_headersWALLET_SERVER_CORS_ALLOWED_HEADERSstring listAllowedHeaders is a list of request headers allowed in cross-origin requests.
server.cors.exposed_headersWALLET_SERVER_CORS_EXPOSED_HEADERSstring listExposedHeaders is a list of headers that browsers are allowed to access.
server.cors.allow_credentialsWALLET_SERVER_CORS_ALLOW_CREDENTIALSbooleanAllowCredentials indicates whether the request can include credentials. Cannot be true when AllowedOrigins is "*".
server.cors.max_ageWALLET_SERVER_CORS_MAX_AGEintegerMaxAge indicates how long (in seconds) the results of a preflight request can be cached.
server.external_urls.backend_urlWALLET_SERVER_EXTERNAL_URLS_BACKEND_URLstringBackendURL is the external URL for the backend service (for engine → backend calls)
server.external_urls.engine_urlWALLET_SERVER_EXTERNAL_URLS_ENGINE_URLstringEngineURL is the external URL for the engine service (for WebSocket connections)
server.external_urls.registry_urlWALLET_SERVER_EXTERNAL_URLS_REGISTRY_URLstringRegistryURL is the external URL for the registry service (for VCTM lookups)
server.external_urls.admin_urlWALLET_SERVER_EXTERNAL_URLS_ADMIN_URLstringAdminURL is the external URL for the admin API (for inter-service admin calls)
server.served_by_headerWALLET_SERVER_SERVED_BY_HEADERstringServedByHeader sets the X-Served-By response header value. If nil (not configured), defaults to the system hostname. If set to empty string, the header is disabled.
server.tls.enabledWALLET_SERVER_TLS_ENABLEDbooleanEnabled enables TLS for the HTTP listeners
server.tls.cert_fileWALLET_SERVER_TLS_CERT_FILEstringCertFile is the path to the TLS certificate file
server.tls.key_fileWALLET_SERVER_TLS_KEY_FILEstringKeyFile is the path to the TLS private key file
server.tls.min_versionWALLET_SERVER_TLS_MIN_VERSIONstringMinVersion is the minimum TLS version (tls12 or tls13, default: tls12)
server.admin_tls.enabledWALLET_SERVER_ADMIN_TLS_ENABLEDbooleanEnabled enables TLS for the HTTP listeners
server.admin_tls.cert_fileWALLET_SERVER_ADMIN_TLS_CERT_FILEstringCertFile is the path to the TLS certificate file
server.admin_tls.key_fileWALLET_SERVER_ADMIN_TLS_KEY_FILEstringKeyFile is the path to the TLS private key file
server.admin_tls.min_versionWALLET_SERVER_ADMIN_TLS_MIN_VERSIONstringMinVersion is the minimum TLS version (tls12 or tls13, default: tls12)

storage

Environment prefix: WALLET_STORAGE

YAML KeyEnv VariableTypeDescription
storage.typeWALLET_STORAGE_TYPEstringmemory, sqlite, mongodb
storage.sqlite.pathWALLET_STORAGE_SQLITE_DB_PATHstring
storage.mongodb.uriWALLET_STORAGE_MONGODB_URIstring
storage.mongodb.databaseWALLET_STORAGE_MONGODB_DATABASEstring
storage.mongodb.timeoutWALLET_STORAGE_MONGODB_TIMEOUTintegerseconds
storage.mongodb.password_pathWALLET_STORAGE_MONGODB_PASSWORD_PATHstringPath to file containing MongoDB password
storage.mongodb.tls_enabledWALLET_STORAGE_MONGODB_TLS_ENABLEDbooleanTLS/mTLS configuration
storage.mongodb.ca_pathWALLET_STORAGE_MONGODB_CA_PATHstringPath to CA certificate for server verification
storage.mongodb.cert_pathWALLET_STORAGE_MONGODB_CERT_PATHstringPath to client certificate for mTLS
storage.mongodb.key_pathWALLET_STORAGE_MONGODB_KEY_PATHstringPath to client key for mTLS

logging

Environment prefix: WALLET_LOGGING

YAML KeyEnv VariableTypeDescription
logging.levelWALLET_LOGGING_LEVELstringdebug, info, warn, error
logging.formatWALLET_LOGGING_FORMATstringjson, text

jwt

Environment prefix: WALLET_JWT

YAML KeyEnv VariableTypeDescription
jwt.secretWALLET_JWT_SECRETstring
jwt.secret_pathWALLET_JWT_SECRET_PATHstringPath to file containing JWT secret
jwt.expiry_hoursWALLET_JWT_EXPIRY_HOURSinteger
jwt.refresh_daysWALLET_JWT_REFRESH_DAYSinteger
jwt.issuerWALLET_JWT_ISSUERstring

as

Environment prefix: WALLET_AS

YAML KeyEnv VariableTypeDescription
as.enabledWALLET_AS_ENABLEDbooleanEnabled controls whether the new AS is active.
as.signing_key_pathWALLET_AS_SIGNING_KEY_PATHstringSigningKeyPath is the path to a PEM-encoded private key (ECDSA P-256, P-384, or Ed25519) used to sign access tokens. Mutually exclusive with SigningKeyPKCS11.
as.signing_key_pkcs11WALLET_AS_SIGNING_KEY_PKCS11stringSigningKeyPKCS11 is a PKCS#11 URI for HSM-backed signing. Mutually exclusive with SigningKeyPath.
as.issuerWALLET_AS_ISSUERstringIssuer is the value of the "iss" claim in issued access tokens. Defaults to JWT.Issuer if not set.
as.default_token_ttlWALLET_AS_DEFAULT_TOKEN_TTLdurationDefaultTokenTTL is the default access token lifetime. Default: 2m
as.audience_ttlsWALLET_AS_AUDIENCE_TTLSmap[string]time.DurationAudienceTTLs allows per-audience TTL overrides. Keys are audience strings, values are durations.
as.audiencesWALLET_AS_AUDIENCESstring listAudiences lists the accepted audience values for token validation. Tokens must contain at least one of these in their "aud" claim. When empty, audience validation is skipped. Documented values: "wallet-backend", "wallet-engine", "wallet-registry".
as.rules_dirWALLET_AS_RULES_DIRstringRulesDir is the path to a directory containing SPOCP policy rule files.
as.session_ttlWALLET_AS_SESSION_TTLdurationSessionTTL is the maximum session lifetime before re-authentication. Default: 24h
as.default_max_tacWALLET_AS_DEFAULT_MAX_TACstringDefaultMaxTAC is the default maximum TAC for sessions created via passkey auth. Admin sessions (e.g. via OIDC) may get a different MaxTAC per policy. Default: "rwl" (read, write, list)
as.legacy.enabledWALLET_AS_LEGACY_ENABLEDbooleanEnabled controls whether legacy HMAC tokens are accepted. Default: true (for backward compatibility)
as.legacy.deprecation_headerWALLET_AS_LEGACY_DEPRECATION_HEADERbooleanDeprecationHeader controls whether Deprecation + Sunset headers are sent on legacy token responses.
as.legacy.sunset_dateWALLET_AS_LEGACY_SUNSET_DATEstringSunsetDate is the date after which legacy tokens will no longer be supported. Used in the Sunset HTTP header. Format: RFC 3339 date (e.g. "2027-10-01T00:00:00Z").
as.external_urlWALLET_AS_EXTERNAL_URLstringExternalURL is the public-facing base URL of the AS (e.g. "https://wallet.example.com"). Used to construct OIDC redirect URIs. Required when OIDC is used.
as.insecure_cookiesWALLET_AS_INSECURE_COOKIESbooleanInsecureCookies disables the __Host- prefix and Secure flag on session cookies. Required for local development over HTTP. NEVER enable in production.

wallet_provider

Environment prefix: WALLET_WALLET_PROVIDER

YAML KeyEnv VariableTypeDescription
wallet_provider.private_key_pathWALLET_WALLET_PROVIDER_PRIVATE_KEY_PATHstring
wallet_provider.certificate_pathWALLET_WALLET_PROVIDER_CERTIFICATE_PATHstring
wallet_provider.ca_cert_pathWALLET_WALLET_PROVIDER_CA_CERT_PATHstring
wallet_provider.pkcs11.module_pathWALLET_WALLET_PROVIDER_PKCS11_MODULE_PATHstring
wallet_provider.pkcs11.slot_idWALLET_WALLET_PROVIDER_PKCS11_SLOT_IDuint
wallet_provider.pkcs11.pinWALLET_WALLET_PROVIDER_PKCS11_PINstring
wallet_provider.pkcs11.pin_pathWALLET_WALLET_PROVIDER_PKCS11_PIN_PATHstringPath to file containing PIN (preferred over inline PIN)
wallet_provider.pkcs11.key_labelWALLET_WALLET_PROVIDER_PKCS11_KEY_LABELstring
wallet_provider.pkcs11.pool_sizeWALLET_WALLET_PROVIDER_PKCS11_POOL_SIZEintegerSession pool size (default 4)
wallet_provider.wia.enabledWALLET_WALLET_PROVIDER_WIA_ENABLEDbooleanEnabled controls whether WIA endpoints are registered
wallet_provider.wia.issuerWALLET_WALLET_PROVIDER_WIA_ISSUERstringIssuer is the iss claim in WIA JWTs. Required when Mode is "ietf" (it's the only way a relying party can locate the JWKS to verify the WIA); unused/omitted when Mode is "etsi".
wallet_provider.wia.modeWALLET_WALLET_PROVIDER_WIA_MODEstringMode selects which WIA trust model this wallet provider issues: - "etsi" (default): the EUDI ARF v3.0 / EC TS03 v1.5.2 / ETSI TS 119 472-3 V1.1.1 model. The WIA always carries the signing certificate chain in the x5c JOSE header; relying parties verify it against the Trusted List for Wallet Providers (ETSI TS 119 472-3 AUTH-REQ-PROC-4.4.3-01 / TOKEN-REQ-PROC-4.5.2-01). No iss or kid is set — TS03 v1.5 explicitly removed iss from the WIA; Wallet Provider identity is inferred solely from the x5c signing certificate. This is the only mode with a defined trust path under the current EUDI/ARF/ETSI specs; use it when interoperating with ARF-conformant PID/EAA Providers. - "ietf": the generic IETF draft-ietf-oauth-attestation-based-client-auth model, with no ARF/ETSI counterpart. The WIA omits x5c and instead carries a kid header plus the iss claim (required); relying parties resolve trust via JWKS discovery at "<issuer>/.well-known/jwks.json" (see RegisterWalletProviderJWKSRoute). Only meaningful for non-EUDI, generic-OAuth ecosystems — an ARF-conformant PID/EAA Provider has no spec-defined way to resolve trust via this path. Note SUNET/vc's parseAttestationIdentity treats x5c as authoritative and iss as a secondary consistency check only when both are present, so "etsi" mode (no iss) and "ietf" mode (no x5c) are both unambiguous to that consumer.
wallet_provider.wia.wallet_provider_uriWALLET_WALLET_PROVIDER_WIA_WALLET_PROVIDER_URIstringWalletProviderURI is the expected aud in WIA-PoP JWTs (wallet provider identifier)
wallet_provider.wia.wallet_nameWALLET_WALLET_PROVIDER_WIA_WALLET_NAMEstringWalletName is the wallet_name claim in WIA JWT. REQUIRED by EC TS03 v1.5.2 §2.3.1 when Mode is "etsi" — Validate() enforces this (defaults to "SIROS ID" so it's populated out of the box).
wallet_provider.wia.wallet_versionWALLET_WALLET_PROVIDER_WIA_WALLET_VERSIONstringWalletVersion is the wallet_version claim. REQUIRED by EC TS03 v1.5.2 §2.3.1 ("Added wallet_version (REQUIRED) to the WIA") when Mode is "etsi" — Validate() enforces this; there is no sensible built-in default (it must reflect this deployment's actual released version).
wallet_provider.wia.wallet_linkWALLET_WALLET_PROVIDER_WIA_WALLET_LINKstringWalletLink is the wallet download/info URI. SHOULD per TS03 §2.3.1; not enforced by Validate().
wallet_provider.wia.certification_infoWALLET_WALLET_PROVIDER_WIA_CERTIFICATIONINFOmap[string]interface{}CertificationInfo is the wallet_solution_certification_information claim. Free-form map included as-is in the WIA JWT. SHALL-required by TS03 §2.3.1 when Mode is "etsi", but TS03 itself notes the certification scheme is not yet finalized ("the exact content of wallet_solution_certification_information is undefined") — Validate() only warns (via the WIA service logger at startup) rather than hard failing, unlike WalletVersion.
wallet_provider.wia.max_expiry_secondsWALLET_WALLET_PROVIDER_WIA_MAX_EXPIRY_SECONDSintegerMaxExpirySeconds is the maximum WIA lifetime in seconds (CS-04 requires < 24h)
wallet_provider.wia.challenge_ttl_secondsWALLET_WALLET_PROVIDER_WIA_CHALLENGE_TTL_SECONDSintegerChallengeTTLSeconds is the lifetime of WIA challenge nonces in seconds
wallet_provider.wia.rate_limit.enabledWALLET_WALLET_PROVIDER_WIA_RATE_LIMIT_ENABLEDbooleanEnabled controls whether rate limiting is active
wallet_provider.wia.rate_limit.max_attemptsWALLET_WALLET_PROVIDER_WIA_RATE_LIMIT_MAX_ATTEMPTSintegerMaxAttempts is the maximum number of login/registration attempts per window Default: 10
wallet_provider.wia.rate_limit.window_secondsWALLET_WALLET_PROVIDER_WIA_RATE_LIMIT_WINDOW_SECONDSintegerWindowSeconds is the time window for rate limiting (in seconds) Default: 60 (1 minute)
wallet_provider.wia.rate_limit.lockout_secondsWALLET_WALLET_PROVIDER_WIA_RATE_LIMIT_LOCKOUT_SECONDSintegerLockoutSeconds is how long to lock out after exceeding the limit Default: 300 (5 minutes)
wallet_provider.attestation.lifetime_secondsWALLET_WALLET_PROVIDER_ATTESTATION_LIFETIME_SECONDSintegerLifetimeSeconds is the WIA lifetime. TS03 v1.5.2 caps this at < 24h (86400); this wallet provider defaults far below that (300s / 5 min) specifically so that WIA lifetime — not revocation-list checking — is the mechanism that bounds exposure from a compromised/revoked wallet instance. See the type-level comment above.
wallet_provider.attestation.ka_expiry_secondsWALLET_WALLET_PROVIDER_ATTESTATION_KA_EXPIRY_SECONDSintegerKAExpirySeconds is the key attestation JWT expiry. Short-lived by default (15s) for single-use credential issuance.
wallet_provider.attestation.native_attestation.enabledWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_ENABLEDbooleanEnabled controls whether native platform attestation is required.
wallet_provider.attestation.native_attestation.apple_app_attest_environmentWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_APPLE_APP_ATTEST_ENVIRONMENTstringAppleAppAttestEnvironment: "production" or "development"
wallet_provider.attestation.native_attestation.apple_app_idWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_APPLE_APP_IDstringAppleAppID is the full App ID (TeamID.BundleID) for Apple App Attest.
wallet_provider.attestation.native_attestation.google_package_nameWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_GOOGLE_PACKAGE_NAMEstringGooglePackageName is the Android package name for Play Integrity.
wallet_provider.attestation.native_attestation.google_play_integrity_decryption_keyWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_GOOGLE_PLAY_INTEGRITY_DECRYPTION_KEYstringGooglePlayIntegrityDecryptionKey is the base64-encoded decryption key. Prefer GooglePlayIntegrityDecryptionKeyPath for production deployments.
wallet_provider.attestation.native_attestation.google_play_integrity_decryption_key_pathWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_GOOGLE_PLAY_INTEGRITY_DECRYPTION_KEY_PATHstringGooglePlayIntegrityDecryptionKeyPath is a path to a file containing the decryption key (preferred over the inline value — same pattern as PKCS11.PINPath / JWT.SecretPath, so this AES key material can be mounted from a secret store instead of living in plain env vars/YAML).
wallet_provider.attestation.native_attestation.google_play_integrity_verification_keyWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_GOOGLE_PLAY_INTEGRITY_VERIFICATION_KEYstringGooglePlayIntegrityVerificationKey is the base64-encoded verification key. Prefer GooglePlayIntegrityVerificationKeyPath for production deployments.
wallet_provider.attestation.native_attestation.google_play_integrity_verification_key_pathWALLET_WALLET_PROVIDER_ATTESTATION_NATIVE_ATTESTATION_GOOGLE_PLAY_INTEGRITY_VERIFICATION_KEY_PATHstringGooglePlayIntegrityVerificationKeyPath is a path to a file containing the verification key (preferred over the inline value).

trust

Environment prefix: WALLET_TRUST

YAML KeyEnv VariableTypeDescription
trust.pdp_urlWALLET_TRUST_PDP_URLstringPDPURL is the URL of the AuthZEN PDP (Policy Decision Point) for trust evaluation. When set, operates in "default deny" mode - trust decisions require PDP approval. When empty, operates in "allow all" mode - requests are always considered trusted.
trust.default_endpointWALLET_TRUST_DEFAULT_ENDPOINTstringDefaultEndpoint is deprecated. Use PDPURL instead. Retained for backward compatibility - if PDPURL is empty and DefaultEndpoint is set, DefaultEndpoint is used. Deprecated: This field will be removed in a future release.
trust.registry_urlWALLET_TRUST_REGISTRY_URLstringRegistryURL is the URL for the VCTM registry service.
trust.timeoutWALLET_TRUST_TIMEOUTintegerTimeout is the HTTP timeout for trust evaluation requests (seconds).
trust.insecure_skip_verifyWALLET_TRUST_INSECURE_SKIP_VERIFYbooleanInsecureSkipVerify disables TLS certificate verification for PDP requests. Use only in development or when the PDP uses a self-signed certificate.
trust.ca_cert_pathWALLET_TRUST_CA_CERT_PATHstringCACertPath is the path to a PEM-encoded CA certificate used to verify the PDP's TLS certificate. Set this when the PDP is signed by an internal/private CA.
trust.issuer.pdp_urlWALLET_TRUST_ISSUER_PDP_URLstringPDPURL overrides the global PDP URL for this specific flow. Empty inherits from global. Set to "none" to explicitly disable trust.
trust.verifier.pdp_urlWALLET_TRUST_VERIFIER_PDP_URLstringPDPURL overrides the global PDP URL for this specific flow. Empty inherits from global. Set to "none" to explicitly disable trust.

session_store

Environment prefix: WALLET_SESSION_STORE

YAML KeyEnv VariableTypeDescription
session_store.typeWALLET_SESSION_STORE_TYPEstringType is the session store type: "memory" or "redis"
session_store.redis.addressWALLET_SESSION_STORE_REDIS_ADDRESSstring
session_store.redis.passwordWALLET_SESSION_STORE_REDIS_PASSWORDstring
session_store.redis.dbWALLET_SESSION_STORE_REDIS_DBinteger
session_store.redis.key_prefixWALLET_SESSION_STORE_REDIS_KEY_PREFIXstring
session_store.default_ttl_hoursWALLET_SESSION_STORE_DEFAULT_TTL_HOURSintegerDefaultTTL is the default session TTL in hours

features

Environment prefix: WALLET_FEATURES

YAML KeyEnv VariableTypeDescription
features.proxy_enabledWALLET_FEATURES_PROXY_ENABLEDbooleanProxyEnabled controls whether the /proxy endpoint is available. Set to false to disable the proxy (requires WebSocket engine for flows). Default: true (for backward compatibility)
features.websocket_requiredWALLET_FEATURES_WEBSOCKET_REQUIREDbooleanWebSocketRequired forces WebSocket transport for credential flows. When true, the proxy endpoint will return an error directing clients to use the WebSocket transport instead. Default: false
features.credential_storage_enabledWALLET_FEATURES_CREDENTIAL_STORAGE_ENABLEDbooleanCredentialStorageEnabled controls whether server-side credential storage endpoints (/storage/vc/*) are available. By default, credentials are stored exclusively in the encrypted client-side private_data blob and the server-side storage path is unused. Set to true only if you need backward-compatible server-side credential storage. Default: false (server-side credential storage disabled)

security

Environment prefix: WALLET_SECURITY

YAML KeyEnv VariableTypeDescription
security.auth_rate_limit.enabledWALLET_SECURITY_AUTH_RATE_LIMIT_ENABLEDbooleanEnabled controls whether rate limiting is active
security.auth_rate_limit.max_attemptsWALLET_SECURITY_AUTH_RATE_LIMIT_MAX_ATTEMPTSintegerMaxAttempts is the maximum number of login/registration attempts per window Default: 10
security.auth_rate_limit.window_secondsWALLET_SECURITY_AUTH_RATE_LIMIT_WINDOW_SECONDSintegerWindowSeconds is the time window for rate limiting (in seconds) Default: 60 (1 minute)
security.auth_rate_limit.lockout_secondsWALLET_SECURITY_AUTH_RATE_LIMIT_LOCKOUT_SECONDSintegerLockoutSeconds is how long to lock out after exceeding the limit Default: 300 (5 minutes)
security.aaguid_blacklist.enabledWALLET_SECURITY_AAGUID_BLACKLIST_ENABLEDbooleanEnabled controls whether AAGUID blacklist checking is active
security.aaguid_blacklist.aaguidsWALLET_SECURITY_AAGUID_BLACKLIST_AAGUIDSstring listAAGUIDs is a list of blocked AAGUIDs (hex-encoded UUIDs without dashes) Example: ["00000000000000000000000000000000"] to block zero AAGUID
security.aaguid_blacklist.reject_unknownWALLET_SECURITY_AAGUID_BLACKLIST_REJECT_UNKNOWNbooleanRejectUnknown rejects authenticators with zero/unknown AAGUIDs Default: false (permissive - allows unknown authenticators)
security.challenge_cleanup.enabledWALLET_SECURITY_CHALLENGE_CLEANUP_ENABLEDbooleanEnabled controls whether the cleanup worker runs
security.challenge_cleanup.interval_secondsWALLET_SECURITY_CHALLENGE_CLEANUP_INTERVAL_SECONDSintegerIntervalSeconds is how often to run cleanup (in seconds) Default: 300 (5 minutes)
security.token_blacklist.enabledWALLET_SECURITY_TOKEN_BLACKLIST_ENABLEDbooleanEnabled controls whether token blacklist checking is active
security.token_blacklist.cleanup_interval_secondsWALLET_SECURITY_TOKEN_BLACKLIST_CLEANUP_INTERVAL_SECONDSintegerCleanupIntervalSeconds is how often to clean up expired blacklist entries Default: 3600 (1 hour)
security.webauthn.attestation_conveyanceWALLET_SECURITY_WEBAUTHN_ATTESTATION_CONVEYANCEstringAttestationConveyance controls how the RP requests attestation from authenticators. Valid values: "none", "indirect", "direct", "enterprise" Default: "none" (recommended for most deployments - avoids certificate validation issues) Use "direct" only if you need to verify authenticator makes/models.

http_client

Environment prefix: WALLET_HTTP_CLIENT

YAML KeyEnv VariableTypeDescription
http_client.proxy_urlWALLET_HTTP_CLIENT_PROXY_URLstringProxyURL is the URL of the HTTP proxy for egress requests (e.g., http://proxy:8080)
http_client.timeoutWALLET_HTTP_CLIENT_TIMEOUTintegerTimeout is the timeout for HTTP requests in seconds (default: 30)
http_client.insecure_skip_verifyWALLET_HTTP_CLIENT_INSECURE_SKIP_VERIFYbooleanInsecureSkipVerify disables TLS certificate verification (not recommended for production)
http_client.allow_private_ipsWALLET_HTTP_CLIENT_ALLOW_PRIVATE_IPSbooleanAllowPrivateIPs permits outbound requests to private/internal/loopback/link-local ranges. Required when credential issuers run on Docker, k8s internal networks, or localhost. Default: false (private/loopback/cloud-metadata IPs are blocked by the SSRF DialContext). Set to true when issuers are hosted on internal networks (dev/staging environments). Env: WALLET_HTTP_CLIENT_ALLOW_PRIVATE_IPS
http_client.allow_httpWALLET_HTTP_CLIENT_ALLOW_HTTPbooleanAllowHTTP permits non-TLS (plain HTTP) connections for metadata resolution. Default: false (HTTPS required). Use only for local development. Env: WALLET_HTTP_CLIENT_ALLOW_HTTP

authzen_proxy

Environment prefix: WALLET_AUTHZEN_PROXY

YAML KeyEnv VariableTypeDescription
authzen_proxy.enabledWALLET_AUTHZEN_PROXY_ENABLEDbooleanEnabled controls whether the /v1/evaluate endpoint is available. Default: true (set in defaultConfig)
authzen_proxy.pdp_urlWALLET_AUTHZEN_PROXY_PDP_URLstringPDPURL is the backend PDP URL to proxy requests to. If empty, uses the global trust.pdp_url configuration.
authzen_proxy.timeoutWALLET_AUTHZEN_PROXY_TIMEOUTintegerTimeout is the timeout for PDP requests in seconds. Default: 30
authzen_proxy.rules_fileWALLET_AUTHZEN_PROXY_RULES_FILEstringRulesFile is the path to a SPOCP rules file for query authorization. If empty, default wallet rules are used.
authzen_proxy.allow_resolutionWALLET_AUTHZEN_PROXY_ALLOW_RESOLUTIONbooleanAllowResolution controls whether resolution-only requests are allowed. Resolution requests fetch metadata (DID documents, entity configs) without key validation. Default: true
authzen_proxy.fail_open_on_tenant_lookup_errorWALLET_AUTHZEN_PROXY_FAIL_OPEN_ON_TENANT_LOOKUP_ERRORbooleanFailOpenOnTenantLookupError controls behavior when per-tenant PDP lookup fails. If false (default), tenant lookup errors return an error to the client. If true, falls back to the global PDP URL on lookup errors. Security note: fail-closed (false) prevents bypassing per-tenant security policies.

audit

Environment prefix: WALLET_AUDIT

YAML KeyEnv VariableTypeDescription
audit.enabledWALLET_AUDIT_ENABLEDbooleanEnabled enables SET audit event emission.
audit.issuerWALLET_AUDIT_ISSUERstringIssuer is the iss claim in SET records (e.g. "https://wallet.siros.org").
audit.key_pathWALLET_AUDIT_KEY_PATHstringKeyPath is the path to a PEM-encoded EC private key for signing SET records.
audit.key_idWALLET_AUDIT_KEY_IDstringKeyID is the kid used in SET JWS headers.

Registry Server

The registry server (cmd/registry) has its own configuration file. It serves VCTM (Verifiable Credential Type Metadata) fetched from upstream registries.

Environment prefix: REGISTRY

registry.server

Server configuration

Environment prefix: REGISTRY_SERVER

YAML KeyEnv VariableTypeDescription
server.hostREGISTRY_SERVER_HOSTstring
server.portREGISTRY_SERVER_PORTinteger
server.served_by_headerREGISTRY_SERVER_SERVEDBYHEADERstring
server.tls.enabledREGISTRY_SERVER_TLS_ENABLEDbooleanEnabled enables TLS for the HTTP listeners
server.tls.cert_fileREGISTRY_SERVER_TLS_CERT_FILEstringCertFile is the path to the TLS certificate file
server.tls.key_fileREGISTRY_SERVER_TLS_KEY_FILEstringKeyFile is the path to the TLS private key file
server.tls.min_versionREGISTRY_SERVER_TLS_MIN_VERSIONstringMinVersion is the minimum TLS version (tls12 or tls13, default: tls12)

registry.source

Source is the legacy single-registry source configuration. Use Sources for multi-registry support. If Sources is empty, Source is used.

Environment prefix: REGISTRY_SOURCE

YAML KeyEnv VariableTypeDescription
source.urlREGISTRY_SOURCE_URLstringURL of the upstream registry. The actual endpoint is determined by the Mode setting.
source.modeREGISTRY_SOURCE_MODEstring (ts11 or registry)Mode selects which API endpoint to use: "ts11" (default) or "registry" (all credentials).
source.local_overridesREGISTRY_SOURCE_LOCAL_OVERRIDESstring listLocalOverrides is a list of local file or directory paths containing VCTM JSON files. These are loaded at startup and take priority over entries fetched from the remote registry. Directories are scanned for *.json files. Entries are keyed by their "vct" field.
source.poll_intervalREGISTRY_SOURCE_POLL_INTERVALdurationPollInterval is how often to poll the upstream registry for updates
source.timeoutREGISTRY_SOURCE_TIMEOUTdurationTimeout for HTTP requests to the upstream registry

registry.sources

Sources is an ordered list of remote registry URLs to fetch from. Schemas fetched from later sources in the list overwrite earlier ones, allowing a registry to extend or override another. When non-empty, the Source.URL field is ignored for remote fetching (Source.PollInterval and Source.LocalOverrides remain global settings). (list of entries, each with the fields below)

Environment prefix: REGISTRY_SOURCES

YAML KeyEnv VariableTypeDescription
sources[*].urlREGISTRY_SOURCES_URLstringURL is the base URL of the registry (e.g. "https://registry.siros.org"). The actual endpoint path is determined by the Mode setting. For backward compatibility, if a full path to a specific endpoint is given (e.g. ending in schemas.json or registry.json), it is used as-is regardless of Mode.
sources[*].modeREGISTRY_SOURCES_MODEstring (ts11 or registry)Mode selects which API endpoint to use: "ts11" (default) for only TS11-compliant credentials, or "registry" for all credentials including non-TS11.
sources[*].timeoutREGISTRY_SOURCES_TIMEOUTdurationTimeout for HTTP requests to this source. Zero means no per-source timeout (the shared http.Client timeout applies).

registry.cache

Cache configuration

Environment prefix: REGISTRY_CACHE

YAML KeyEnv VariableTypeDescription
cache.pathREGISTRY_CACHE_PATHstringPath to the cache file (JSON format)
cache.max_ageREGISTRY_CACHE_MAX_AGEdurationMaxAge is the maximum age of cached data before forcing a refresh

registry.dynamic_cache

DynamicCache configuration for on-demand URL fetching

Environment prefix: REGISTRY_DYNAMIC_CACHE

YAML KeyEnv VariableTypeDescription
dynamic_cache.enabledREGISTRY_DYNAMIC_CACHE_ENABLEDbooleanEnabled controls whether dynamic URL fetching is active
dynamic_cache.default_ttlREGISTRY_DYNAMIC_CACHE_DEFAULT_TTLdurationDefaultTTL is the default cache TTL for dynamically fetched VCTMs when no HTTP cache headers are present
dynamic_cache.max_ttlREGISTRY_DYNAMIC_CACHE_MAX_TTLdurationMaxTTL is the maximum cache TTL to respect from HTTP headers Values larger than this will be capped
dynamic_cache.min_ttlREGISTRY_DYNAMIC_CACHE_MIN_TTLdurationMinTTL is the minimum cache TTL; shorter values from HTTP headers will be bumped up to this value
dynamic_cache.timeoutREGISTRY_DYNAMIC_CACHE_TIMEOUTdurationTimeout for HTTP requests when fetching VCTMs dynamically
dynamic_cache.allowed_hostsREGISTRY_DYNAMIC_CACHE_ALLOWED_HOSTSstring listAllowedHosts is an optional list of host patterns (regexps) that are allowed for dynamic fetching. If empty, all HTTPS hosts are allowed.

registry.image_embed

ImageEmbed configuration for embedding images as data URIs

Environment prefix: REGISTRY_IMAGE_EMBED

YAML KeyEnv VariableTypeDescription
image_embed.enabledREGISTRY_IMAGE_EMBED_ENABLEDbooleanEnabled controls whether image embedding is active
image_embed.max_image_sizeREGISTRY_IMAGE_EMBED_MAX_IMAGE_SIZEintegerMaxImageSize is the maximum size in bytes for images to embed Images larger than this will be left as URLs
image_embed.timeoutREGISTRY_IMAGE_EMBED_TIMEOUTdurationTimeout for fetching individual images
image_embed.concurrent_fetchesREGISTRY_IMAGE_EMBED_CONCURRENT_FETCHESintegerConcurrentFetches is the maximum number of concurrent image fetches

registry.filter

Filter configuration for include/exclude patterns

Environment prefix: REGISTRY_FILTER

YAML KeyEnv VariableTypeDescription
filter.include_patternsREGISTRY_FILTER_INCLUDE_PATTERNSstring listIncludePatterns are regexps that VCT IDs must match to be included If empty, all VCT IDs are included (unless excluded)
filter.exclude_patternsREGISTRY_FILTER_EXCLUDE_PATTERNSstring listExcludePatterns are regexps that cause VCT IDs to be excluded

registry.rate_limit

Rate limiting configuration

Environment prefix: REGISTRY_RATE_LIMIT

YAML KeyEnv VariableTypeDescription
rate_limit.enabledREGISTRY_RATE_LIMIT_ENABLEDbooleanEnabled controls whether rate limiting is active
rate_limit.authenticated_rpmREGISTRY_RATE_LIMIT_AUTHENTICATED_RPMintegerAuthenticatedRPM is requests per minute for authenticated clients
rate_limit.unauthenticated_rpmREGISTRY_RATE_LIMIT_UNAUTHENTICATED_RPMintegerUnauthenticatedRPM is requests per minute for unauthenticated clients
rate_limit.burst_multiplierREGISTRY_RATE_LIMIT_BURST_MULTIPLIERintegerBurstMultiplier allows bursts of this multiple of the rate limit

registry.jwt

JWT configuration for authentication

Environment prefix: REGISTRY_JWT

YAML KeyEnv VariableTypeDescription
jwt.secretREGISTRY_JWT_SECRETstringSecret is the shared secret for validating JWT signatures (HMAC)
jwt.secret_pathREGISTRY_JWT_SECRET_PATHstringSecretPath is an alternative to Secret: path to a file containing the JWT secret. If both Secret and SecretPath are set, SecretPath takes precedence.
jwt.issuerREGISTRY_JWT_ISSUERstringIssuer is the expected issuer claim in the JWT
jwt.require_authREGISTRY_JWT_REQUIRE_AUTHbooleanRequireAuth requires authentication for all requests (if false, unauthenticated access is allowed)

registry.logging

Logging configuration

Environment prefix: REGISTRY_LOGGING

YAML KeyEnv VariableTypeDescription
logging.levelREGISTRY_LOGGING_LEVELstringdebug, info, warn, error
logging.formatREGISTRY_LOGGING_FORMATstringjson, text

registry.http_client

HTTPClient configuration for outbound requests (proxy, TLS settings)

Environment prefix: REGISTRY_HTTP_CLIENT

YAML KeyEnv VariableTypeDescription
http_client.proxy_urlREGISTRY_HTTP_CLIENT_PROXY_URLstringProxyURL is the URL of the HTTP proxy for egress requests (e.g., http://proxy:8080)
http_client.timeoutREGISTRY_HTTP_CLIENT_TIMEOUTintegerTimeout is the timeout for HTTP requests in seconds (default: 30)
http_client.insecure_skip_verifyREGISTRY_HTTP_CLIENT_INSECURE_SKIP_VERIFYbooleanInsecureSkipVerify disables TLS certificate verification (not recommended for production)
http_client.allow_private_ipsREGISTRY_HTTP_CLIENT_ALLOW_PRIVATE_IPSbooleanAllowPrivateIPs permits outbound requests to private/internal/loopback/link-local ranges. Required when credential issuers run on Docker, k8s internal networks, or localhost. Default: false (private/loopback/cloud-metadata IPs are blocked by the SSRF DialContext). Set to true when issuers are hosted on internal networks (dev/staging environments). Env: WALLET_HTTP_CLIENT_ALLOW_PRIVATE_IPS
http_client.allow_httpREGISTRY_HTTP_CLIENT_ALLOW_HTTPbooleanAllowHTTP permits non-TLS (plain HTTP) connections for metadata resolution. Default: false (HTTPS required). Use only for local development. Env: WALLET_HTTP_CLIENT_ALLOW_HTTP