Guides

9 min readUpdated

Your connection is not private: what the warning means and how to fix it

Quick answer

"Your connection is not private" is the warning Chrome and other Chromium-based browsers show when a website's TLS certificate fails verification, before any page data is exchanged. The code under it says why: an expired certificate or a wrong device clock (ERR_CERT_DATE_INVALID), a certificate for another name (COMMON_NAME_INVALID) or an issuer the browser does not trust (AUTHORITY_INVALID). Visitors can fix clock, Wi-Fi sign-in and HTTPS-scanning causes; the rest needs the site owner.

01What does "Your connection is not private" mean?

The page appears when the server's certificate fails one of three checks: it must be within its validity dates, issued for the exact name in the address bar, and chain up to a certificate authority the device trusts. Chromium titles the tab "Privacy error" and stops before any page content, cookies or form data are exchanged. Firefox shows "Warning: Potential Security Risk Ahead" for the same failures; Apple's support article lists Safari warnings such as "This Connection Is Not Secure".

Chromium's source code lists the possibilities plainly: an attacker presenting a certificate, a misconfigured server, a wrong clock, or a Wi-Fi network redirecting to its sign-in page. The browser cannot tell them apart, so the warning assumes the worst. How certificates and the handshake work is covered in what is SSL/TLS.

02Which NET::ERR_CERT code do I have, and who has to fix it?

Click the error code under the warning, or open the certificate viewer, to see the exact reason. The table maps the common Chromium codes to their Firefox equivalents, the check that failed and the side that can fix it.

Chrome or Edge codeFirefox codeWhat failedUsually fixed by
NET::ERR_CERT_DATE_INVALIDSEC_ERROR_EXPIRED_CERTIFICATEExpired or not yet valid, judged by the device's clockSite owner (renew), or the visitor if the clock is wrong
NET::ERR_CERT_COMMON_NAME_INVALIDSSL_ERROR_BAD_CERT_DOMAINThe name in the address bar is not on the certificate: www versus the bare domain, a new subdomain, a captive portalSite owner, unless a Wi-Fi sign-in page is intercepting
NET::ERR_CERT_AUTHORITY_INVALIDSEC_ERROR_UNKNOWN_ISSUER or MOZILLA_PKIX_ERROR_SELF_SIGNED_CERTSelf-signed or private-CA certificate, missing intermediate, or an interception product's certificateSite owner, or the visitor if antivirus or a proxy intercepts
NET::ERR_CERT_REVOKEDSEC_ERROR_REVOKED_CERTIFICATEThe issuing CA revoked the certificateSite owner (reissue); visitors cannot proceed
NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM or NET::ERR_CERT_WEAK_KEYNo single equivalentAn outdated signature algorithm or a key that is too smallSite owner (reissue)
NET::ERR_CERT_INVALID, NET::ERR_CERT_VALIDITY_TOO_LONG, NET::ERR_CERT_NAME_CONSTRAINT_VIOLATION or NET::ERR_CERT_NON_UNIQUE_NAMENo single equivalentA malformed certificate, one valid for longer than allowed, a name outside the issuing CA's constraints, or an internal name that is not uniqueSite owner (reissue from a public CA)
NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIREDNo equivalentA publicly trusted certificate without valid Certificate Transparency informationSite owner or the CA
NET::ERR_CERT_KNOWN_INTERCEPTION_BLOCKEDNo direct equivalentA certificate known to be used for interception by someone other than the device ownerVisitor or the network operator

03What causes the warning on the visitor's side?

If many unrelated sites fail at once, the cause is the device or the network, not the sites. Three causes cover most of these cases.

A wrong clock. Validity is checked against the device's own time, so a clock that is far off makes valid certificates look expired or not yet valid. Chrome then says "Your clock is behind" or "Your clock is ahead", Firefox "Your Computer Clock is Wrong". Turn on automatic date and time and reload.

A captive portal. Hotel, airport and train Wi-Fi often intercepts the first connection to show a sign-in page, which arrives with the portal's certificate. Chromium names this case under COMMON_NAME_INVALID and can show a "Connect to Wi-Fi" page instead. Complete the sign-in, then retry.

HTTPS scanning by antivirus software or a company proxy, which re-encrypts traffic with its own certificate; if the browser does not trust that root, every site fails with AUTHORITY_INVALID. Firefox starts from Mozilla's own root store; since Firefox 120 it also imports roots added to the operating system on Windows, macOS and Android, so on Linux, or with that import switched off, it can be the only browser that complains, with a page titled "Software is Preventing Firefox From Safely Connecting to This Site". Mozilla suggests switching off the feature that scans encrypted connections, or asking IT on a managed network. A 2017 US-CERT alert, now published by CISA, warned that many such products weaken TLS security.

  • Many sites fail at once: check the clock, then the network, then any HTTPS-scanning software
  • Only on one Wi-Fi network: complete the network's sign-in page first
  • Only in Firefox: an interception certificate the operating system trusts and Firefox does not, typically on Linux or with the import of system roots switched off
  • One site fails everywhere: its certificate is the problem, so tell the owner

