clientAuth cutoff

Keep partner mTLS working after public clientAuth ends.

Give every API its own private, service-scoped client-certificate chain. Invite a partner, watch them enroll a key that never leaves their machine, and see the first allowed call (and the expected denial) in minutes.

  • Keep your public server certificate
  • Workload keys stay with the partner
  • Renewals run on their own
How a partner call is decided A partner workload presents its private client certificate over mTLS to the Mutual Trust gateway, which applies signed policy revision 42. GET /orders is allowed with status 200 and reaches the Orders API. GET /admin/export is denied with status 403, reason route_not_permitted, and never reaches the API. Each decision produces a receipt. Partner workload Harbor · orders-sync key generated locally 24 h leaf mTLS private, service-scoped chain Your gateway Mutual Trust policy revision 42 · signed ES256 deny by default 200 ALLOWED GET /orders receipt · grant gr_7f… · rev 42 403 DENIED GET /admin/export route_not_permitted Orders API never reaches the API How a partner call is decided A partner workload presents its private client certificate over mTLS to the Mutual Trust gateway, which applies signed policy revision 42. GET /orders is allowed with status 200 and reaches the Orders API. GET /admin/export is denied with status 403, reason route_not_permitted, and never reaches the API. Partner workload Harbor · orders-sync local key · 24 h leaf mTLS private chain Your gateway Mutual Trust policy rev 42 · signed · deny by default 200 ALLOWED GET /orders receipt · rev 42 Orders API 403 DENIED route_not_permitted GET /admin/export never reaches API
Every request yields a TLS receipt and an authorization receipt naming the gateway, grant, time and policy revision.

Why now

Public certificates are leaving client authentication behind

Sectigo’s published FAQ gives 10 February 2027 as the final cutoff for the clientAuth EKU in newly issued publicly trusted Sectigo SSL/TLS certificates. If your partners authenticate to your API with public certificates, their next renewal is the moment that matters. The exact effect depends on your inventory and renewal timing.

What stays

Your publicly trusted server certificate. Browsers and partners keep validating your API exactly as they do today.

What moves

How callers prove who they are: a separate, private chain per service, issued, renewed and withdrawn for you.

The problem

Partner mTLS was never really about the certificate

The hard part is everything around it: who may call which route, who renews, and whether “revoked” actually took effect.

Roll your own

  • Stand up a private CA, an issuance API, renewal, CRLs, and someone to run them.
  • A valid chain says nothing about which routes a partner may call.
  • Renewal is a calendar reminder and a support ticket on both sides.
  • Withdrawal is a config change and a hope. Nobody can show which gateways applied it.

With Mutual Trust

  • Each trust space gets its own private trust anchor and online issuing CA, operated for you.
  • Grants name the partner workload, routes and methods. Everything else is denied.
  • 24-hour leaves renew automatically about two-thirds through validity.
  • Withdrawal writes deny state immediately and lists every gateway’s acknowledgment, or that it is still pending.

Three commands

From pairing code to a verified allow and deny

The CLI starts a sample Orders API behind the Mutual Trust enforcer, enrolls a workload with a key generated on your machine, and makes two calls with the same client: one the grant allows, one it doesn’t.

  1. Pair a gateway. The enforcer pins the policy-verification key during authenticated pairing.
  2. Enroll the workload. A CSR with proof of possession; the private key stays local.
  3. Call twice. /orders succeeds. /admin/export is refused with a reason.
Follow the quickstart
Sandbox walkthrough
1 · Install mt and start the gateway
curl -fsSL https://mutualtrust.io/install.sh | sh mt gateway
Mutual Trust quickstart · control plane https://api.mutualtrust.io
  sample Orders API on http://127.0.0.1:9001
  Pairing code: XXXX-XXXX  # approve in the portal
  Gateway ready.
2 · Enroll the workload
mt enroll --token mtenr_…
Enrolling workload
  1. attestation accepted: challenge issued
  2. generated P-256 key locally (private key never leaves this machine)
  3. certificate issued · 24 h · renews automatically
3 · Call an allowed and a restricted route
mt call https://localhost:8443/orders mt call https://localhost:8443/admin/export
200 ALLOWED  GET …/orders
  request req_… · policy revision 42
403 DENIED   GET …/admin/export
  route_not_permitted
  not permitted to call this route or method

How it works

Five steps from sign-in to proof

A solo developer can play both sides in two clearly labeled sample organizations.

  1. Create a space

    Choose Sandbox and “Try the Orders API”. No card. You get an API owner, a sample partner and a sandbox trust fingerprint.

  2. Pair a gateway

    Run the enforcer beside your API, or use the gateway you already operate. It pins its verification key and reports the policy revision it applied.

  3. Invite and enroll

    Grant routes to a named partner workload. The partner accepts, generates a key locally and submits a signed CSR.

  4. Send two requests

    The allowed route succeeds and the restricted one is denied. Both receipts name the gateway, grant, time and revision.

  5. Change access

    Withdraw the grant and repeat the call. A new revision and a new denial close the loop; offline gateways show as pending.

