Guides
9 min readUpdatedYour 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 code | Firefox code | What failed | Usually fixed by |
|---|---|---|---|
| NET::ERR_CERT_DATE_INVALID | SEC_ERROR_EXPIRED_CERTIFICATE | Expired or not yet valid, judged by the device's clock | Site owner (renew), or the visitor if the clock is wrong |
| NET::ERR_CERT_COMMON_NAME_INVALID | SSL_ERROR_BAD_CERT_DOMAIN | The name in the address bar is not on the certificate: www versus the bare domain, a new subdomain, a captive portal | Site owner, unless a Wi-Fi sign-in page is intercepting |
| NET::ERR_CERT_AUTHORITY_INVALID | SEC_ERROR_UNKNOWN_ISSUER or MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT | Self-signed or private-CA certificate, missing intermediate, or an interception product's certificate | Site owner, or the visitor if antivirus or a proxy intercepts |
| NET::ERR_CERT_REVOKED | SEC_ERROR_REVOKED_CERTIFICATE | The issuing CA revoked the certificate | Site owner (reissue); visitors cannot proceed |
| NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM or NET::ERR_CERT_WEAK_KEY | No single equivalent | An outdated signature algorithm or a key that is too small | Site owner (reissue) |
| NET::ERR_CERT_INVALID, NET::ERR_CERT_VALIDITY_TOO_LONG, NET::ERR_CERT_NAME_CONSTRAINT_VIOLATION or NET::ERR_CERT_NON_UNIQUE_NAME | No single equivalent | A malformed certificate, one valid for longer than allowed, a name outside the issuing CA's constraints, or an internal name that is not unique | Site owner (reissue from a public CA) |
| NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED | No equivalent | A publicly trusted certificate without valid Certificate Transparency information | Site owner or the CA |
| NET::ERR_CERT_KNOWN_INTERCEPTION_BLOCKED | No direct equivalent | A certificate known to be used for interception by someone other than the device owner | Visitor 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 host | OpenSSL verify result | What a browser reports |
|---|---|---|
| expired.badssl.com | 10 (certificate has expired) | NET::ERR_CERT_DATE_INVALID |
| wrong.host.badssl.com | 62 (hostname mismatch) | NET::ERR_CERT_COMMON_NAME_INVALID |
| self-signed.badssl.com | 18 (self-signed certificate) | NET::ERR_CERT_AUTHORITY_INVALID |
| untrusted-root.badssl.com | 19 (self-signed certificate in certificate chain) | NET::ERR_CERT_AUTHORITY_INVALID |
| incomplete-chain.badssl.com | 21 (unable to verify the first certificate); only the server's own certificate is sent, without its intermediate | Varies by browser: may load, or show AUTHORITY_INVALID |
| revoked.badssl.com | 0 (ok): revocation is not checked by default | May show NET::ERR_CERT_REVOKED, depending on revocation data |
# 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.
# 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
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
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.
- 01Chromium net_error_list.h: certificate error codes and their causes · Chromium
- 02Chromium security interstitial strings (Privacy error, clock and captive portal pages) · Chromium
- 03Firefox certificate error page strings (netError.ftl) · Mozilla
- 04Firefox certificate error strings (certError.ftl: clock, MITM and security risk pages) · Mozilla
- 05Chromium ssl_error_options_mask.cc: certificate errors that cannot be bypassed · Chromium
- 06NSS error codes (secerr.h: expired, revoked, unknown issuer) · Mozilla
- 07NSS SSL error codes (sslerr.h: SSL_ERROR_BAD_CERT_DOMAIN) · Mozilla
- 08mozilla::pkix error codes (pkixnss.h: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT) · Mozilla
- 09Firefox 120 release notes: imports user-added roots from the operating system · Mozilla
- 10If you see a 'Not Secure' warning while browsing with Safari · Apple Support
- 11RFC 6797, HTTP Strict Transport Security, sections 8.4 and 12.1: No User Recourse · RFC Editor
- 12RFC 6962, Certificate Transparency · RFC Editor
- 13Chrome Certificate Transparency Policy · Google Chrome
- 14Preloading Intermediate CA Certificates into Firefox · Mozilla Security Blog
- 15HTTPS Interception Weakens TLS Security (TA17-075A) · CISA
- 16Ballot SC-081v3: reducing certificate validity and data reuse periods · CA/Browser Forum
- 17openssl-s_client manual (OpenSSL 3.0) · OpenSSL
- 18badssl.com test hosts · badssl.com
Last updated