Skip to content
RU

NET::ERR_CERT_DATE_INVALID: How to Fix an Expired Certificate or Wrong Clock

What it means: By your device's clock, the site's certificate has expired or is not valid yet.

  1. Check your device date, time and time zone
  2. Retry from another device or network
  3. If it fails everywhere: renew the certificate
  4. Reload nginx or Apache to serve it

Test your URL now

Runs a full TLS check: handshake, protocol versions, certificate chain, trust and expiry.

Check your site's SSL →

What NET::ERR_CERT_DATE_INVALID means

Every certificate carries a notBefore and a notAfter date. Chrome compares them, for the leaf and for the intermediates in the chain it builds, with the clock of the device running the browser. If the current time is outside that window, it reports NET::ERR_CERT_DATE_INVALID (net error -201). The comment in Chromium's net_error_list.h lists three explanations: an attacker presenting an old certificate whose key they obtained, a misconfigured server, or "Our clock is wrong."

Only the visitor's clock matters; the server's clock plays no part in this check. The error is also not about trust or names. Those outrank dates in Chrome, so an expired certificate that is also self-signed shows ERR_CERT_AUTHORITY_INVALID, and one issued for another hostname shows ERR_CERT_COMMON_NAME_INVALID.

Causes in Chrome, Edge, Firefox and Safari

BrowserWhat you seeMost common trigger
Chrome"Your connection is not private" with NET::ERR_CERT_DATE_INVALID, or "Your clock is behind" / "Your clock is ahead"Missed renewal; wrong device clock
Edge"Your connection isn't private", same codeSame as Chrome
FirefoxSEC_ERROR_EXPIRED_CERTIFICATE, MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE, SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE, or "Your Computer Clock is Wrong"Expired leaf, brand-new certificate on a slow clock, expired intermediate
Safari"This Connection Is Not Private"; the certificate details show the datesSame conditions

Server side. Renewal never ran (disabled certbot timer, an ACME HTTP-01 challenge blocked by a firewall or a redirect, expired DNS API credentials for DNS-01). Or renewal succeeded but nothing reloaded the server: nginx, Apache and HAProxy keep the old certificate in memory until a reload, and Java or Node apps until a restart. Or one node, a load balancer or a CDN still holds the old file. A stale bundle containing an expired intermediate gives the same result.

Client side. A dead CMOS battery, a virtual machine restored from a snapshot, a manually changed date or a wrong time zone. A certificate issued minutes ago plus a clock running behind gives the "not valid yet" variant.

Renewals are getting more frequent. Under CA/Browser Forum ballot SC-081, public TLS certificates issued since March 15, 2026 can be valid for at most 200 days, dropping to 100 days in March 2027 and 47 days in March 2029. Let's Encrypt stopped sending expiry reminder emails on June 4, 2025, so manual renewal now fails silently.

Behind Cloudflare, nginx or another proxy

  • Cloudflare edge. Universal SSL certificates renew automatically. A custom certificate you uploaded does not; Cloudflare lists an expired custom certificate as a cause of ERR_SSL_VERSION_OR_CIPHER_MISMATCH, because the edge stops presenting it.
  • Cloudflare origin. With an expired origin certificate, Full (strict) returns error 526, Full accepts it silently, and a DNS-only record shows visitors ERR_CERT_DATE_INVALID.
  • nginx, Apache, HAProxy. Make renewal reload the server automatically. Certbot runs executables in its deploy-hook directory after each successful renewal:
# /etc/letsencrypt/renewal-hooks/deploy/reload-web.sh  (chmod +x)
#!/bin/sh
systemctl reload nginx
# systemctl reload haproxy   # if HAProxy terminates TLS

Managed load balancers behave differently: AWS Certificate Manager renews certificates it issued, but not certificates you imported.

If you own the site

  1. Read the dates the server actually serves:
    openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
      | openssl x509 -noout -subject -issuer -dates
  2. Compare with the file on disk: sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -enddate. New on disk but old on the wire means nobody reloaded: sudo nginx -t && sudo systemctl reload nginx.
  3. Old on disk means renewal failed. Renew with sudo certbot renew --cert-name example.com, then find out why: systemctl list-timers | grep -i certbot, sudo certbot renew --dry-run and /var/log/letsencrypt/letsencrypt.log.
  4. Repeat step 1 against every node IP, the IPv6 address and any CDN or load balancer that holds its own copy.
  5. Add an expiry alert, for example a daily cron running openssl x509 -checkend 1209600 (14 days). More options: SSL certificate monitoring.

