Fix NET::ERR_CERT_AUTHORITY_INVALID: Owner's Guide

By Bug Circuit Security Team
Fix NET::ERR_CERT_AUTHORITY_INVALID: Owner's Guide

If your own website shows NET::ERR_CERT_AUTHORITY_INVALID, the cause is on your server, not your visitor's browser — and it's almost always one of three things: a missing intermediate certificate, a Let's Encrypt renewal that silently failed, or the wrong certificate installed for that domain. All three are fixable in under 30 minutes without special tools.

Who this is for

This is written for the person who owns the site — not a visitor wondering whether it's safe to click "Advanced" and proceed. If that's you, skip the reassurance and go straight to the diagnosis below. You'll come away knowing exactly which of the three causes you have and the commands or settings to fix it, whether you're running WordPress on shared hosting, a Shopify custom domain, or your own Nginx/Apache server.

What this error actually means

Every SSL/TLS certificate is issued by a Certificate Authority (CA) — a company like Let's Encrypt, DigiCert, or Sectigo that browsers agree to trust. NET::ERR_CERT_AUTHORITY_INVALID means Chrome couldn't verify that chain of trust: either it can't find the CA that supposedly issued your certificate, or the certificate is self-signed (issued by your own server, not a real CA). Google's own explanation of Chrome connection errors covers this family of warnings and why the browser blocks the page instead of just showing a note (Chrome Help: Fix connection errors).

This is different from a hostname mismatch, which throws NET::ERR_CERT_COMMON_NAME_INVALID instead — more on that below, since owners often mix the two up after a migration.

Cause 1: Missing intermediate certificate

This is the most common cause by far. Your certificate isn't signed directly by a root CA that's built into every browser — it's signed by an intermediate certificate, which is in turn signed by the root. If your server only serves your certificate and skips the intermediate, browsers and command-line tools can't complete the chain, even though the certificate itself is perfectly valid.

How to check:

openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null | openssl x509 -noout -issuer -dates

If this hangs, errors, or a fuller openssl s_client run reports Verify return code: 21 (unable to verify the first certificate), your chain is incomplete.

How to fix it:

  • Nginx — your config must point to the fullchain file, not the bare certificate: ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; (not cert.pem). Reload with sudo nginx -t && sudo systemctl reload nginx.
  • Apache — make sure SSLCertificateChainFile (older Apache) or a combined SSLCertificateFile that includes the intermediate is set, then run sudo apachectl configtest && sudo systemctl reload apache2.
  • cPanel / shared hosting — go to WHM → SSL/TLS → Install an SSL Certificate and paste the full bundle your CA gave you (certificate + intermediate), or simply re-run AutoSSL under WHM → Manage AutoSSL.
  • Managed WordPress hosts (SiteGround, Kinsta, WP Engine, Bluehost) — toggle SSL off and back on in the hosting dashboard. These hosts manage the chain for you, and forcing a re-issue usually clears it within minutes.

Cause 2: Your Let's Encrypt certificate didn't renew

Let's Encrypt certificates are only valid for 90 days by design, specifically so renewal gets automated instead of forgotten (Let's Encrypt: why ninety-day lifetimes). If the renewal cron job or systemd timer silently broke — a common cause is a firewall change, a moved webroot, or a full disk — the old certificate simply expires and the browser correctly refuses it.

How to check:

sudo certbot certificates

This lists every certificate Certbot manages and its expiry date. If it's expired or marked "INVALID," that's your answer.

How to fix it:

  1. Run a dry run first so you don't hit issuance rate limits: sudo certbot renew --dry-run
  2. If that succeeds, renew for real: sudo certbot renew
  3. Reload your web server: sudo systemctl reload nginx (or apache2)
  4. Confirm the renewal timer is actually active: systemctl list-timers | grep certbot

On shared hosting you likely don't run Certbot yourself — the host does. Contact support or re-trigger the SSL section of your control panel; a stuck AutoSSL job is the shared-hosting equivalent of a broken cron job.

Cause 3: Wrong certificate for the domain (a related, easily confused error)

If you recently migrated hosts, added www, or moved to a new server, and the installed certificate doesn't actually list your current domain, Chrome shows NET::ERR_CERT_COMMON_NAME_INVALID — a sibling error, not the same one, but people search for them interchangeably. This is exactly the "connection not private after renewing hosting" scenario: the new host issued a certificate before DNS had fully pointed at it, or issued one for the wrong subdomain, and visitors end up seeing a certificate meant for a different server.

How to check: open your site in Chrome, click the "Not secure" warning, then "Certificate is not valid," and compare the domain names listed on the certificate to the domain in your address bar.

