Skip to main content

Configuration

Each component is configured independently. This page documents the key settings for deploying on your own origin.

Wallet Frontend​

The frontend is configured entirely through environment variables passed to the Docker container. These are injected into the served HTML at container startup — no rebuild required.

Required Variables​

VariableExampleDescription
WALLET_BACKEND_URLhttps://wallet.example.com/apiURL of the wallet backend REST API
WEBAUTHN_RPIDwallet.example.comWebAuthn Relying Party ID — must match your domain
STATIC_PUBLIC_URLhttps://wallet.example.comPublic URL of this wallet instance
STATIC_NAMEMy Org WalletDisplay name shown in the wallet UI

Transport Configuration​

VariableDefaultDescription
WALLET_ENGINE_URLSame as WALLET_BACKEND_URLWebSocket engine URL (set if running engine on a separate host)
WS_URL/api/v2/wallet on the origin of WALLET_ENGINE_URL (ws(s)://)Explicit WebSocket URL override
ALLOWED_TRANSPORTSwebsocketComma-separated list of enabled OID4VCI/VP transports. Accepted values: websocket, direct (anything else is ignored)
TRANSPORT_PREFERENCEwebsocket,directTransport priority order (first allowed transport wins)
WebSocket path

The frontend always connects to the absolute path /api/v2/wallet on the engine origin. Any path component in WALLET_ENGINE_URL or WALLET_BACKEND_URL is discarded when deriving WS_URL, so a reverse proxy must route /api/v2/wallet to the engine port (8082). See Docker Compose.

Protocol Settings​

VariableDefaultDescription
OPENID4VCI_REDIRECT_URI—OID4VCI redirect URI for authorization code flows
OPENID4VCI_PROOF_TYPE_PRECEDENCEjwtProof type preference order (for example attestation,jwt)
OPENID4VP_SAN_DNS_CHECK—Enable SAN DNS verification for OID4VP verifier certificates
OPENID4VP_SAN_DNS_CHECK_SSL_CERTS—Enable SSL certificate SAN validation
DID_KEY_VERSIONjwk_jcs-pubDID key format

Trust and Registry​

VariableDefaultDescription
DELEGATE_TRUST_TO_BACKENDtrueDelegate trust evaluation to the backend's AuthZEN proxy. Setting false (local certificate pinning) is only honoured in development builds; production builds force true
VCT_REGISTRY_URL—URL of the VCTM registry for credential type metadata

Privacy (OHTTP)​

VariableDescription
OHTTP_KEY_CONFIGOblivious HTTP key configuration endpoint
OHTTP_RELAYOHTTP relay endpoint for privacy-preserving metadata fetches

UI and Branding​

VariableDefaultDescription
I18N_WALLET_NAME_OVERRIDE—Override wallet name in all translations
MULTI_LANGUAGE_DISPLAY—Enable language selector
SHOW_PWA_INSTALL_PROMPT—Prompt users to install as PWA on login page
POLICY_LINKS—Terms of service and policy links (LABEL::URL,LABEL::URL)
LOG_LEVEL—Frontend log level

Mobile App Association​

VariableDescription
WELLKNOWN_APPLE_APPIDSApple app association for iOS deep linking
WELLKNOWN_ANDROID_PACKAGE_NAMES_AND_FINGERPRINTSAndroid asset links for app deep linking

Nginx Security Headers​

VariableDefaultDescription
NGINX_SEC_HEADER_FILE—Custom security headers file
NGINX_CSP_ENFORCE_RESOURCE_HTTPS—Enforce HTTPS in Content-Security-Policy
NGINX_ENABLE_HSTS—Enable HTTP Strict Transport Security

Wallet Backend​

The backend is configured via a YAML config file and/or environment variables with the prefix WALLET_. Environment variables override config file values.

Server​

Env VarConfig KeyDefaultDescription
WALLET_SERVER_HOSTserver.host0.0.0.0Bind address
WALLET_SERVER_PORTserver.port8080HTTP API port
WALLET_SERVER_BASE_URLserver.base_url—Public base URL of the backend
WALLET_SERVER_RP_IDserver.rp_idlocalhostWebAuthn Relying Party ID — must match frontend's WEBAUTHN_RPID
WALLET_SERVER_RP_ORIGINserver.rp_originhttp://localhost:8080WebAuthn RP origin — must match the user-facing origin. For several origins use server.rp_origins (list); rp_origin is the legacy single-value form
WALLET_SERVER_ENGINE_PORTserver.engine_port8082WebSocket engine port
WALLET_SERVER_ADMIN_PORTserver.admin_port8081Admin API port
WALLET_SERVER_ADMIN_TOKENserver.admin_token—Bearer token for admin API access
WALLET_SERVER_ADMIN_TOKEN_PATHserver.admin_token_path—Load the admin token from a file
WALLET_SERVER_TRUSTED_PROXIESserver.trusted_proxiestrusts every peerComma-separated IPs/CIDRs of reverse proxies whose X-Forwarded-For is trusted, or none. Per-IP rate limits depend on it; the backend logs a warning when it is unset
WALLET_SERVER_ENGINE_WS_PING_INTERVALserver.engine_ws_ping_interval3sWebSocket ping interval for the engine
WALLET_SERVER_ENGINE_WS_PONG_TIMEOUTserver.engine_ws_pong_timeout5sHow long to wait for a pong before dropping the connection
Admin token

When no admin token is configured, a random token is generated and only a prefix is logged at debug level, so the admin API is effectively unusable. If ENVIRONMENT, GO_ENV or APP_ENV is set to production, the admin server refuses to start without server.admin_token or server.admin_token_path. Always set one explicitly.

CORS is configured under server.cors.*; the default allowed_origins is * (development default), so restrict it in production.

Storage​

Env VarConfig KeyDefaultDescription
WALLET_STORAGE_TYPEstorage.typememoryStorage backend: memory, mongodb
WALLET_STORAGE_MONGODB_URIstorage.mongodb.urimongodb://localhost:27017MongoDB connection string
WALLET_STORAGE_MONGODB_DATABASEstorage.mongodb.databasewalletMongoDB database name

For production, always use mongodb. The memory backend is for development only.

MongoDB Password from File

For Kubernetes deployments, use storage.mongodb.password_path to load the password from a mounted secret file rather than embedding it in the connection string.

Authentication​

Env VarConfig KeyDefaultDescription
WALLET_JWT_SECRETjwt.secret—JWT signing secret — required, at least 32 bytes; the backend refuses to start otherwise
WALLET_JWT_SECRET_PATHjwt.secret_path—Load JWT secret from file

Trust​

Env VarConfig KeyDefaultDescription
WALLET_TRUST_PDP_URLtrust.pdp_url—URL of the go-trust AuthZEN PDP (e.g., http://go-trust:6001). Required for production. Per-flow overrides: trust.issuer.pdp_url, trust.verifier.pdp_url (none disables trust for that flow)
WALLET_TRUST_REGISTRY_URLtrust.registry_url—URL of the VCTM registry
A PDP is required for production

A Policy Decision Point (an AuthZEN service such as go-trust) is required for production use. Running without trust.pdp_url is not supported and is for testing and development only, with no guarantees. Some things may happen to work: the backend falls back to a permissive, client-mediated mode in which issuers and verifiers are accepted without server-side verification (it logs a warning, or an error when ENVIRONMENT=production), but server-side key resolution through the PDP, including did: methods, is not available. If a PDP is configured but fails or is unreachable, evaluation fails closed.

The /v1/resolve endpoint accepts an optional credential_types field in the request body and forwards it in action.parameters of the AuthZEN evaluation request. This enables credential-type-aware trust policies in Go-Trust.

AuthZEN Proxy​

Env VarConfig KeyDefaultDescription
WALLET_AUTHZEN_PROXY_ENABLEDauthzen_proxy.enabledtrueExpose the AuthZEN proxy on the backend API

The AuthZEN proxy allows the frontend to delegate trust evaluation to the backend, which forwards requests to Go-Trust with additional context (credential types, resource metadata). The proxy forwards the caller-supplied credential_types in action.parameters, enabling fine-grained trust decisions per credential format. It is enabled by default because engine flows depend on it.

Session Store​

Env VarConfig KeyDefaultDescription
WALLET_SESSION_STORE_TYPEsession_store.typememorymemory or redis
WALLET_SESSION_STORE_REDIS_ADDRESSsession_store.redis.addresslocalhost:6379Redis address (required if type is redis)

Use redis when running multiple backend replicas to share WebSocket session state.

HTTP Client Security​

Env VarConfig KeyDefaultDescription
WALLET_HTTP_CLIENT_ALLOW_PRIVATE_IPShttp_client.allow_private_ipsfalseAllow HTTP requests to private/loopback IPs (SSRF protection)
WALLET_HTTP_CLIENT_ALLOW_HTTPhttp_client.allow_httpfalseAllow plain HTTP for metadata resolution
Security Defaults

Both SSRF protection and HTTPS enforcement are enabled by default. Only disable these in controlled development environments.

Features​

Env VarConfig KeyDefaultDescription
WALLET_FEATURES_PROXY_ENABLEDfeatures.proxy_enabledtrueEnable the /proxy endpoint for OID4VCI/VP protocol proxying
WALLET_FEATURES_CREDENTIAL_STORAGE_ENABLEDfeatures.credential_storage_enabledfalseEnable server-side credential storage

Multi-Role Deployment​

When running roles in separate containers, configure cross-service discovery:

server:
external_urls:
backend_url: "https://wallet-api.example.com"
engine_url: "wss://wallet-ws.example.com"
registry_url: "https://wallet-registry.example.com"
admin_url: "https://wallet-admin.internal.example.com"

The equivalent environment variables are WALLET_SERVER_EXTERNAL_URLS_BACKEND_URL, WALLET_SERVER_EXTERNAL_URLS_ENGINE_URL, WALLET_SERVER_EXTERNAL_URLS_REGISTRY_URL and WALLET_SERVER_EXTERNAL_URLS_ADMIN_URL. The roles of a process are selected with --mode (backend by default; comma-separated list of backend, registry, engine, admin, auth, wallet-provider, or all) and the config file with --config (default configs/config.yaml).

Logging​

Env VarConfig KeyDefaultDescription
WALLET_LOGGING_LEVELlogging.levelinfoLog level: debug, info, warn, error
Complete Configuration Reference

The wallet backend includes a generated configuration reference covering all YAML keys, environment variables, and their descriptions, generated directly from the Go config structs.


VC (Credential Manager)​

The apigw, issuer, registry, and verifier services share a single YAML config file (VC_CONFIG_YAML), plus a small set of bootstrap environment variables.

Complete Configuration Reference

See the generated configuration reference for all YAML keys, defaults, and validation constraints across common, apigw, issuer, verifier, and registry, generated directly from the Go config structs.


Go-Trust​

Go-trust is configured via CLI flags, environment variables (prefix GT_), or a YAML config file. Full documentation is at Go-Trust Configuration.

Essential Settings​

Env VarDefaultDescription
GT_HOST127.0.0.1Listen address (set 0.0.0.0 in containers)
GT_PORT6001Listen port
GT_EXTERNAL_URL—Public URL for the AuthZEN discovery endpoint
GT_LOG_LEVELinfoLog level
GT_LOG_FORMATtextLog format (text or json)

Trust Registries​

Go-trust supports multiple trust registry types simultaneously. Configure them via CLI flags or config file:

Registry TypePurposeInput
ETSI TSLEU Trusted Lists (X.509 certificate validation)PEM certificate bundle file
ETSI LoTELists of Trusted Entities (JSON-based)URLs or local files
OpenID FederationTrust chain resolutionFederation anchor URLs
DID:webDecentralized Identifier resolutionAutomatic (network)
DID:webvhDID with verifiable historyAutomatic (network)
WhitelistSimple URL-based trustYAML/JSON file

Example with an ETSI certificate bundle:

gt --etsi-cert-bundle=/etc/go-trust/trusted-certs.pem

For detailed registry configuration, see the go-trust example config.