Article

How to Fix NET::ERR_CERT_AUTHORITY_INVALID

NET::ERR_CERT_AUTHORITY_INVALID means the browser doesn't trust who issued the certificate — it's self-signed, from an unknown CA, or the intermediate chain is missing. Owners install the full chain from a trusted CA (or fix the intermediate); visitors should not proceed on sensitive sites.

By Paul Rudenko, Security ResearcherUpdated Jun 26, 20267 min read

NET::ERR_CERT_AUTHORITY_INVALID means the browser doesn't trust who issued the certificate — it's self-signed, from an unknown CA, or the intermediate chain is missing. Owners install the full chain from a trusted CA (or fix the intermediate); visitors should not proceed on sensitive sites.

What does this error actually mean?

When you connect to a site over HTTPS, the server presents a certificate. The browser checks two things: that the certificate matches the domain, and that it was issued by a Certificate Authority (CA) the browser already trusts.

ERR_CERT_AUTHORITY_INVALID is the second check failing. The certificate may be perfectly valid and unexpired, but the browser cannot trace it back to a trusted root, so it refuses to vouch for the connection. The path-building rules browsers follow here are specified in RFC 5280, the X.509 certificate and chain-validation standard.

There are three common causes, and they look identical to a visitor:

  • Self-signed certificate. The server generated and signed its own certificate. No external authority vouches for it, so no browser trusts it by default. Common on internal tools, routers, NAS devices, and local development.
  • Unknown or untrusted CA. The certificate was issued by a CA that isn't in the browser's trust store — a private internal CA, a regional authority, or one that was distrusted.
  • Missing intermediate certificate. The certificate comes from a perfectly trusted CA, but the server only sends the leaf certificate and omits the intermediate certificates that link it to the trusted root. The chain is broken, so the browser can't complete the path.

That last cause is the one that catches site owners off guard, because the certificate is genuinely fine — only the way the server presents it is wrong.

If you're just visiting

If you're a visitor and not the site owner, an untrusted issuer is a meaningful signal. The browser is telling you it cannot confirm who really controls the certificate. That doesn't always mean an attack is underway — but it does mean the usual guarantee that you're talking to the real site has not been established.

Why "Proceed anyway" is riskier here

Some certificate warnings are mild (for example, a certificate that expired yesterday on a site you visit constantly). This one is different. An untrusted issuer is exactly the state a network attacker would produce if they intercepted your traffic and presented their own certificate.

If you proceed on a login page, a banking site, or anything where you enter personal data, you may be handing that data to whoever issued the certificate. On sensitive sites, do not click through — close the tab and reach the service another way.

Corporate proxies and antivirus root injection

There is one routine, benign cause worth knowing about. Many corporate networks and some antivirus products perform TLS inspection: they intercept HTTPS, decrypt it, scan it, then re-encrypt it with their own certificate.

For this to work without warnings, IT installs a custom root certificate into every managed device's trust store. On a properly managed machine you never see an error. But if that root isn't installed — a personal device on the office Wi-Fi, a fresh profile, or a browser that uses its own trust store — every site suddenly throws ERR_CERT_AUTHORITY_INVALID, because the proxy's issuer is unknown to you.

If only your work network is affected and your IT team confirms inspection is in place, that explains it. If you see it on a public network you don't control, treat it as a red flag, not a formality.

If you own the site

If this is your site, the fix is almost always about the certificate chain you serve. Work through these in order.

Use a publicly trusted CA

A self-signed certificate, or one from a private CA, will never be trusted by visitors' browsers unless they manually install your root — which is fine for internal tooling but wrong for a public site. Get a certificate from a publicly trusted authority.

The free, widely supported option is Let's Encrypt, typically issued automatically through a client like certbot. Once issued, a Let's Encrypt certificate chains to a root that every mainstream browser already trusts.

Install the full chain, not just the leaf

