/ TLS/SSL certificates

Check your website's TLS/SSL certificate for free

Your website's TLS certificate (what many of us still call SSL) expires, and sooner every year. From 15 March 2027 it can last 100 days at most, and from 2029, 47. If you renew by hand, that's going from once a year to at least four times, then around eight.

Free and open source, MIT licence. No sign-up, no account, and it runs on your machine: your data goes nowhere.

See how the 1,000 most visited .es sites are doing

yogurTLSv1.1.1, MIT licence

See how your TLS/SSL certificate is doing, and how to fix what is wrong.

A free, open source, one-command checker. Give it your domain and it tells you how your certificate is doing, what changes for you in 2027 and, if something is wrong, how to fix it.

Why yogurTLS? Because certificates are heading for yogurt-style expiry dates. Not long ago they could last more than a year and you forgot about them; from 2029 they will last 47 days, so you will check the date the way you check the yogurt in the fridge. Hence the logo, a tub with a keyhole on its label. TLS is the protocol that protects the connection between your site and the people visiting it.

How it differs from an online checker

Seeing when a certificate expires is easy: dozens of websites do it. yogurTLS is for people who run one or several sites and want to know before something breaks.

If you only want to look at the date once, you need nothing: click the icon left of the address, then "Connection is secure" and the certificate. The expiry date is there.

  • With and without www, at once. Online checkers usually look only at the name you type. On one in four .es sites, each version has a different certificate.
  • All your sites at once. A list in a file, and an exit code so a scheduled job (cron) can alert you when something comes out amber or red, without you having to remember to look.
  • What 2027 and 2029 mean for your certificate. Not general news, but whether yours already runs at that pace.
  • From inside your server. From the outside you cannot see how a certificate is renewed. Run on your server, it tells you whether automatic renewal is set up and whether the certificate was renewed but nobody reloaded the site.
  • The reminder in your calendar. If you renew by hand, it leaves the appointment in Google Calendar, Outlook or Apple Calendar.
  • Free, no account, nobody selling. Many online checkers belong to companies that sell certificates or services. There is nothing to buy here.
$ npx yogurtls yourdomain.com

All you need is Node 20 or newer. Nothing else to install.

What it checks

  • 01
    Expiry and validity

    How many days are left and whether it already runs at the 2027 and 2029 pace.

  • 02
    Full chain

    What your browser hides: with the intermediate missing, your site shows a padlock and fails for apps, integrations and bots.

  • 03
    With and without www

    Both at once. One in four .es sites uses a different certificate on each.

  • 04
    Name, authority and self-signed

    What makes a browser show its error page. As a traffic light: GOOD, WARN or FAIL, always with the word.

What it tells you

Terminal with the yogurTLS logo in pink and the report for three sites, in Spanish: devilfruittcg.com in green (BIEN, good), incomplete-chain.badssl.com in amber (OJO, warn) for the incomplete chain, with what is wrong and how to fix it, and expired.badssl.com in red (MAL, fail), expired since 2015.
See the output as text
$ npx yogurtls devilfruittcg.com incomplete-chain.badssl.com expired.badssl.com

devilfruittcg.com             BIEN
  Emisor           Google Trust Services
  Caduca           28 nov 2026 (quedan 47 días)
  Duración         90 días
  Cadena           completa
  2027             Ya cumple el límite de 100 días que llega en marzo de 2027.

incomplete-chain.badssl.com   OJO
  Emisor           Let's Encrypt
  Caduca           28 dic 2026 (quedan 76 días)
  Duración         90 días
  Cadena           incompleta
  Qué pasa         Falta el certificado intermedio. Los navegadores lo suplen, salvo un Firefox recién
                   instalado, pero curl, las apps, las integraciones y los bots darán error.
  Cómo se arregla  Configura el servidor para que envíe la cadena completa. Con certbot, usa `fullchain.pem`
                   en vez de `cert.pem`. Si no, une tu certificado y el intermedio de tu autoridad en un solo
                   archivo.
  2027             Ya cumple el límite de 100 días que llega en marzo de 2027.

expired.badssl.com            MAL
  Emisor           COMODO CA Limited
  Caduca           12 abr 2015 (caducado hace 4201 días)
  Duración         4 días
  Cadena           completa
  Qué pasa         Caducó el 12 abr 2015. Los navegadores muestran un aviso de error.
  Cómo se arregla  Renuévalo ya. Con certbot: `certbot renew`. Para que no se repita, automatiza la renovación
                   con ACME.

1 en verde, 1 en ámbar, 1 en rojo.

Real yogurTLS 1.1.0 output from 12 October 2026, on a Windows set to Spanish, so it answers in Spanish. Add --en for English. The days left depend on the day you run it.

