No cron, no scripts
A systemd timer keeps every cert fresh forever. Nothing to schedule, nothing to maintain.
One static binary and a systemd timer. Every Linux host gets its own
auto-renewing certificate — from Let's Encrypt, Vault, or
step-ca — delivered to nginx, HAProxy, Cockpit & co. with the exact
owner, mode, and SELinux context each needs.
$ curl -fsSL https://syscert.tfindley.dev/install.sh | sudo sh Inspect the script first ↗ · verify sha256sums.txt · no host certbot required
// the chore nobody wants to own
You terminate public TLS at the edge — but the hop from there to your backends, and traffic between internal services, is often plaintext or hand-made certs that expire and page someone at 2 a.m. syscert makes every host responsible for its own cert, automatically.
Without syscert
With syscert
systemd timer renews it forever — no cron// ~5 minutes, start to finish
One static binary + a systemd timer. Download or build, then run install.sh.
Your subject & CA in syscert.toml; DNS/CA credentials in the secrets env file.
The timer issues, renews and distributes — forever. No cron, no babysitting.
[cert] hostname = "host.example.com" sans = ["api.example.com"] [acme] ca = "letsencrypt" email = "you@example.com" challenge = "dns-01" [acme.dns] provider = "cloudflare" [[distribute]] # deliver to nginx artifact = "fullchain" path = "/etc/nginx/tls/fullchain.pem" owner = "root" group = "nginx" mode = "0644"
# credentials stay out of the .toml; the service # loads this file as its environment. CLOUDFLARE_DNS_API_TOKEN=••••••••••••••••
syscert ensure runs on a
schedule and keeps every artifact fresh.
// what you actually get
A systemd timer keeps every cert fresh forever. Nothing to schedule, nothing to maintain.
Runs as its own hardened, unprivileged service user. It touches certs — nothing else.
Each consumer gets its artifact with the ownership, permissions and SELinux context it needs.
Writes cert.pem · privkey.pem · chain.pem · fullchain.pem, plus an all-in-one bundle.pem.
Run it on both ends against an internal CA — each side gets its own cert and verifies the other.
Public Let's Encrypt, or an internal HashiCorp Vault / Smallstep step-ca over ACME.
// plays with what you already run
// one binary, the whole lifecycle
$ syscert ensure default The default. Issue if missing, renew if due, then distribute. $ syscert issue Force a fresh certificate now. $ syscert renew Renew if inside the renewal window. $ syscert distribute Copy artifacts to their consumer paths. $ syscert dry-run Show exactly what would happen — change nothing. $ syscert void Revoke the current certificate. $ syscert destroy Revoke and remove local state. $ syscert trust install Add the CA to the system trust store (and remove). // independent & open source
syscert is free, AGPL-3.0, and built in the open. If it saved you a 2 a.m. page, a coffee keeps it moving.
One command. Then never think about certificate renewal again.
$ curl -fsSL https://syscert.tfindley.dev/install.sh | sudo sh