Skip to content

Standalone

One binary on a host that has outbound internet access — the certbot-shaped mode. The host talks directly to the CA and your DNS provider.

Use it when the host getting the certificate can make outbound HTTPS calls but can't be reached inbound from the internet (the common case for internal services behind a firewall or NAT).

Flow

gapcert issue ──HTTPS──► ACME CA (Let's Encrypt, ...)
              ──API───►  DNS provider  (publishes _acme-challenge TXT)

The quickstart is the full standalone walkthrough. In short:

$ gapcert issue
web                  obtaining [web.internal.example.com] via challenge-zone ...
web                  stored ~/.local/share/gapcert/certs/web
web                  hook ok

$ gapcert status
NAME                 DOMAINS                                  EXPIRES        DAYS  STATUS
web                  web.internal.example.com                 2026-10-24       88  ok

Where things are stored

Under data_dir (default ~/.local/share/gapcert):

accounts/<ca-host>/<email>/   ACME account key + registration
certs/<name>/cert.pem         leaf + chain (fullchain)
certs/<name>/key.pem          private key (0600)
certs/<name>/issuer.pem       issuer chain
certs/<name>/meta.json        issuance metadata

Writes are atomic (temp file + rename), so a crash mid-renewal never leaves a half-written key or certificate.

Trade-off

Every standalone host holds a DNS-provider credential. That's fine for a handful of trusted hosts; for a fleet, keep the credentials on one machine with the broker instead, so hundreds of hosts never touch cloud secrets. Scope the credential regardless — delegate the challenge to a dedicated zone (see configuration).