Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ports and Endpoints

Reference for writing firewall rules, security groups, and load balancer routing.

Ports

PortProtocolPurposeConfigurable
443HTTPSMain listenerNo — fixed whenever TLS is configured
80HTTP308 redirect to HTTPS, plus /healthNo
8443HTTPS + mTLSClient-certificate listener for RFC 8705 certificate-bound tokensPort only, via VOUCH_MTLS_PORT
3000HTTPDefault listener when TLS is not configuredYes, via VOUCH_LISTEN_ADDR

Which ports are live depends on whether VOUCH_TLS_CERT and VOUCH_TLS_KEY are set:

TLS configured — the server listens on 443 and 80 and starts the mTLS listener on 8443. VOUCH_LISTEN_ADDR is ignored.

TLS not configured — the server listens only on VOUCH_LISTEN_ADDR (default [::]:3000). No redirect listener, no mTLS listener.

Three things regularly surprise operators here:

  • The mTLS listener has no on/off switch. It starts automatically whenever TLS is configured. A security group that opens only 80 and 443 silently breaks certificate-bound tokens; a firewall audit that flags 8443 is seeing expected behavior.
  • Binding 80 and 443 needs CAP_NET_BIND_SERVICE on Linux. The RPM and DEB packages configure it. A bind failure on port 80 is logged as a warning and is not fatal — you lose the HTTP redirect while everything else keeps working.
  • A bind failure on the mTLS port is fatal. Unlike port 80, it aborts startup.

Endpoints by authentication type

AuthWhat it means
NonePublic, unauthenticated
Bearer/DPoPA Vouch access token, in Authorization: Bearer or Authorization: DPoP
SignedBearer/DPoP plus an RFC 9421 HTTP message signature
SessionBrowser cookie session
AdminSession or Bearer, and the user must be an active org administrator
SCIM tokenA vouch_scim_… bearer token
Metrics tokenThe VOUCH_METRICS_BEARER_TOKEN value
HMACGitHub webhook signature

Operations

EndpointMethodAuthNotes
/healthGETNoneLiveness. Returns ok as plain text. Also served on port 80
/health/readyGETNoneReadiness. Checks the database; 503 when unreachable
/metricsGETMetrics tokenOnly registered when VOUCH_METRICS_BEARER_TOKEN is set

Discovery and metadata

EndpointMethodAuth
/.well-known/openid-configurationGETNone
/.well-known/oauth-authorization-serverGETNone
/.well-known/oauth-protected-resourceGETNone
/.well-known/security.txtGETNone
/oauth/jwksGETNone
/saml/metadataGETNone

OAuth and authentication

EndpointMethodAuthRate-limit tier
/oauth/tokenPOSTClient authAuthentication
/oauth/parPOSTClient authAuthentication
/oauth/fido2/challengePOSTNoneAuthentication
/oauth/devicePOSTClient auth (RFC 8628 §3.1); enrolling requires CLI 2026.9.4 or laterAuthentication
/oauth/registerPOSTNone (RFC 7591)Authentication
/oauth/register/{client_id}GET/PUT/DELETERegistration access tokenAuthentication
/oauth/authorizeGETSessionGeneral
/oauth/introspectPOSTClient authGeneral
/oauth/revokePOSTClient authGeneral
/oauth/userinfoGETBearer/DPoPNot limited
/oauth/callbackGETNone (IdP redirect)Not limited
/saml/acsPOSTNone (IdP assertion)Not limited

Credentials and keys

EndpointMethodAuthRate-limit tier
/v1/credentials/sshPOSTSignedCredential
/v1/credentials/aws/tokenGETSignedCredential
/v1/credentials/github/tokenPOSTSignedCredential
/v1/credentials/ssh/caGETNoneGeneral
/v1/credentials/ssh/krlGETNoneGeneral
/v1/credentials/ssh/krl/{serial}GETNoneGeneral
/v1/credentials/github/statusGETNoneGeneral
/v1/keysGETSignedGeneral
/v1/keys/{id}PATCH/DELETESignedGeneral
/v1/keys/register/start · /completePOSTSignedAuthentication
/v1/auth/statusGETNoneNot limited

The public read endpoints are unauthenticated by design: SSH hosts fetch the CA public key and revocation list without holding credentials.

Administration

EndpointMethodAuthRate-limit tier
/admin and /admin/*GET/POSTAdminGeneral
/api/v1/org/scim-tokensGET/POSTAdminGeneral
/api/v1/org/scim-tokens/{id}DELETEAdminGeneral
/api/v1/org/policies/validatePOSTAdminGeneral
/scim/v2/*GET/POST/PUT/PATCH/DELETESCIM tokenGeneral
/api/v1/applications*variousBearer/DPoPGeneral
/api/webhooks/githubPOSTHMACGeneral

Admin form POSTs additionally require an Origin header matching the server’s own origin; a mismatch is rejected with 403.

Browser UI

/, /login, /device, /install, /integrations, /enroll/*, /logout, /github/*, /applications/*, /static/*, /favicon.ico, /i18n.js — session-based or public, HTML responses.

/privacy and /terms are 301 redirects to vouch.sh. If you need your own legal pages, put them in front of Vouch at your proxy.

Request limits

ScopeLimit
Global timeout30 seconds (408 on expiry)
Global body256 KiB
Credential issuance8 KiB
SCIM, /oauth/authorize, SAML ACS64 KiB
Enroll and login WebAuthn32 KiB
GitHub webhook1 MiB

Outbound connections

The server itself makes outbound HTTPS calls; egress rules must allow them:

DestinationWhen
Your upstream IdP (discovery, JWKS, token)Always — at startup and during enrollment
Your SAML IdP metadata URLAt startup, if a SAML IdP is configured
AWS KMS, S3, STSWhen KMS keys, S3 configuration, or the AWS integration are used
api.github.comWhen the GitHub App integration is used
DNS resolversDomain-ownership TXT verification
An OAuth client’s jwks_uriAt dynamic client registration — restricted to public IPs by SSRF protection

Discovery and metadata fetches happen at startup and are fatal on failure: a blocked egress rule shows up as a server that will not boot, not as a degraded feature. Use VOUCH_EXTRA_CA_CERTS if any of these present certificates from an internal CA.