04What causes it on the website's side?

If one site shows the warning on every device and network, the server presents a bad certificate. Behind a CDN or reverse proxy, visitors see the edge's certificate, not the origin's, so test the public hostname. Each of these causes can be confirmed from a terminal in a minute.

  • Expired certificate: renewal failed silently, or renewed a file the server never reloaded. Under CA/Browser Forum ballot SC-081, maximum lifetimes fall in steps from 398 to 47 days between March 2026 and March 2029, so manual renewal stops being realistic
  • Missing name: the certificate covers example.com but the visitor opened www.example.com, or a subdomain went live before its certificate
  • Incomplete chain: the server sends its certificate without the intermediate. Mozilla calls this one of the most common configuration problems; Firefox has preloaded known intermediates since version 68, so the site can work there and fail in other browsers, apps and curl
  • Wrong certificate for the name: sites sharing an IP address are picked by the requested name (SNI), so a missing or mistyped server name hands out the default site's certificate
  • Self-signed or private-CA certificate left on a public site after testing

05How do I test a certificate with openssl?

openssl s_client shows what a server presents and whether it verifies, independent of any browser. Pass -servername, so the server picks the certificate for that name (OpenSSL fills it in from a hostname given to -connect, but not when you connect to an IP address), and -verify_hostname, so OpenSSL checks the name as a browser does: without it, wrong.host.badssl.com verified as "0 (ok)" in testing. The results below are real, from the badssl.com hosts, which exist to fail in specific ways. s_client does not check revocation unless asked to, which explains the revoked host.

badssl.com hostOpenSSL verify resultWhat a browser reports
expired.badssl.com10 (certificate has expired)NET::ERR_CERT_DATE_INVALID
wrong.host.badssl.com62 (hostname mismatch)NET::ERR_CERT_COMMON_NAME_INVALID
self-signed.badssl.com18 (self-signed certificate)NET::ERR_CERT_AUTHORITY_INVALID
untrusted-root.badssl.com19 (self-signed certificate in certificate chain)NET::ERR_CERT_AUTHORITY_INVALID
incomplete-chain.badssl.com21 (unable to verify the first certificate); only the server's own certificate is sent, without its intermediateVaries by browser: may load, or show AUTHORITY_INVALID
revoked.badssl.com0 (ok): revocation is not checked by defaultMay show NET::ERR_CERT_REVOKED, depending on revocation data
Certificate checks with OpenSSL 3.0.22 (results above from the badssl.com hosts; replace example.com)
# does it verify, including the hostname? look for "Verify return code"
openssl s_client -connect example.com:443 -servername example.com \
  -verify_hostname example.com </dev/null 2>&1 | grep 'Verify return code'

# who issued it, for which names, and until when
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

# how many certificates does the server send? 1 usually means a missing intermediate
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null \
  | grep -c 'BEGIN CERTIFICATE'

# for scripts: exit status 1 instead of a printed code
openssl s_client -connect example.com:443 -servername example.com \
  -verify_hostname example.com -verify_return_error </dev/null >/dev/null 2>&1; echo $?

06How do I check for a wrong clock?

Compare the device's time with a server's. On Linux, timedatectl reports whether the clock is synchronised, and the Date header of any web server gives a second opinion. OpenSSL's -attime option shows the effect directly: the valid certificate for example.com failed as expired with the clock set to 2030 and as not yet valid with it set to 2020, which is what a browser sees on a device with a flat clock battery or a hand-set date.

Clock checks (systemd 252, curl 7.88.1 and OpenSSL 3.0.22)
# is the system clock synchronised?
timedatectl status | grep -E 'Universal time|synchronized'

# a server's idea of the time, for comparison
curl -sI https://example.com | grep -i '^date:'

# what a valid certificate looks like to a client with the wrong date
openssl s_client -connect example.com:443 -servername example.com \
  -attime $(date -d '2030-01-01' +%s) </dev/null 2>/dev/null | grep 'Verify return code'
#   Verify return code: 10 (certificate has expired)

07How do I look a certificate up in Certificate Transparency logs?

Public certificate authorities record what they issue in public Certificate Transparency logs (RFC 6962), and Chrome refuses publicly trusted certificates that do not comply with its CT policy. The logs are therefore a neutral record of what was issued for a domain. Search them in a browser at crt.sh, or from a terminal as below; each certificate usually appears twice, as a precertificate and as the final certificate.

