NET::ERR_CERT_AUTHORITY_INVALID means the browser couldn't trace the site's certificate back to a certificate authority (CA) it trusts. The certificate is self-signed, issued by a private or corporate CA, or served without the intermediate certificate that links it to a trusted root. Chrome and Edge show it as "Your connection is not private".
Your connection is not private
Attackers might be trying to steal your information from example.com
(for example, passwords, messages, or credit cards).
NET::ERR_CERT_AUTHORITY_INVALID
Other clients report the same problem in their own words:
Firefox: SEC_ERROR_UNKNOWN_ISSUER
curl: curl: (60) SSL certificate problem: unable to get local issuer certificate
curl: curl: (60) SSL certificate problem: self-signed certificate
Node.js: Error: unable to verify the first certificate
Python: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
Go: x509: certificate signed by unknown authority
Common causes
- Self-signed certificate. Common on dev servers, routers, NAS boxes, Home Assistant and internal tools.
- Missing intermediate certificate. The server sends only its own certificate, not the chain. Some browsers fill the gap by fetching the intermediate themselves, so the site works in one browser and fails in another, or in
curl. - Private or corporate CA. An internal CA that your device doesn't have installed.
- HTTPS interception. Antivirus HTTPS scanning, a corporate proxy, or a public Wi-Fi login page re-signs traffic with its own certificate.
- Outdated trust store. Old devices that don't have newer root certificates.
A wrong system clock usually shows ERR_CERT_DATE_INVALID instead, and a certificate for the wrong hostname shows ERR_CERT_COMMON_NAME_INVALID.
How to fix it as a visitor
- Don't click "Proceed" on a site where you'll log in or pay.
- Try another network. If it works on mobile data, the Wi-Fi network is intercepting HTTPS. Open any
http://page to trigger a captive portal login. - Check antivirus HTTPS scanning and temporarily turn it off to test.
- Update the browser and OS so the trust store is current, and check your date and time.
- If it happens on one site only, it's the site's configuration. Tell the owner.
How to fix it as a developer or ops
Public sites: use a certificate from a public CA. Let's Encrypt is free and automated with Certbot, Caddy, Traefik or cert-manager on Kubernetes. Then serve the full chain:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # not cert.pem
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Check what the server actually sends:
openssl s_client -connect example.com:443 -servername example.com -showcerts
Look for Verify return code: 0 (ok). unable to get local issuer certificate means the chain is incomplete.
Behind Cloudflare: the visitor sees Cloudflare's certificate, so the origin's certificate only matters in Full (strict) mode. There, a self-signed origin causes Error 526; use a Cloudflare Origin CA certificate or a public one.
Local development: a self-signed certificate will always trigger this error. Use mkcert to create a locally trusted CA and certificate for localhost and 127.0.0.1, or serve plain HTTP locally and use a tunnel when you need a public HTTPS URL.
Internal services: distribute your private CA to clients instead of disabling verification. For Node.js set NODE_EXTRA_CA_CERTS, for Python REQUESTS_CA_BUNDLE or SSL_CERT_FILE. Avoid NODE_TLS_REJECT_UNAUTHORIZED=0, curl -k and verify=False outside a quick local test.
On a webhook endpoint
Webhook providers verify your endpoint's certificate the same way a browser does, and they don't show a "proceed anyway" button. A self-signed or incomplete-chain certificate means every delivery fails, often logged on the provider side only as a TLS or connection error.
You have three options:
- Fix the certificate on a public endpoint: public CA, full chain.
- Don't expose the server at all.
relay forward --bucket my-app http://localhost:3000/webhooksgives providers a public HTTPS webhook URL, and the agent delivers to your local or internal app over an outbound connection, so the app needs no public certificate. See receive webhooks on localhost. - Deliver to a self-signed destination you control. Webhook Relay outputs have a TLS verification toggle under Delivery controls. Turning it off for one internal destination lets webhooks through instead of failing with
certificate verify failed. Only do this for destinations you trust, typically on a private network. Details are in the TLS/SSL error reference.
If the error is about protocol versions or ciphers rather than trust, see ERR_SSL_VERSION_OR_CIPHER_MISMATCH.
