Skip to main content
mTLS is a consumer auth type. The caller presents a client certificate. TrustGate verifies it against your CA and optionally against CN, DNS SAN, or SHA-256 fingerprint allowlists. Routing must be Static (inline). Identity-based (role_based) consumers cannot use mTLS. This is client → TrustGate. It is not how TrustGate authenticates to an upstream MCP server, and it is not a TrustGuard evaluate-API method.
The NeuralTrust console New Auth form does not offer mTLS. Create the credential with the Admin API, then attach it to a consumer.

Quick path

  1. Issue a client certificate from a CA you control. Keep the CA PEM.
  2. POST /v1/gateways/{gateway_id}/auths with type: mtls and config.mtls.ca_cert.
  3. POST /v1/gateways/{gateway_id}/consumers/{id}/auths/{auth_id} on a Static consumer.
  4. Terminate TLS in front of TrustGate (or on the process). If a proxy terminates TLS, set TRUST_XFCC_FROM to that proxy’s IPs and forward X-Forwarded-Client-Cert.
  5. Call the proxy or MCP plane with the client certificate. A valid cert and matching allowlists authenticate as that consumer.

What TrustGate checks

Verification uses x509 client-auth EKU against ca_cert. Empty allowlists mean “any cert from this CA”. The principal subject is the certificate CN, or the first DNS SAN if CN is empty. Telemetry records trustgate.principal.method = mtls. Auth resolution order on a request: client certificate → bearer token → API key.

How the certificate arrives

TrustGate’s HTTP planes listen in plaintext. The leaf comes from one of: TRUST_XFCC_FROM is a comma-separated list of IPs or CIDRs. If it is empty, TrustGate ignores XFCC — a client cannot smuggle a cert header. The header is Envoy-style: a Cert= element whose value is a URL-encoded PEM. Example shape (truncated):
Only put the TLS-terminating proxy in TRUST_XFCC_FROM. Anyone in that set can present an arbitrary client certificate as if it were on the wire.

Create and attach

Admin JWT or machine credentials on the Admin plane:
Then attach to a Static consumer:

Where it applies

Next step