npx yogurtls a.com b.com

Several sites at once.

npx yogurtls --file domains.txt

A list in a file, one site per line.

--warn-days 14

Amber when expiry is close. Exits 0, 1 or 2 for a scheduled job (cron).

--es --en

Language. By default, your system's.

npx yogurtls

With nothing else, it asks for the domain.

It runs on your machine (or on your server, with --server), only connects to the domains you give it and sends nothing to anyone. It renews and installs nothing: it only reads.

On your server: --server

From the outside you cannot see how your certificate is renewed. From the inside, you can look. Run it on the machine that serves the site:

$ sudo npx yogurtls yourdomain.com --server

It compares the certificate on disk (where certbot or acme.sh keep it) with the one the site sends. If the one on disk is newer, the renewal worked but nobody reloaded the server, and it gives you the command to fix it. It also checks whether automatic renewal is set up: certbot's timer or a scheduled job running certbot or acme.sh. Being set up does not guarantee it works, which is why it also compares the two certificates.

Limits. Linux only. If a CDN such as Cloudflare sits in front, people see the CDN's certificate, so it does not compare them and tells you so. If your certificates live in Docker or a control panel, point to the file with --cert; renewal is then not judged, because the container or the panel does it and it cannot be seen from there.

The reminder in your calendar: --calendar

For people who renew by hand. It saves one reminder per domain 14 days before expiry (change it with --warn-days) to import into Google Calendar, Outlook or Apple Calendar.

$ npx yogurtls yourdomain.com --calendar reminders.ics
Google Calendar reminder on Saturday 14 November, in Spanish: Renovar el certificado TLS de devilfruittcg.com (renew the TLS certificate). It expires on 28 Nov 2026; if it renews on its own you do not need this reminder; check it with npx yogurtls devilfruittcg.com. Alarm on the day at 9:00.

It cannot tell whether your certificate renews on its own, so it says so in the reminder itself. After renewing, run it again.

When a TLS/SSL certificate does not renew on its own

With Let's Encrypt and almost any modern host, the certificate renews by itself. But there are cases where it does not, and some are treacherous because nobody notices until the site breaks.

  • Bought certificates. If you bought it from a commercial authority (DigiCert, Sectigo…), renewing means buying again, validating, downloading and installing by hand. Common in large companies, public bodies and universities.
  • Uploaded by hand. A certificate pasted into a control panel, a CDN or a load balancer does not renew: that system did not issue it and cannot ask for another.
  • The automatic renewal broke. The certbot scheduled job stopped after a server move, the domain now points somewhere else (a new CDN, another server), port 80 is closed, or the DNS API key expired. It all looked automatic, and from that day on it is not.
  • It renews, but the server never finds out. The classic: certbot saves the new certificate to disk, but Nginx or Apache keep sending the old one until someone reloads them. On disk everything is fine, and the site expires anyway.
  • Several servers. Behind a load balancer, the certificate renews on one and not on the others.

And note: Let's Encrypt stopped sending its "your certificate expires soon" email in June 2025. If that was your only alarm, you no longer have it.

What happens when it expires, and how to recover

An expired certificate does not switch your site off, but it is close: the browser stands in front of it with a full-screen warning.

  • In the browser. Chrome shows "Your connection is not private" (NET::ERR_CERT_DATE_INVALID) and almost everyone leaves. If your site uses HSTS, there is not even a button to continue.
  • Outside the browser, silently. Apps, APIs, integrations, your payment provider's notifications and webhooks fail without showing any screen. That is often what costs the most money, because nobody sees it.
  • In trust. If your visitors learn to click through the warning on your site, they will do it on a fake one too.

If it has expired, in this order

  1. Find out why it did not renew. If it was automatic, fix the cause first. With certbot, sudo certbot renew --dry-run shows the error without using up attempts: Let's Encrypt only gives you 5 identical certificates every 7 days and 5 failed validations per hour, so retrying blindly can lock you out for days.
  2. Renew it. With certbot, sudo certbot renew. On a hosting plan, "reissue SSL certificate" in the control panel is usually enough.
  3. Reload the server so it uses the new one: sudo systemctl reload nginx (or apache2). If there is a CDN or load balancer in front, upload it there too.
  4. If it was a bought certificate and the renewal will take time (business certificates, OV or EV, need the company validated and can take days), put up a free Let's Encrypt one in the meantime. It encrypts just the same, and your site is back in minutes.
  5. Check it outside the browser, with and without www and with the full chain: npx yogurtls yourdomain.com. As soon as the server sends the new certificate, the warning goes away for everyone.
  6. Recover what failed silently. Check payment notifications and webhooks from those hours: many providers only retry a few times.
  7. Set an alarm so it does not happen again: npx yogurtls yourdomain.com --warn-days 14 in a scheduled job (cron), or the reminder in your calendar with --calendar reminders.ics.