Every hostname on a public certificate is visible in the logs, including servers you would rather keep quiet; how to hide your origin IP explains why that matters.

  • The warning says expired: if the logs show a newer certificate, renewal worked and the server still presents the old file
  • The warning says the name is missing: the logs show exactly which names each certificate covers
  • The certificate in the browser is not in the logs at all: it probably came from a private CA, such as antivirus software, a company proxy or a test setup
Unexpired certificates for a domain from crt.sh (curl 7.88.1, Python 3.11; replace example.com with your domain, as very large domains can time out)
curl -s 'https://crt.sh/?q=example.com&output=json&exclude=expired' \
  | python3 -m json.tool | grep -E '"(issuer_name|name_value|not_after)"'

08How do site owners stop the warning coming back?

Most certificate warnings are operational failures that recur, so fix the process as well as the certificate.

  • Automate issuance and renewal, and reload the web server after every renewal
  • Serve the full chain: your certificate followed by its intermediates, without the root
  • Cover every name visitors type, including www, because a redirect only happens after the certificate has been accepted
  • Monitor expiry from outside, for example with the openssl check and -attime set 30 days ahead
  • Watch the CT logs for certificates you did not request
  • Turn on HSTS only once all of this is reliable, because it removes the option to click through; the security headers guide covers the rollout

Questions

Frequently asked questions

Not on any site where you sign in, pay or enter personal details, because you cannot tell a misconfigured server from an attacker. On your own test server or a home router with a self-signed certificate, proceeding is a known risk you can choose to accept. Everywhere else, close the tab, check your clock and network, and if the warning persists, tell the site owner.

When the warning appears on many unrelated sites at once, the cause is on your side. The usual suspects are a wrong date or time on the device, a public Wi-Fi network that wants you to sign in first, or antivirus or company software that scans HTTPS traffic with its own certificate. Fix the clock, complete the Wi-Fi sign-in or switch off the scanning feature, then reload.

The browser could not link the site's certificate to a certificate authority it trusts. The certificate may be self-signed, issued by a private authority, served without its intermediate certificate, or replaced by interception software on your device or network. If only one site fails everywhere, its owner must install a certificate from a public authority with the full chain. If every site fails, look for HTTPS scanning on your device.

The certificate is outside its validity period according to your device's clock: it has either expired or is not valid yet. Check your date and time first, because a wrong clock causes this on every site. If the clock is right and only one site fails, its certificate has expired, and the owner needs to renew it and make the web server load the new file.

Usually because the site uses HSTS or its certificate has been revoked; on a managed device, an administrator's policy can also remove the option. HSTS tells the browser the site must only be loaded over a valid HTTPS connection, and the standard tells browsers to end such connections on any certificate error, with no way around it. That protects you from an attacker who could otherwise count on people clicking through. Check your clock and network, try again later, or contact the site.

Sources

Sources and verification

openssl s_client checks run with OpenSSL 3.0.22 against expired, wrong.host, self-signed, untrusted-root, incomplete-chain and revoked.badssl.com and against example.com (including -attime for 2020, 2030 and 30 days ahead, -showcerts counts and the -verify_return_error exit status); the crt.sh query run with curl 7.88.1 and Python 3.11; timedatectl from systemd 252. Debian 12, October 2026.

  1. 01Chromium net_error_list.h: certificate error codes and their causes · Chromium
  2. 02Chromium security interstitial strings (Privacy error, clock and captive portal pages) · Chromium
  3. 03Firefox certificate error page strings (netError.ftl) · Mozilla
  4. 04Firefox certificate error strings (certError.ftl: clock, MITM and security risk pages) · Mozilla
  5. 05Chromium ssl_error_options_mask.cc: certificate errors that cannot be bypassed · Chromium
  6. 06NSS error codes (secerr.h: expired, revoked, unknown issuer) · Mozilla
  7. 07NSS SSL error codes (sslerr.h: SSL_ERROR_BAD_CERT_DOMAIN) · Mozilla
  8. 08mozilla::pkix error codes (pkixnss.h: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT) · Mozilla
  9. 09Firefox 120 release notes: imports user-added roots from the operating system · Mozilla
  10. 10If you see a 'Not Secure' warning while browsing with Safari · Apple Support
  11. 11RFC 6797, HTTP Strict Transport Security, sections 8.4 and 12.1: No User Recourse · RFC Editor
  12. 12RFC 6962, Certificate Transparency · RFC Editor
  13. 13Chrome Certificate Transparency Policy · Google Chrome
  14. 14Preloading Intermediate CA Certificates into Firefox · Mozilla Security Blog
  15. 15HTTPS Interception Weakens TLS Security (TA17-075A) · CISA
  16. 16Ballot SC-081v3: reducing certificate validity and data reuse periods · CA/Browser Forum
  17. 17openssl-s_client manual (OpenSSL 3.0) · OpenSSL
  18. 18badssl.com test hosts · badssl.com

Last updated