Skip to content
Hosting Operations11 min read

NET::ERR_CERT_AUTHORITY_INVALID: 5 Fixes Compared

Fix NET::ERR_CERT_AUTHORITY_INVALID by comparing self-signed certs, Let's Encrypt, commercial CAs, local trust, and proxy issues—with clear trade-offs.

Written by Abdul AbrorTechnical Hosting Support Engineer
man in white suit jacket and black pants illustration
On this page

TL;DR — Key takeaways

  • NET::ERR_CERT_AUTHORITY_INVALID means the browser can't verify your certificate's issuer—usually from self-signed certs, expired root CAs, or incomplete certificate chains.
  • Let's Encrypt provides free, auto-renewing certificates trusted by all modern browsers and is the fastest fix for production sites with public domains.
  • Self-signed certificates work for internal testing but require manual trust installation on every client device and will always trigger browser warnings for visitors.
  • Commercial CAs offer extended validation and wildcard options but cost $50–$300/year and require the same ACME automation or manual renewal as free alternatives.
  • Always verify your full certificate chain is served (certificate + intermediates) and check that your server's system time is accurate to prevent validation failures.

You load your site and Chrome shows a red padlock with NET::ERR_CERT_AUTHORITY_INVALID. Firefox calls it SEC_ERROR_UNKNOWN_ISSUER. Same problem: the browser doesn't trust whoever signed your SSL certificate.

I've walked dozens of hosting customers through this error. The fix depends entirely on why the certificate isn't trusted—self-signed for testing, missing intermediate chain, expired root CA, or a configuration mistake. Each approach has trade-offs in cost, automation, and browser compatibility. This comparison breaks down the five main options, when each makes sense, and how to implement them correctly.

What NET::ERR_CERT_AUTHORITY_INVALID Actually Means

Browsers maintain a list of trusted certificate authorities. When your server presents a certificate, the browser walks the chain from your cert up to a root CA it recognizes. If that chain is broken or ends at an untrusted root, you get this error.

Common causes: you're using a self-signed certificate that acts as its own authority, your server isn't sending intermediate certificates that bridge your cert to a trusted root, the root CA expired or was removed from browser trust stores, or your system clock is far enough off that time-based validation fails.

Check the error details in browser devtools. Chrome's Security tab shows which part of the chain failed. Firefox's certificate viewer under Page Info does the same. That tells you whether the problem is a missing intermediate, an untrusted root, or a self-signed cert.

Option 1: Let's Encrypt (Free Automated Certificates)

Let's Encrypt is a free certificate authority that issues domain-validated certificates trusted by every modern browser. Certificates last 90 days and renew automatically with certbot or similar ACME clients.

Trade-offs: you need a public domain name that resolves to your server (no IP-only certificates), port 80 or 443 must be accessible for domain validation challenges, and you're limited to domain validation—no organization validation or extended validation green bar. Wildcard certificates require DNS-based validation, which means API access to your DNS provider or manual TXT record updates every 90 days.

Implementation takes about 10 minutes. Install certbot, run certbot --nginx or certbot --apache depending on your web server, and it handles certificate issuance and configuration automatically. Set up a cron job or systemd timer to run certbot renew twice daily. The client checks expiration and renews certificates with less than 30 days remaining.

This is the default choice for production sites. It's free, automated, and trusted everywhere. The 90-day expiration is a feature, not a bug—it forces automation and limits the damage window if a private key is compromised.

  • Zero cost, unlimited certificates per domain
  • Automatic renewal eliminates manual tracking
  • Trusted by 99.9% of browsers and operating systems
  • Rate limits: 50 certificates per registered domain per week
  • No IP certificates or certificates for internal hostnames

Option 2: Self-Signed Certificates (Development Only)

A self-signed certificate is one where you act as your own certificate authority. You generate a private key and certificate, sign it yourself, and configure your server to use it. Browsers don't trust it because you're not in their root CA list.

Use this for local development, internal testing, or private networks where you control every client. Don't use it for production sites that external users access. Every visitor will see a security warning, and many will leave rather than click through.

Generate one with OpenSSL: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes. Answer the prompts (common name should match your hostname), then configure your web server to use key.pem and cert.pem. Browsers will complain, but the connection is still encrypted—just not verified by a trusted third party.

To avoid warnings during local development, add the certificate to your operating system's trust store. On macOS, open Keychain Access and import the .pem file into the System keychain, then set it to Always Trust. On Windows, import it into the Trusted Root Certification Authorities store via certmgr.msc. On Linux, copy it to /usr/local/share/ca-certificates/ and run update-ca-certificates.

  • Free and works without internet access or domain names
  • Full control over certificate contents and expiration
  • No dependency on external certificate authorities
  • Requires manual trust installation on every client device
  • Produces security warnings for any external visitor

Option 3: Commercial Certificate Authorities

Commercial CAs like DigiCert, Sectigo, and GlobalSign charge $50 to $300 per year for certificates. You get the same domain validation as Let's Encrypt, plus optional organization validation (shows company name in certificate details) or extended validation (green address bar in older browsers, though most modern browsers removed that indicator).

Trade-offs: you pay annually, you manage renewal manually unless you set up ACME automation (most commercial CAs now support it), and the trust model is identical to Let's Encrypt—they're all in the same browser root stores. Wildcard certificates cost more, typically $200–$400/year.

The value proposition is customer support, longer certificate lifespans (though maximum validity dropped to 398 days in 2020, matching Let's Encrypt's practical limit), insurance policies that may cover losses from certificate-related incidents, and the OV/EV options if you need to display organizational identity.