The single most common owner-side cause of this error is serving only the leaf (your domain's) certificate and forgetting the intermediates. The browser needs the complete path: leaf → intermediate(s) → trusted root. The root lives in the browser; you must supply the leaf and every intermediate. Most CAs give you two files — and choosing the wrong one is the trap. With Let's Encrypt you get:

  • cert.pem — the leaf certificate only. Serving this alone breaks the chain.
  • fullchain.pem — the leaf plus the intermediates. This is the one to serve.

Configure the chain correctly in nginx

In nginx the ssl_certificate directive must point at the file that contains the full chain, in the right order — leaf first, then intermediates:

server {
    listen 443 ssl;
    server_name example.com;

    # Use fullchain.pem (leaf + intermediates), NOT cert.pem
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

Order matters: the leaf certificate must come first in the file, followed by each intermediate up the chain. The trusted root is not included — clients already have it. After editing, reload nginx (nginx -t && systemctl reload nginx) and verify the chain rather than assuming it's fixed.

Not sure whether your certificate chain is complete and trusted?

Check your SSL configuration

Why does it work in Firefox but fail in Chrome?

Common gotcha: the site loads fine in Firefox but throws ERR_CERT_AUTHORITY_INVALID in Chrome. People assume Chrome is broken. It isn't — this is the signature of a missing intermediate certificate.

Firefox caches intermediate certificates it has seen before and can fill in a gap from its own cache, so a broken chain often still validates. Chrome historically did not rely on that cache the same way, so when the server omits the intermediate, Chrome has no way to complete the path and fails. The result is a certificate that "works" for some visitors and not others — which is the worst kind of bug to diagnose, because it looks random.

The fix is the same as above: serve fullchain.pem, not just the leaf cert.pem. Once the intermediates are included, every browser can build the chain and the inconsistency disappears.

For the full map of certificate and TLS errors, see the pillar guide on SSL/TLS errors. If you arrived here from the generic browser warning, the companion article on "Your connection is not private" explains the same situation from the visitor's side.

Frequently asked questions

What's the difference between self-signed and an untrusted CA?

Both produce the same browser error, but they're distinct situations. A self-signed certificate is one where the server signs its own certificate — there is no separate authority involved at all, so the certificate vouches only for itself. No browser trusts it by default. An untrusted CA, by contrast, means a real Certificate Authority did issue the certificate, but that authority simply isn't in the browser's trust store. This covers private internal CAs that companies run for their own systems, regional authorities a given browser hasn't included, and authorities that were once trusted but have since been distrusted. In practice the remedy differs: a self-signed certificate should be replaced with one from a publicly trusted CA for any public site, whereas an untrusted-CA error on internal tooling is usually fixed by distributing that CA's root certificate to the devices that need it.

Why does my Let's Encrypt certificate show this error?

Almost always because you're serving only the leaf certificate and not the intermediate certificates that chain it to the trusted root. Let's Encrypt issues you several files. The one named cert.pem contains just your domain's leaf certificate; on its own it leaves a gap in the chain that the browser can't bridge. The file you actually want to serve is fullchain.pem, which bundles the leaf together with the intermediates. If your web server configuration points ssl_certificate at cert.pem instead of fullchain.pem, browsers that don't cache intermediates will fail with ERR_CERT_AUTHORITY_INVALID even though the certificate itself is valid and current. Switch the configuration to fullchain.pem, reload the server, and re-test. This single change resolves the large majority of Let's Encrypt reports of this error, since the certificate was never the problem — the chain was incomplete.

Is it safe to proceed?

On anything sensitive, no. ERR_CERT_AUTHORITY_INVALID means the browser can't confirm who controls the certificate, and that is exactly the state a network attacker intercepting your traffic would produce by presenting their own certificate. If you proceed on a login page, a banking site, or any page where you enter personal data, you may be sending it to whoever issued that certificate rather than the real site. There are benign causes — a corporate TLS-inspection proxy whose root isn't installed on your device, or a self-signed certificate on an internal tool you personally manage. If you can positively confirm the cause is one of those, proceeding may be reasonable. But if you can't explain the warning, especially on a public network you don't control, treat it as a stop sign: close the tab and reach the service through a trusted bookmark or app instead.

How do I fix it on nginx or Apache?

The fix is the same in spirit on both: make the server present the full chain, not just the leaf. On nginx, point the ssl_certificate directive at fullchain.pem (leaf plus intermediates) rather than cert.pem, keep ssl_certificate_key pointing at the private key, then run nginx -t to validate and systemctl reload nginx to apply. On Apache, set SSLCertificateFile to your leaf certificate and SSLCertificateKeyFile to the key; on modern versions you can also append the intermediates to the certificate file, or on older versions use the separate SSLCertificateChainFile directive to supply the intermediate bundle. After reloading Apache (apachectl configtest then systemctl reload apache2 or httpd), re-test the chain rather than trusting that it worked. An external check confirms whether the served chain is complete from leaf to root.

Related guides

See your whole external attack surface

One page is a start. The full external scan covers TLS, headers, DNS, exposed files, open services and known-exploited CVEs across your whole domain.

See the full scan →