If you are a visitor

  • Fix the clock first. Windows: Settings > Time & language > Date & time, turn on "Set time automatically". macOS: System Settings > General > Date & Time. Phones: enable automatic date and time. If Chrome said "Your clock is behind" or "Your clock is ahead", this is the whole fix.
  • Clock is right, other sites load: the certificate really expired. Only the owner can fix it; you can confirm the expiry date with an outside check.
  • Clock is right, every site fails: look at the issuer in the certificate viewer. Security software or a proxy that re-signs traffic may be presenting an outdated certificate.

Clearing the cache does nothing, because certificates are not stored in the HTTP cache. Right after the owner deploys a new certificate, restart the browser to drop connections that are already open.

How to confirm the fix

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -checkend 2592000 && echo "valid for 30+ days"

curl -sS -o /dev/null https://example.com/ && echo "TLS OK"
# an expired certificate prints: curl: (60) SSL certificate problem: certificate has expired

Check from outside your network too: the enterno.io SSL checker shows the served expiry date, issuer and chain.

Related errors

CertificateExpiry, issuer, domains (SAN)
ChainIntermediate and root CA validation
TLS ProtocolTLS version and cipher suite
VulnerabilitiesHeartbleed, POODLE, weak ciphers

Why teams trust us

TLS 1.3
supported
Full
CA chain check
3,158
checks in 30 days
30/14/7
days-to-expiry alerts

How it works

1

Enter domain

2

TLS chain verified

3

Expiry date & vulnerabilities

What Does the SSL Check Cover?

SSL/TLS is the encryption protocol that protects data between the browser and server. Our tool analyzes the certificate, chain of trust, TLS version, and knownvulnerabilities.

Certificate Details

Issuer, validity period, signature algorithm, covered domains (SAN), and validation type (DV/OV/EV).

Chain of Trust

Full chain verification: from leaf certificate through intermediates to root CA.

TLS Analysis

Protocol version (TLS 1.2/1.3), cipher suites, Perfect Forward Secrecy (PFS) support.

Expiry Alerts

Set up a monitor — get Telegram and email alerts 30/14/7 days before expiration.

DV vs OV vs EV Certificates

DV (Domain Validation)
  • Confirms domain ownership only
  • Issued in minutes automatically
  • Free via Let's Encrypt
  • Suitable for most websites
  • Most common certificate type
OV / EV
  • Organization (OV) or Extended Validation (EV)
  • Issued in 1-5 business days
  • Costs $50 to $500/year
  • For finance, e-commerce, government sites
  • Increases user trust

Who uses this

DevOps

SSL certificate monitoring

Security

TLS config audit

SEO

HTTPS as ranking factor

E-commerce

customer trust

Common Mistakes

Expired certificateBrowsers block sites with expired SSL. Set up auto-renewal or monitoring.
Incomplete certificate chainWithout intermediate CA, some browsers and bots cannot verify the certificate.
Mixed content on HTTPS siteHTTP resources on an HTTPS page — the browser lock icon disappears, reducing trust.
Using TLS 1.0/1.1Legacy TLS versions have known vulnerabilities. Use TLS 1.2+ or 1.3.
Domain mismatch in certificateThe certificate must cover all site domains, including www and subdomains.

Best Practices

Set up auto-renewalLet's Encrypt + certbot with cron — certificate renews automatically every 60-90 days.
Enable HSTSStrict-Transport-Security header forces browsers to always use HTTPS.
Use TLS 1.3TLS 1.3 is faster (1-RTT handshake) and safer — legacy ciphers removed.
Monitor expiration datesCreate a monitor on Enterno.io — get notified well before expiration.
Verify chain after renewalAfter certificate renewal, confirm that intermediate certificates are installed.

Get more with a free account

SSL certificate monitoring, check history and alerts 30 days before expiry.

Sign up free

Learn more

Sources

Frequently Asked Questions

Why does Chrome say "Your clock is behind"?

Chrome compared the certificate dates with a device clock it believes is wrong. Turn on automatic date and time in your operating system and reload; the site itself is probably fine.

How do I get warned before my certificate expires?

Run a daily check such as openssl x509 -checkend 1209600 against the served certificate and alert when it fails. Let's Encrypt stopped sending expiry emails on June 4, 2025, so do not rely on them.

Why does the site work on my phone but not on my laptop?

The two devices disagree about the time. Fix the laptop clock and time zone; if both clocks are right, the laptop may be behind a proxy or security software presenting an old certificate.

I renewed the certificate. Why do visitors still see the error?

The server is still serving the old certificate from memory, or another node, load balancer or CDN holds its own copy. Reload the web server and check the date served by every IP.

Does clearing cookies or the cache help?

No. Certificates are checked on every new TLS connection and are not stored in the HTTP cache. Fix the clock or renew the certificate instead.

Try the live tool that powered this guide

Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.