What's worth knowing about security

  • The padlock does not mean the site can be trusted. It only says the connection is encrypted and whoever serves it controls that domain. Phishing sites have a padlock too, for free.
  • Free is not less secure. A Let's Encrypt certificate encrypts exactly like a paid one. Business certificates (OV or EV) add details of who is behind the site, not more encryption.
  • Never "fix" it by turning verification off. When an integration fails because of the certificate, the temptation is curl -k, verify=False or similar. That lets anyone sit in the middle and read or change the data. The fix belongs on the server, not on whoever connects to it.
  • The private key is what really protects you. Only the server should be able to read it, and never by email or in a repository. If it leaks, revoke the certificate and get a new one with a new key. It is one of the reasons certificates keep getting shorter: revoking a stolen one works poorly, so it is better if it expires soon.
  • Decide who can issue certificates for your domain. A CAA record in your DNS says which authorities may do it, and authorities are required to respect it. It is free and takes a minute at your DNS provider.
  • Every certificate is public. Each certificate for your domain is recorded in public logs (Certificate Transparency), with all its names. You can look yours up on crt.sh and see whether someone got one you did not ask for. And do not put the name of an internal subdomain you want to keep quiet in a public certificate.

How to renew your TLS/SSL certificate without having to remember

Renewing by hand is like renewing a passport: forget it and you are stuck. What you want is the new one arriving by post. This gets you there, and all of it is free.

StepHow
Automate renewalWith ACME, the protocol Let's Encrypt uses: certbot or acme.sh on your server, or your host or CDN if they already do it. At 47 days, renewing by hand stops being an option.
Send the full chainYour server has to send your certificate and the intermediate. With certbot, use fullchain.pem instead of cert.pem.
Check it outside the browserWith yogurTLS, or with openssl s_client -connect yourdomain.com:443 -servername yourdomain.com, which should end in Verify return code: 0 (ok) (OpenSSL does not come with Windows; Git for Windows includes it, in Git Bash). Without installing anything, SSL Labs flags an incomplete chain as "Chain issues: Incomplete".
Watch the expiry dateEven when automated, because automation fails too. npx yogurtls yourdomain.com --warn-days 14 in a scheduled job (cron) can alert you in time.
Check every versionWith www, without it, and any subdomain still in DNS.

How the 1,000 most visited .es sites are doing

I measured the TLS certificates of the 1,000 most visited .es domains on the Tranco list, all on 9 October 2026. 958 could be measured.

421/958already use certificates of 100 days or less, the 2027 pace
201/958still serve one-year certificates, all issued before March 2026
464/958use Let's Encrypt, Google Trust Services or Amazon, which renew on their own
21showed a certificate error in Chrome on measurement day
11load in the browser and fail outside it because of an incomplete chain

What a TLS/SSL certificate is, assuming nothing

When you open a site over https://, two things happen. What you send travels in a sealed envelope only that site can open. And the site shows a certificate, its ID card, to prove it is who it claims to be. A certificate authority signs it (Let's Encrypt, DigiCert, Google, Spain's FNMT…) after checking that whoever asks for it controls the domain.

Browsers ship with a list of authorities they trust, like someone who knows by heart which official stamps are real. But authorities keep their master stamp locked away and sign with an intermediate certificate. So a site has to show its ID card and also the credentials of the office that issued it. If those credentials are missing, the chain is incomplete.

Your server has to send its certificate and the intermediate. The root already ships with the browser.

TLS or SSL? The same thing, for what matters to you. SSL is the name of the old protocol, retired years ago as insecure; TLS is the one in use today. But almost everyone, me included, still says "SSL certificate", and hosting companies still call it that.

Why do they expire? In case someone steals the key. Revoking a stolen certificate works poorly in practice, so the best defence is a short life.

What changes in 2027 and 2029

Browsers and certificate authorities decide this together at the CA/B Forum. The maximum counts from the day a certificate is issued, not from its expiry. It's going from an ID card to a yogurt.

Maximum validity of a certificate by the date it is issued. Bars to scale.
Source: CA/B Forum Baseline Requirements, version 2.3.1, section 6.3.2.
Issued fromMaximum validityIf you renew by hand
Before 15 Mar 2026398 daysonce a year
15 Mar 2026200 daystwice a year
15 Mar 2027100 daysat least 4 times a year
15 Mar 202947 daysaround 8 times a year

How long .es TLS certificates last today

Validity of the certificate each site serves, measured at the final destination of the home page after following redirects. One row per domain.