For most use cases, Let's Encrypt provides the same technical outcome. Consider a commercial CA if you need OV/EV for compliance or customer perception, if you want a single vendor for support, or if you're already paying for a bundle that includes certificates.

  • Organization validation and extended validation options
  • Vendor support and SLAs for enterprise customers
  • Multi-year purchases (issued annually due to browser limits)
  • Same trust as Let's Encrypt for domain-validated certificates
  • Costs $50–$400/year depending on validation level and SAN count

Option 4: Fixing Incomplete Certificate Chains

You might already have a valid certificate from Let's Encrypt or a commercial CA but still see the error. That usually means your server isn't sending the intermediate certificates that connect your certificate to a trusted root.

Certificate authorities issue intermediate CAs that sign your certificate. Browsers need the full chain: your certificate, the intermediate(s), and sometimes the root (though roots are already in the browser's trust store, so including them is optional). If you only configure your server with your certificate file, the chain is broken.

Check with openssl s_client -connect yourdomain.com:443 -servername yourdomain.com. Look for multiple certificate blocks in the output. You should see at least two: your certificate and the intermediate. If you only see one, your server isn't sending the intermediates.

Fix it by downloading the intermediate certificates from your CA's website (Let's Encrypt's are at letsencrypt.org/certificates, commercial CAs provide them in your download bundle). Concatenate them into a single file: cat your-cert.crt intermediate.crt > fullchain.crt. Then configure your web server to use fullchain.crt instead of your-cert.crt. Certbot does this automatically and creates fullchain.pem for you.

  • Test chain completeness with SSL Labs or openssl s_client
  • Intermediate certificates are provided by your CA, not generated by you
  • Order matters: your certificate first, then intermediates, then optionally root
  • Modern ACME clients handle chain building automatically
  • Missing intermediates cause errors on some browsers but not others

When System Time and Proxy Issues Cause Validation Failures

Certificates include notBefore and notAfter timestamps. If your server's system clock is wrong, the certificate appears expired or not yet valid, and validation fails.

Check with date on Linux or macOS, Get-Date on Windows. If it's off by more than a few minutes, fix it. Enable NTP with systemctl enable --now systemd-timesyncd on systemd-based Linux distributions or configure your OS's time sync settings. Cloud instances and VMs sometimes have clock drift issues, especially after snapshots or suspend/resume cycles.

Corporate proxies and antivirus software can also trigger this error. Some proxies perform SSL inspection by replacing your certificate with one signed by the proxy's own CA. If that CA isn't in the client's trust store, you get NET::ERR_CERT_AUTHORITY_INVALID even though the origin server's certificate is fine.

Test from outside your network to isolate proxy issues. If the error only appears on your corporate network, ask your IT team whether SSL inspection is enabled and request the proxy's root certificate for installation. For antivirus software, check if it has an HTTPS scanning feature and either disable it or add your development domain to its exclusion list.

  • System time within 5 minutes of actual time is required for validation
  • NTP sync prevents clock drift on servers and VMs
  • Proxy SSL inspection replaces certificates with proxy-signed versions
  • Antivirus HTTPS scanning can inject its own CA into the trust chain
  • Test from multiple networks and devices to identify proxy or local trust issues

Comparison Summary and Recommendations

For production websites with public domain names, use Let's Encrypt. It's free, automated, and trusted by every browser. There's no reason to use a self-signed certificate for a public-facing site, and commercial CAs only make sense if you need organization validation or already have a support contract.

For local development and internal tools, self-signed certificates are fine as long as you install them in your local trust store to avoid constant security warnings. Don't expose them to external users.

If you're already using a valid certificate but still seeing the error, check for missing intermediate certificates first. Run openssl s_client to verify the chain, then fix your server configuration to serve the full chain. This is the most common cause I've seen in support tickets after self-signed certificates.

Commercial CAs make sense in regulated industries where auditors expect to see OV or EV certificates, or when you're consolidating vendor relationships and want a single support contact. For pure technical capability, they're identical to Let's Encrypt at domain validation level.

System time and proxy issues are environmental problems, not certificate problems. Fix the root cause—enable NTP, install proxy certificates, or adjust antivirus settings—rather than working around them by disabling certificate validation.

Quick troubleshooting checklist

  • Check certificate expiration date with openssl s_client or browser devtools
  • Verify the complete certificate chain is configured on your web server
  • Confirm server system time is within 5 minutes of actual time
  • Test certificate with SSL Labs or similar scanning tool
  • Check that domain name matches certificate CN or SAN entries
  • Verify firewall allows outbound traffic on port 80 for ACME challenges
  • Review web server error logs for certificate loading failures
  • Test from multiple browsers and devices to isolate client-side trust issues

FAQ

What causes NET::ERR_CERT_AUTHORITY_INVALID in Chrome and Firefox?

The browser can't verify the certificate's issuing authority. This happens when you use a self-signed certificate without installing it in the client's trust store, when intermediate certificates are missing from the server configuration, when the root CA has expired or been removed from the browser's trust list, or when the system clock is wrong and causes time-based validation to fail.

Can I use a self-signed certificate for a production website?

No. Self-signed certificates will trigger security warnings for every visitor because browsers don't trust certificates that aren't signed by a recognized certificate authority. Use Let's Encrypt for free automated certificates or a commercial CA if you need extended validation. Self-signed certificates are only appropriate for internal development environments or private networks where you control all client devices.

How do I fix missing intermediate certificates on nginx or Apache?

Concatenate your certificate and the CA's intermediate certificates into a single file in the correct order: your certificate first, then intermediates, then optionally the root. For nginx, reference this combined file in the ssl_certificate directive. For Apache, use SSLCertificateFile for your cert and SSLCertificateChainFile for intermediates, or combine them like nginx. You can download intermediate certificates from your CA's website or extract them from the .crt bundle they provided.