Self-hosted certificate lifecycle management: issue, renew, discover, inventory and deploy TLS certificates across your infrastructure
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗The self-hosted control plane for your TLS certificates, ready for 47-day certificates.
CertMate issues and renews certificates, finds the ones you did not issue, keeps one inventory of what is served where, who issued it and when it expires, and deploys each renewed certificate to where it is served. It runs on your own infrastructure, with a web interface, a REST API, a CLI and an MCP server for AI agents.
Quick start • Documentation • Live demo • Video guide • API reference
Publicly trusted certificates are getting shorter: 200 days at most since 15 March 2026, 100 days from 15 March 2027, and 47 days from 15 March 2029 (CA/Browser Forum ballot SC-081). At that pace a renewal nobody watches is an outage waiting for a date. CertMate is built for it:
renews_at), and the CA can move that date through ARI, its renewal
information. See when a certificate renews.CertMate runs as a single instance. Its renewal scheduler runs inside the web process, so a second replica would be a second scheduler issuing against the same certificates, and the Helm chart refuses to render more than one. It scales up, not out; for availability, run active and standby on shared storage, as Availability and failover describes.
One file, the published image, nothing to build. You need Docker with Compose v2, and a domain whose DNS is at a supported provider.
mkdir certmate && cd certmate
curl -fsSLO https://raw.githubusercontent.com/fabriziosalmi/certmate/main/deploy/docker-compose.yml
printf 'API_BEARER_TOKEN=%s\nSECRET_KEY=%s\nCERTMATE_BACKUP_PASSPHRASE=%s\n' \
"$(openssl rand -hex 32)" "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
chmod 600 .env
.env holds the three secrets CertMate needs: the API token (the first-run
screen asks for it once, to create the administrator), the session signing key,
and the backup passphrase, without which automatic backups cannot restore the
instance. Optionally add CLOUDFLARE_TOKEN=... to bootstrap a Cloudflare DNS
account; every other provider is configured in the web interface.
docker compose up -d
docker compose logs -f certmate
CertMate listens on 127.0.0.1:8000. For remote access, put a reverse proxy in
front and set BEHIND_PROXY=true in .env; see Docker.
Open http://localhost:8000, create the administrator, add your DNS provider in
Settings, then create a certificate. Or through the API:
curl -X POST http://localhost:8000/api/certificates/create \
-H "Authorization: Bearer $(grep API_BEARER_TOKEN .env | cut -d= -f2)" \
-H "Content-Type: application/json" \
-d '{"domain": "app.example.com"}'
curl -fsSL https://raw.githubusercontent.com/fabriziosalmi/certmate/main/deploy/install.sh | sudo sh
installs it with its own Python 3.12 and starts the service. See
installation.oci://ghcr.io/fabriziosalmi/charts/certmate,
with one replica by design. See Kubernetes.Every setting is in configuration.
The REST API is what the web interface uses. The two calls most automation needs:
POST /api/certificates/create
GET /api/certificates/{domain}/download/{cert|chain|fullchain|privkey|combined}
From a terminal or from Python, pip install certmate-cli gives the certmate
command and the SDK under it:
export CERTMATE_URL=https://certmate.example.com CERTMATE_TOKEN=...
certmate cert create app.example.com --dns cloudflare --wait
CertMate ships a Model Context Protocol server, so an assistant can drive the
same API with the same roles and the same audit trail. It exposes 16 tools,
from listing certificates to issuing, renewing and deploying them. Give it a
scoped API key created with is_agent: true, so the audit chain records its
actions as an agent's. See the MCP guide.
| Page | What it covers |
|---|---|
| Installation | Linux installer, cloud-init, manual setup, reverse proxy, egress |
| Docker | Compose bundle, images, building multi-platform |
| Kubernetes | Helm, Argo CD, Flux, sizing |
| Configuration | Every environment variable |
| CA providers | Let's Encrypt, ZeroSSL, DigiCert, Sectigo, private CA |
| DNS providers | Every provider, its credentials, multi-account, availability |
| Custom DNS script | Any provider with no plugin |
| Client certificates | mTLS and VPN client certificates, renewal timing |
| CSR-only certificates | Issuing when the key stays on the device |
| ACME server | Certificates for internal names and IPv4 addresses to certbot, lego, acme.sh and cert-manager |
| Discovery and inventory |
Most pages are also in German, Spanish, French and Italian, under docs/de, docs/es, docs/fr and docs/it.
| Probes, CT logs, adopting, crypto readiness |
| Deploy hooks | Commands after issuance and renewal |
| Webhooks | Payload templates, authentication, signatures |
| Deployment probes | Checking a renewed certificate is served |
| Storage | Storage backends and migration |
| Backups | Backups, restoring, lost admin password |
| Monitoring | Health endpoints, metrics, logs, notifications |
| Single sign-on | OpenID Connect |
| Compliance | Audit chain, attribution, NIS2 and eIDAS |
| API reference | Every endpoint, its role and its answers |
| MCP server | Tools, attribution, safety |
| Architecture | Design, components, availability |
| Troubleshooting | Common failures, debug logging, bug reports |
| Testing | The test suite and CI |