Certificate expiry

The certificate has expired or will expire within 30 days. Once it lapses every browser, API client and mail gateway that talks to the site will refuse the connection.

Do this: Renew now, and automate renewal so it never expires again. An expired certificate takes the site down for every visitor at once, with a warning that looks like an attack. Open the page you need
PassThe certificate is valid for more than 30 days.
HighThe certificate has expired or expires within 30 days.

The fix, in one snippet

Example to adapt Automate it, then verify the timer
sudo certbot renew --dry-run && systemctl list-timers certbot*

Illustrative values. Change the paths, hostnames and options to match your own site before using it.

The sections below explain what is tested, why it matters and the alternatives.

What we test

Scan.now reads the notAfter field of the leaf certificate obtained during the handshake and compares it to the current time. The check fails when fewer than 30 days remain; it is reported as high when fewer than 7 days remain or the certificate has already expired (in which case certificate-valid fails too). The result shows the exact expiry timestamp, the issuer and the total validity period. Intermediates are examined as well, because an expired intermediate breaks the chain just as surely. The report also notes the certificate's total lifetime: since the CA/Browser Forum's Ballot SC-081 took effect in March 2026 public certificates may be issued for at most 200 days, falling to 100 days in March 2027 and 47 days in March 2029, which makes manual renewal impractical.

Why it matters

Expiry is the most common self-inflicted outage on the web. The moment the certificate lapses, browsers show an interstitial, mobile apps and API integrations fail with TLS errors, webhooks stop, and mail servers that enforce TLS start bouncing. Because nothing is hacked, monitoring often does not notice until customers complain. Large, well-staffed organisations have had multi-hour outages from a single forgotten certificate. A certificate close to expiry is also a signal that renewal is not automated, which means the next expiry is a matter of when, not if. As lifetimes shrink under the CA/Browser Forum schedule, any process that depends on a person remembering a date will fail. The certificate errors guide covers what users see and how to recover.

How to fix it

Automate renewal and monitor it. Certbot installs a systemd timer (or cron entry) that renews any certificate with fewer than 30 days left; confirm it is active and simulate a renewal:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

If you manage the timer yourself, a twice-daily cron entry with a reload hook is enough:

0 3,15 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"

For Apache, replace the hook with systemctl reload apache2 (or httpd). acme.sh and Caddy are alternatives that renew automatically without extra tooling. Behind Cloudflare, Universal SSL renews the edge certificate itself; Origin CA certificates for the origin can be issued for up to 15 years, which removes the deadline from that hop. Wherever renewal happens, add an external check that alerts when fewer than 14 days remain, so a broken hook is caught before the deadline. The SSL checker shows days remaining on demand, and the SSL and TLS guide explains the certificate lifecycle.

Where this fits

Certificate expiry is check 3 of 12 that the website vulnerability scanner runs under transport security (https / tls), ordered the way they are worth fixing. That ordering is the point: Fixing this one while the check above it still fails buys less than it looks like.

Fix this one first

Above it in the same category sits HTTPS is available (critical), where the site could not be reached over HTTPS on port 443, or the TLS handshake failed. An attacker who has that does not need this, so it is the better use of the same hour.

What fixing this still leaves open

Certificate expiry closes one route in. Immediately below it: Deprecated TLS versions accepted (1.0 / 1.1), where the server still completes handshakes with TLS 1.0 or TLS 1.1; HTTP redirects to HTTPS, where port 80 serves page content instead of redirecting to HTTPS, or the redirect chain is wrong; Certificate key strength, where the certificate's public key is weaker than current guidance: An RSA key shorter than 2048 bits, or a DSA key.

Found in the same scan

The website vulnerability scanner reports this alongside checks from other categories that are at least as serious, including Exposed .env configuration file, where a .env configuration file is served from the web root, and Exposed .git repository, where the site's .git directory is reachable over HTTP. A single run of website vulnerability scanner answers all of them at once.

Prompt for an AI Hand this check to an assistant Sign in to copy it
The first few lines
You are a senior web engineer. I ran a security and SEO scanner against my site and it reported the finding below. Fix it properly rather than suppressing the symptom.

Finding: Certificate expiry (high severity)
Scanner check id: certificate-expiry
17 more lines, including the evidence and the exact fix

The rest of this prompt names the pages and line numbers we found the problem on, the configuration to change, and the constraints a good answer has to respect. It is free, it just needs an account so the work is not scraped wholesale.

Sign in with Google

Signing in is free and takes one click. We store your email address and nothing else.

References

  1. Let's Encrypt: Integration guide and renewal
  2. Certbot documentation
  3. CA/Browser Forum: Baseline Requirements

Related guides