Free TLS certificates and ACME
A free TLS certificate is a domain-validated certificate issued by a public CA over ACME, a protocol that proves you control a hostname and hands back a certificate with no human in the loop. Let's Encrypt, ZeroSSL and Google Trust Services all issue them at no cost and all speak the same protocol, so the client you run matters more than the CA you point it at. Free covers domain validation only. Nothing free will vet your organisation, issue a client certificate for mTLS, or certify a hostname that does not resolve publicly — those need a commercial CA or one of your own.
What ACME actually does #
Every free publicly trusted certificate comes out of the same protocol. ACME — Automatic Certificate Management Environment, RFC 8555 — replaces the old cycle of generating a request, pasting it into a web form, waiting for an email and downloading a zip file. A client running on your server does all of it:
- Registers an account key with the CA.
- Asks for a certificate covering a list of names.
- Receives a challenge for each name — something only whoever controls that name can do.
- Completes the challenges, sends a CSR, and receives the certificate.
The CSR has not gone away; you just never see it. The client generates the key and the request locally, exactly as openssl req would, and the private key never leaves the machine. What ACME removes is the person in the middle.
That is also what makes free issuance possible. A CA that never has to pay anyone to read an email can afford to charge nothing — and in exchange it issues certificates with short lifetimes, which is the trade the whole model rests on.
Which CAs issue free certificates #
| CA | Run by | Worth knowing |
|---|---|---|
| Let’s Encrypt | ISRG, a nonprofit | The default choice, and the reference implementation of the model |
| ZeroSSL | A commercial CA | ACME plus a web UI; the free tier sits inside a paid product |
| Google Trust Services | ACME issuance tied to a Google Cloud account |
All of them are domain validation only, all of them are in the same root stores, and all of them speak the same protocol — so the choice is close to reversible. Pointing a client at a different ACME directory URL is a one-line change. Choose on operational grounds: rate limits, who you already have an account with, whether you want a UI. Certificate quality is not a differentiator, because there is no difference to find.
The challenge type decides what you can get #
Two challenges matter in practice, and the one you are able to complete decides what the CA is willing to issue.
| HTTP-01 | DNS-01 | |
|---|---|---|
| Proves control by | Serving a token under /.well-known/acme-challenge/ |
Publishing a TXT record at _acme-challenge |
| Requires | Port 80 reachable from the internet | API access to your DNS provider |
| Wildcards | No | Yes — the only way to get one |
| Works with no inbound connectivity | No | Yes |
certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
certbot certonly --dns-cloudflare -d example.com -d '*.example.com' Neither block is marked for verification. Both need a public hostname and a live CA, and the test harness runs with no network by design, so these are reviewed by hand instead.
What free will not give you #
- Organisation or extended validation. Free issuance proves control of a name and nothing else. If you need a certificate that says a company exists, you are buying it.
- Client certificates. ACME issues
serverAuthcertificates. Anything for mTLS comes from a CA you run — see create a client certificate. - Names that do not resolve publicly.
.local,.internal, bare hostnames and private IP ranges cannot pass any challenge, because no public CA is able to validate them. This is the case people try hardest to solve with a self-signed certificate, and it is the case a private CA exists for. - Long lifetimes. Short validity is deliberate, not a limitation of the free tier. Something in your stack that cannot renew unattended is a problem to fix rather than to buy your way around.
Renewal is the whole point #
The certificate is not the deliverable — unattended renewal is. Issuance happens once and renewal happens for as long as the service exists, so the only question worth asking of a setup is what it does when nobody is watching it.
openssl x509 -in certificate.crt -noout -checkend 2592000 Expected output
Certificate will not expire
That is thirty days in seconds; a non-zero exit means the certificate expires inside the window. Alert on it even when renewal is fully automated, because the failure that actually hurts is the renewal that quietly stopped working — and until the day it matters, that looks exactly like one that is still running.
More at check certificate expiry and fixing “certificate has expired”.
Frequently asked questions
- Are free certificates less secure than paid ones?
- No. A certificate from Let's Encrypt and one costing several hundred pounds carry the same key, the same signature algorithms and the same status in the same root stores. What money buys is organisation vetting, a warranty and a support contract — not stronger cryptography.
- Can I get a free wildcard certificate?
- Yes, but only through the DNS-01 challenge, which means your ACME client needs API credentials for your DNS provider. HTTP-01 cannot issue a wildcard, whoever the CA is.
- Why do free certificates expire so quickly?
- Short lifetimes limit the damage a compromised key can do, and they force renewal to be automated rather than remembered. Certificate lifetimes are shrinking across the whole industry, not only at free CAs.
- Do I still need to generate a CSR?
- Your ACME client generates one for you, along with the private key, and neither leaves your server. You only handle a CSR by hand when dealing with a CA that has no ACME support.
References
- RFC 8555: ACME — the protocol behind automated free issuance
- Let's Encrypt documentation — rate limits, challenge types and chain layout