Issuing automatically with ACME
Free, automated certificates from Let’s Encrypt or ZeroSSL that renew themselves. This is the default answer unless OV/EV or an offline key requirement forces you elsewhere.
-
Point DNS at the server first
The CA validates by reaching your domain. An
A/AAAArecord must already resolve to the machine you're issuing on, and port 80 must be reachable for HTTP validation. -
Install an ACME client
Certbot is the reference client;
acme.shis a dependency-free shell alternative.sudo apt install certbot python3-certbot-nginx # Debian/Ubuntucurl https://get.acme.sh | sh # acme.sh alternative -
Issue the certificate
The plugin edits your web-server config, proves control, and installs the result in one command. No key or CSR handling on your part — the client generates both.
sudo certbot --nginx -d example.com -d www.example.comsudo certbot --apache -d example.com -d www.example.comFor a wildcard, HTTP validation isn't allowed — you must prove control via a DNS
TXTrecord:sudo certbot certonly --manual --preferred-challenges dns -d '*.example.com' -d example.com -
Confirm renewal is automatic
Packaged certbot installs a systemd timer or cron job already. Verify it rather than assuming — a silent renewal failure surfaces as an outage 90 days later.
sudo certbot renew --dry-run && systemctl list-timers | grep certbot
Let's Encrypt's own documentation
- Documentation index — client options, challenge types, integration guides.
- Rate limits — read this before automating anything that issues in a loop.
- Staging environment — and you can run a staging order from here to check a CSR before spending a real one.
- Community forum — where a failing validation usually gets diagnosed fastest.