The 958 .es sites with a measurable certificate, 9 October 2026. Each segment is proportional to its number of sites.
958 domains with a measurable certificate, 9 October 2026.
ValidityDomains% of 958What it means
47 days or less192.0%already within the 2029 limit
48 to 100 days40242.0%already within the 2027 limit
101 to 200 days33635.1%will have to renew twice as often
Over 200 days20121.0%from renewing once a year to at least 4 times
34 domains (3.5%) with a certificate that does not validate, split by what a visitor sees.
GroupDomainsDetail
Error in Chrome2115 with a certificate that does not cover their name, 4 with an incomplete chain plus another fault, 2 expired (since 2021 and 2023)
Load in the browser, fail outside1211 with an incomplete chain and 1 whose chain OpenSSL does not validate
Not a certificate fault1HTTP/2 protocol error

No certificate longer than 200 days was issued after 15 March 2026. All 958 follow the rule, which also works as a check that the measurement adds up.

What's worth knowing about your TLS certificate

  • Your browser covers the gap. 11 sites are missing their intermediate certificate. Chrome downloads it on the spot and Firefox takes it from a list it keeps updated, so both show the padlock. curl, apps, business integrations and bots do neither, and for them the site fails. You open your site, see the padlock and assume all is well.
  • A fresh Firefox does fail. With a brand new profile, without that list, 10 of the 11 failed (SEC_ERROR_UNKNOWN_ISSUER). With a profile synced for 16 minutes, all 11 loaded. That's the control group: the list is what saves Firefox.
  • The Greek authority behind Spanish universities. 70 .es domains carry certificates from HARICA, the Greek academic network's authority. Since January 2025 HARICA runs the certificate service of GÉANT, the European research network, and RedIRIS offers it in Spain. By domain name they are universities (47), public bodies (11) and research centres (10); I checked 15 at random by hand and 13 matched. If you work at a university, this rule hits you directly.
  • The sites already on the 2029 pace didn't choose it. All 19 certificates of 47 days or less last exactly 30 days, and 17 come from Certainly, Fastly's authority, which only works with its CDN and renews every 20 days. If your CDN or host renews for you, the 2027 change won't touch you.
  • Two certificates per site. On 226 of 847 domains (26.7%), the www and non-www versions use different certificates. Not a fault, but two things to renew.

Who renews by hand is invisible from outside

I tried to tell which sites renew by hand using the public certificate history (Certificate Transparency, queried through crt.sh), on a random subsample of 100 domains, with thresholds fixed before looking at results.

It didn't work. Large sites hold dozens of certificates at once, crt.sh misses wildcard and multi-domain certificates, and even Let's Encrypt, which renews on its own by design, came out as "manual". If a method gets wrong what you know for sure, you can't trust the rest, so I dropped it without publishing a figure.

That's why 48.4% is the share of sites whose issuer renews on its own, not measured renewals. I tried again in yogurTLS, on 150 sites from the study, and it only reached a conclusion for 9% of those known to renew automatically. That's why yogurTLS does not infer it from the outside. What it does is look from the inside, with --server, on your own machine.

How it was measured, and its limits

Sample
1,000 .es domains, Tranco list K9Z7W
Measurable
958 with a certificate
Measured
9 October 2026, from one connection in Valencia
The rule
CA/B Forum Baseline Requirements, v2.3.1, section 6.3.2
Tools
Node 20 (TLS), real Chrome 154 and Firefox 157
Updated
12 October 2026: what to do when it does not renew or expires, and security. The data has not changed.
Data
CSV and JSON, aggregated
  • Sample. The first 1,000 domains ending in .es on Tranco list K9Z7W. It starts at rank 724, because many large Spanish sites use .com: this is the most visited .es web, not the whole Spanish web.
  • Unit. The domain, measured at the home page's final destination after redirects (949 of 1,000; the other 51 at the default host).
  • Connection. One normal TLS handshake per host, like any browser. No path or port scanning.
  • Errors. Every invalid certificate was measured again and opened in a real Chrome to confirm the cause. The 11 incomplete chains were also tested in Firefox, with a fresh profile and a synced one.
  • No secure connection. 42 domains: 8 sites (living at another address or only unencrypted), 9 technical domains, classified by name, and 25 with no visible site.
  • Limits. One network location, one day: a CDN may serve a different certificate depending on where you connect from. Two sites fixed their certificate the next day; they count as they were on the 9th.
  • No names. Neither this page nor the downloadable data names any site with a broken certificate.

Sources: CA/B Forum, Baseline Requirements, Tranco list K9Z7W, GÉANT Trusted Certificate Service, RedIRIS, TCS authorities, Fastly, Certainly and RFC 8555, ACME.

/ Try it

Did something come up red?

Run yogurTLS on your site. If something is unclear, breaks or a check is missing, open an issue on GitHub or email me.