Skip to content

Certificate Revocation Lists

Mantis publishes RFC 5280 certificate revocation lists (CRLs) for every certificate authority it holds. A CRL is what makes a certificate withdrawable before it expires, including the certificates that have no agent registration behind them — a Thorax server certificate, Mandible’s dispatch certificate, and anything else signed through the platform’s own signing path.

EndpointReturnsContent type
GET /api/v1/crl/{ca_id}One authority’s current CRLapplication/pkix-crl (DER)
GET /api/v1/crlEvery live authority’s CRL, concatenatedapplication/x-pem-file (PEM)

Both endpoints are unauthenticated by design. A CRL is signed by the authority that issued it, so a consumer authenticates it from the trust anchor it already holds and the transport carries nothing secret. The party that most needs to read one is a peer whose certificate has just been refused, which by definition cannot authenticate.

GET /api/v1/crl/{ca_id} is also the URL stamped into the CRLDistributionPoints extension of every certificate the platform signs, so a third-party verifier finds it without being told.

PropertyValue
nextUpdate7 days after thisUpdate
Re-issuedwhen the stored list is more than 5 minutes old and a request arrives
Consumers refreshevery 5 minutes

A revocation is therefore visible to a peer within roughly ten minutes. The list is signed once per interval and stored; the endpoint serves the stored bytes, so an anonymous caller cannot drive the CA key at request rate.

An entry drops off the list once the certificate would have expired anyway, which is what keeps the list from growing without bound.

[tls]
auth_mode = "ca_signed"
ca_cert_path = "/etc/mantis/ca/certs/ca.crt"
crl_url = "https://mantis.example.com/api/v1/crl"
crl_path = "/etc/mantis/ca/crl" # optional, merged with the published lists

Or MANTIS_TLS_CRL_URL / MANTIS_TLS_CRL_PATH in the environment.

crl_url and crl_path are merged, not exclusive: pinning a list locally does not stop the platform’s own from being applied.

Plain http:// is legitimate here. Each list is signed by the authority that issued it and is verified against the CA already configured, so the transport carries no trust.

[tls]
ca_cert_path = "/etc/mantis/ca/certs/ca.crt"
crl_url = "https://mantis.example.com/api/v1/crl"

Without this, Thorax’s server certificate is not revocable at all: the CA chain in ca_cert_path says who issued that certificate, not whether it is still good. The revocation check runs on that same CA chain verifier.

The two ends make deliberately different choices, because refusing has a different cost at each.

ConditionThorax (verifying agents)Tarsus (verifying Thorax)
Fetch failsKeeps the lists it last fetchedKeeps the lists it last fetched
Never fetched successfullyNo revocation checkNo revocation check
List past nextUpdateRefuses every CA-signed clientStill applies the list
Certificate’s issuer absent from the bundleRefuses the clientAdmits the peer

A failed fetch changes no admission decision at either end. Only a sustained outage — one long enough for nextUpdate to pass, which is a week — reaches the fail-closed rows.

Thorax fails closed because it is the resource being protected: an agent whose certificate it cannot vouch for must not execute commands, and a Thorax that cannot reach Mandible cannot dispatch anything anyway.

Tarsus does not, because an agent that refuses to reach its Thorax is a disconnected fleet and disconnection protects nothing. The list the agent still holds catches every certificate revoked up to the moment that list was issued.

Revocation is the ordinary operator action; nothing separate is needed to reach the CRL.

Terminal window
mantisctl cert revoke "<REGISTRATION_UUID>" --reason "Certificate compromised"

This marks the certificate in the ledger, and the next CRL issued by that authority carries it, with an RFC 5280 reason code and the time the revocation was processed. A certificate superseded by rotation is listed as superseded; one withdrawn with a registration is listed as privilegeWithdrawn.