How to fix it:

  • Confirm DNS is fully propagated to the new host before re-issuing (dig yourdomain.com should return the new host's IP everywhere you check).
  • Re-issue the certificate explicitly for every hostname you serve, including both yourdomain.com and www.yourdomain.com if visitors reach both.
  • Check for a CAA DNS record blocking issuance — if one exists, it must explicitly allow your CA, e.g. yourdomain.com. CAA 0 issue "letsencrypt.org".

Cause 4: A leftover self-signed or staging certificate

If a developer, migration script, or a default Nginx/Apache install left a self-signed certificate active — or you tested with Let's Encrypt's staging environment and forgot to switch to production — the certificate is technically valid but issued by something no browser trusts. Re-issue a real production certificate and remove the placeholder; there's no configuration fix for a self-signed cert other than replacing it.

Quick diagnostic checklist

  • [ ] Run the openssl s_client command above — does the chain complete without errors?
  • [ ] Run sudo certbot certificates (or check your host's SSL panel) — is the certificate expired?
  • [ ] Open the certificate details in Chrome — does the "Issued to" domain match your actual domain?
  • [ ] Check the "Issued by" field — is it a real CA (Let's Encrypt, DigiCert, Sectigo) or does it show your own server name?
  • [ ] Check DNS with dig — does your domain currently point at the server you believe issued the certificate?
SymptomLikely causeFastest fix
Verify return code: 21 in opensslMissing intermediate certServe fullchain.pem, not cert.pem
Certificate expired today or recentlyFailed Let's Encrypt renewalcertbot renew, check the systemd timer
Certificate lists a different domainWrong cert for new host/domainRe-issue after DNS fully propagates
Issuer shows your own server nameSelf-signed/staging leftoverReplace with a real production cert

After you fix it: confirm it actually worked

Don't just trust that your own browser stopped complaining — it may have cached the old certificate. Test from a clean environment with the Qualys SSL Labs test, which shows the full chain, expiry, and any remaining issues a browser would catch. It's free and doesn't require an account.

While you're checking your site's security setup, it's worth a broader pass — a missing intermediate certificate is exactly the kind of small, easy-to-miss configuration gap that tends to show up alongside other issues, like missing security headers. Our free website security headers checker flags those in about ten seconds, and our guide to spotting hackable configuration issues covers the other common gaps we see on small business sites.

Key takeaways

  • NET::ERR_CERT_AUTHORITY_INVALID means the browser can't verify who issued your certificate — check the chain, the expiry date, and the domain it was issued for, in that order.
  • A missing intermediate certificate is the single most common cause; make sure your server serves fullchain.pem (or the equivalent combined bundle), not the bare certificate.
  • Let's Encrypt certificates expire every 90 days on purpose — confirm certbot renew --dry-run actually succeeds and the renewal timer is running, rather than assuming it is.
  • After a host migration, re-issue the certificate only once DNS has fully propagated, and cover every hostname (www and non-www) your visitors actually use.
  • Verify the fix with an independent tool like SSL Labs, since your own browser may still be showing you a cached, broken certificate.

If you'd rather have a human double-check the whole setup — not just the certificate, but the configuration issues that tend to travel with it — a Circuit audit is a one-time $49 manual review of your entire site with a full written report, or run a free passive check first if you just want a quick yes/no on anything critical.

Want certainty, not guesswork?

A real human security engineer audits your whole site by hand and sends a full report — every issue, its severity, and the exact fix. From $49, with a 14-day money-back guarantee.

See pricing

Common questions

How do I fix net::err_cert_authority_invalid on my website?
Check three things in order: run `openssl s_client -connect yourdomain.com:443 -servername yourdomain.com` to see if the certificate chain completes, run `sudo certbot certificates` to check for an expired renewal, and compare the domain listed on the certificate to your actual domain. Most cases are fixed by serving the full certificate chain (`fullchain.pem`) or re-running `certbot renew`.
How do I fix an SSL certificate not trusted error on WordPress?
On managed WordPress hosting, toggle SSL off and back on in your host's dashboard, or re-run AutoSSL if you're on cPanel — this forces a clean re-issue of the certificate and its chain. If you manage your own server, confirm your web server config points to the full certificate chain rather than the bare certificate file.
Why does it say connection not private after renewing hosting?
This usually means the new host issued a certificate before your DNS had fully pointed at it, or issued one that doesn't cover both `www` and non-`www` versions of your domain. Wait for DNS to fully propagate, then re-issue the certificate for every hostname visitors actually use.
Is NET::ERR_CERT_AUTHORITY_INVALID dangerous for visitors?
It means the browser can't confirm your site's identity, so it blocks the connection to protect visitors from a potential impersonation attack — it doesn't necessarily mean your site has been hacked. Still, treat it as urgent: visitors and search engines will avoid a site showing this warning until it's fixed.
How long does it take for an SSL fix to show up for visitors?
Usually minutes, but it can take longer if a CDN or reverse proxy is caching the old certificate, or if DNS changes are still propagating. Test in an incognito window or with an independent tool like the Qualys SSL Labs test rather than relying on your own browser, which may have cached the broken certificate.

Keep reading

See what attackers see — free

Run the free passive check on your domain. No login, no impact on your site, results in seconds.

Passive recon only. No login, and no impact on your site. Deeper testing needs domain verification.

Ready for the full manual audit? See transparent pricing →

Published by Bug Circuit. Written with AI assistance and reviewed for accuracy before publishing.