Problem

Firefox stops you with “Warning: Potential Security Risk Ahead,” and behind the Advanced button sits the error code MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT and the line “The certificate is not trusted because it is self-signed.” The site loads fine in Chrome. It may even load fine in Firefox on another machine. This is Firefox telling you the certificate it received signed itself — there’s no chain back to any authority it trusts.

Symptoms

  • The error page shows MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT, not SEC_ERROR_UNKNOWN_ISSUER or SEC_ERROR_EXPIRED_CERTIFICATE.
  • The same URL opens without warning in Chrome or Edge on the same computer.
  • It fails everywhere in Firefox for a public site, or only on one machine for an internal one.
  • openssl s_client -connect host:443 -servername host reports verify error:num=18:self signed certificate and a chain exactly one certificate deep.
  • Common on staging servers, home routers, NAS boxes, printers, and appliances that ship a default certificate.

What This Error Actually Means

Every certificate names an Issuer (who vouched for it) and a Subject (who it’s for). In a normal chain those differ: your leaf certificate’s Issuer is an intermediate CA, whose Issuer is a root, whose certificate is in Firefox’s trust store. Firefox walks that chain up to a root it trusts, and the padlock appears.

A self-signed certificate is a chain of one. Its Issuer and Subject are identical — it vouches for itself. There’s nothing above it to walk to, and it isn’t a trusted root, so Firefox’s certificate verifier (mozilla::pkix) stops and reports the specific condition it found: the certificate is its own issuer. That specificity is the useful part. It’s not saying “I couldn’t find the intermediate” (that would be SEC_ERROR_UNKNOWN_ISSUER) — it’s saying there is no intermediate to find. The cert is the whole chain.

The one wrinkle that makes this a Firefox-only surprise: Firefox keeps its own root store and, out of the box, doesn’t consult the OS certificate store. Import a cert into Windows and Chrome trusts it; Firefox won’t notice until you either import it into Firefox directly or flip security.enterprise_roots.enabled. So “works in Chrome, fails in Firefox” isn’t a Firefox bug — it’s two different trust stores disagreeing about the same cert.

Top 3 Causes

  1. The server genuinely serves a self-signed certificate. A dev/staging box with an openssl-generated cert, or an appliance (router, NAS, iDRAC, printer) presenting its factory default. This is by far the most common. The tell: openssl s_client shows verify error:num=18 and a one-deep chain, and it fails in Firefox everywhere.
  2. You deployed the wrong certificate. You meant to install a CA-issued leaf plus its intermediate, but what’s actually live is a private CA’s self-signed root, or a regenerated placeholder cert that never got replaced. The tell: the served Subject/Issuer is your internal CA name, not your hostname.
  3. Something on the client is intercepting TLS. A corporate proxy or antivirus doing HTTPS inspection can swap in its own self-signed certificate. The tell: it reproduces only on one machine or one network, and other devices load the site cleanly. (Firefox often flags known interception as MOZILLA_PKIX_ERROR_MITM_DETECTED instead — but not always.)

Diagnose with DechoNet

  • SSL Check fetches the certificate the host actually serves and shows the chain — whether the leaf is self-signed (Issuer equals Subject, chain length one) or signed by an authority Firefox simply doesn’t know. That single distinction tells you whether you need a real certificate or just a missing intermediate.

Resolution Checklist

  • Confirm the code is SELF_SIGNED_CERT, not UNKNOWN_ISSUER — the first needs a real certificate, the second needs a missing intermediate. Don’t fix the wrong one.
  • Run SSL Check on the host and read the chain: length one with matching Issuer/Subject confirms self-signed.
  • Public site: replace the self-signed cert with a CA-issued one. A free ACME certificate from Let’s Encrypt takes minutes and ends the error for every browser at once. Self-signed doesn’t belong on the public internet.
  • Internal/dev host you control: either issue the cert from a private CA and distribute that CA’s root to your machines, or import the specific certificate into Firefox’s Certificate Manager → Authorities. For fleet-managed Windows, security.enterprise_roots.enabled = true lets Firefox read the OS store.
  • If it reproduces on only one machine, inspect antivirus/proxy TLS inspection before touching the server — the server may be fine.
  • Verify from the command line: openssl s_client -connect host:443 -servername host — verify error:num=18:self signed certificate confirms it at the source.

When to Escalate

  • If SSL Check shows a legitimate CA-issued chain but Firefox alone still reports self-signed, the server isn’t the problem — a client-side interception layer is rewriting the certificate, and the fix belongs on the endpoint or in the proxy config, not the web server.

Check your own domain now

Free, no sign-up. Runs the exact check this guide describes and shows what to fix.