How to Get an SSL Certificate: Free Let's Encrypt to Paid Options
Free (Let's Encrypt/certbot) vs paid certificates, the issuance flow (CSR, validation) and auto-renewal.
An SSL certificate (technically TLS) is no longer optional. Without HTTPS, Chrome flags your site as "Not secure", Google ranks you lower, and you cannot use HTTP/2 or HTTP/3. The good news: most sites can get a certificate for free in about ten minutes. With Let's Encrypt and certbot, a single command handles issuance, web-server configuration, and automatic renewal.
This guide walks through the DV/OV/EV tiers, the exact certbot commands, the common reasons issuance fails (CAA records, picking the wrong validation method), and what to verify afterwards. Once installed, always confirm the chain and expiry with an SSL Certificate Checker.
DV vs OV vs EV — DV Is Enough for Almost Everyone
Certificates come in three tiers based on what the CA verified, not how strong the encryption is — the cryptography is identical across all three. The only differences are the vetting process and the organization details embedded in the certificate.
- DV (Domain Validation)— proves you control the domain, nothing more. Fully automated, issued in minutes. This is what Let's Encrypt gives you, and it is perfectly adequate for blogs, stores, APIs, and internal services.
- OV (Organization Validation) — the CA also verifies your legal entity, and the company name appears in the certificate details. Manual review takes 1–3 days and costs money.
- EV (Extended Validation) — the strictest vetting. Browsers used to show the company name in a green address bar, but Chrome and Firefox removed that UI years ago, so the visible benefit is gone and adoption has collapsed.
Paid OV/EV certificates still make sense in a few situations: compliance or audit requirements that explicitly demand organization-validated certificates (common in finance and insurance), contracts that require a CA warranty, or air-gapped appliances where automated renewal is impossible and you need a one-year certificate installed by hand. Everyone else should start with free DV.
How Issuance Actually Works — Key Pair, CSR, Domain Validation
certbot hides all of this, but knowing the three steps makes troubleshooting instant when something breaks.
- Generate a key pair — a private key and public key are created on your server. The private key must never leave it.
- Submit a CSR (Certificate Signing Request) — a request containing your public key, domain names (CN/SAN), and organization info goes to the CA. If you are buying a paid certificate and generated the CSR yourself, paste it into a CSR Decoder before submitting — forgetting the
wwwvariant in the SAN list is one of the most common and expensive mistakes. - Domain validation — the CA verifies you actually control the domain, using one of the two standard challenge types below.
| Validation method | How it works | When to use it |
|---|---|---|
HTTP-01 | The CA fetches http://yourdomain/.well-known/acme-challenge/<token> and checks the token file your ACME client placed there. Port 80 must be reachable from the internet. | Standard single-domain (plus www) issuance. Simplest option and certbot's default. |
DNS-01 | You publish a specific TXT record at _acme-challenge.yourdomain, proving control via DNS. No web server or open port 80 required. | Required for wildcards (*.example.com) — HTTP-01 cannot issue them. Also useful for internal servers or hosts that cannot expose port 80. |
One more gotcha: if the domain has a CAA record, only the CAs listed there may issue certificates for it. A domain carrying only CAA 0 issue "digicert.com" will make Let's Encrypt fail with a CAA record prevents issuance error. If issuance fails for no obvious reason, run a CAA Record Check first and, if needed, add issue "letsencrypt.org". No CAA record at all means any CA may issue — that is fine.
Worked Example: nginx from Zero to HTTPS (Let's Encrypt + certbot)
Here is the complete path for example.comon Ubuntu with nginx. Two prerequisites: the domain's A record must point at this server, and ports 80 and 443 must be open in the firewall.
- Install certbot
sudo apt update && sudo apt install certbot python3-certbot-nginx - Issue and auto-configure nginx
sudo certbot --nginx -d example.com -d www.example.com
After you enter an email and accept the terms, certbot passes the HTTP-01 challenge and writes thessl_certificate/ssl_certificate_keypaths into your nginx config. When it offers an HTTP → HTTPS redirect, choose "2: Redirect". - Verify the result — files live in
/etc/letsencrypt/live/example.com/(fullchain.pem= certificate + intermediates,privkey.pem= private key). Load the site, confirm the padlock, then run an SSL Certificate Checker to confirm the chain completes leaf → intermediate → root and the expiry is roughly 90 days out. - Rehearse renewal — Let's Encrypt certificates are valid for 90 days; certbot installs a systemd timer (or cron job) that renews them 30 days before expiry. Always dry-run it once:
sudo certbot renew --dry-run
If you see "Congratulations, all simulated renewals succeeded", you are done — no further maintenance needed.
Need a wildcard? Use DNS-01: sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com. The manual flow requires re-publishing a TXT record on every renewal, so for production use a certbot DNS plugin (cloudflare, route53, etc.) that automates the record updates.
Post-Install Checklist
- Run an SSL Certificate Checker to confirm the intermediate chain is served — installing only the leaf certificate causes failures that appear only on mobile devices and API clients. Always point nginx at
fullchain.pem. - Confirm both the apex domain and
wwware in the SAN list — covering only one producesERR_CERT_COMMON_NAME_INVALIDon the other. - Check that HTTP 301-redirects to HTTPS and that no page still loads http:// resources (mixed content).
- Verify
certbot renew --dry-runsucceeds andcertbot.timershows up insystemctl list-timers. Roughly 90% of expiry outages come from missing renewal automation, not from the certificate itself.
Frequently asked questions
Is a free Let's Encrypt certificate less secure than a paid one?
Why are Let's Encrypt certificates only valid for 90 days?
How do I get a wildcard certificate (*.example.com)?
certbot fails with a CAA error. What do I do?
The certificate works on my laptop but fails on phones or API clients. Why?
Tools to use with this guide
Related guides
- SSL Certificate Errors (NET::ERR_CERT…): Causes and FixesFive common causes of browser SSL errors and authorized=false, and how to fix each.
- Essential Security Headers Guide (CSP, HSTS, X-Frame-Options)The security headers you must set, what each does, recommended values and common mistakes.