What you get

Issuance, policy and evidence in one subscription

  • A private chain per service

    Each trust space has its own trust anchor and issuing CA. Sandbox and production never share issuers or credentials.

  • Keys stay with the partner

    The CLI generates the key on the partner’s machine and proves possession with a CSR. Mutual Trust never sees it.

  • Route-scoped grants

    Access is a grant to a named workload for specific routes and methods. A valid chain alone can’t authorize a call.

  • Renewal without tickets

    Short-lived leaves renew unattended with jitter and backoff. A failed renewal returns an actionable error with a correlation ID.

  • Two receipts per request

    TLS success and authorization are recorded separately, so you can tell a bad certificate from a missing grant.

  • Withdrawal with proof

    Deny state is written at once. Each gateway acknowledges the revision it applied, and stragglers are named, not hidden.

Works in front of the gateway you run

Every integration applies the same signed, deny-by-default policy and reports the revision it enforces. Run Mutual Trust inside the proxy you already operate, or put the standalone mTLS proxy in front of any API.

Browse gateway guides

Who it’s for

One workflow, shared by both sides of the API

API owners

Give each partner exactly the routes they need, and remove access the day the contract changes.

  • Invite a partner organization by name
  • Narrow methods and routes, suspend or withdraw
  • Withdrawal receipts per gateway

Partner engineers

Get a credential in your own environment, renew it unattended, and know why a call was refused.

  • Accept with your own identity provider
  • Renewal due, reload status and last successful call
  • Reason codes and correlation IDs, not support tickets

Platform and security leads

Adopt one client-auth policy across internal and partner APIs, clouds and clusters, and show it.

  • Verifiable configuration and gateway coverage
  • Change history with a reason on every change
  • Exportable audit evidence

Trust and evidence

Enforcement you can reason about

The gateway checks the certificate, then checks policy per request, including resumed sessions. Unknown issuers, malformed identities, ambiguous routes and expired policy are refused.

Signed manifests
Immutable policy bundles signed with JWS ES256 under a pinned key, with replay and downgrade protection.
Deny by default
No grant, no call. An uninitialized gateway or a wrong-scope bundle fails closed.
Fresh policy, or no access
15 spolicy refresh 5 mincached policy, then fail closed Gateways keep enforcing the last valid signed policy without the control plane for up to five minutes, then fail closed for protected routes.
Per-gateway acknowledgments
Each gateway reports the revision it applied. That is evidence about that gateway, never a claim of enforcement everywhere.
Read the security model
Authorization receipt (decoded)
{ "typ": "mt.receipt.v1", "request_id": "req_…", "gateway_id": "gw_…", "revision": 42, "tls": "verified", "authz": { "verdict": "deny", "reason": "route_not_permitted", "principal": "urn:mutualtrust:workload:…" }, "method": "GET", "route": "/admin/export", "observed_at": "2026-11-14T09:30:12Z" }

Receipts are signed by the gateway (ES256) and sent to the control plane alongside its acknowledgments.

Pricing

Start free. Pay per partner connection.

A production connection is one production service paired with one consuming organization that has an active grant. Workloads, replicas and rotations within that pair are included. Partner invitations are free.

Sandbox

Free

No card

  • Isolated sample space and local demo
  • Time-limited test credentials
  • Invite a colleague or partner

Enterprise and channel

Annual

Contract or site license

  • Multiple environments, SSO and provisioning
  • Retention and support commitments
  • Reseller payer allocation, region and issuer options

FAQ

Questions, answered plainly

Something missing? The docs go deeper on the API, enrollment and the security model.

No. Your API keeps its publicly trusted server certificate. Mutual Trust only changes how callers authenticate: with a separate, private, service-scoped client chain.

Sectigo’s published FAQ gives that date as the final cutoff for the clientAuth EKU in newly issued publicly trusted Sectigo SSL/TLS certificates. How it affects you depends on which certificates your partners use and when they renew.

No. The CLI generates the key on the partner’s machine and submits a certificate signing request with proof of possession. Only the public key reaches the service.

Gateways keep enforcing the last valid signed policy for up to five minutes, then fail closed for protected routes. Freshness and expected impact are shown in the portal.

The sandbox uses dedicated test roots, marked SANDBOX TEST, and time-limited credentials, so you can try the full flow without a card. Production trust spaces are provisioned with Sectigo PKI Operations on hardware-protected keys. Sandbox and production never share issuers or credentials. Request production access from the portal.

The API sponsor pays for production capacity. Invited partners take part in the sponsor’s relationship without buying a plan, and certificate rotations are included.

No. Mutual Trust is a standalone service with self-service signup. Existing Sectigo customers can adopt it without an SCM purchase.

See your first allowed call (and the expected denial) today.

The sandbox is free, needs no card, and runs the same flow your partners will use.