Broken Certificate Chain: Validation & Error Fixes

How to read the exact chain error a browser, curl, Java, or Android is showing you, work out which of a handful of specific causes is actually behind it, and fix it on nginx, Apache, or IIS — without guessing.

🛠️ Related tool: Open Certificate Chain Checker →

A Broken Chain Is a Symptom, Not a Single Problem

"Certificate chain error" covers a handful of genuinely distinct underlying causes that all produce roughly the same scary browser warning or failed connection — a missing intermediate, certificates pasted in the wrong order, an expired link partway up the chain, or a leaf certificate that doesn't actually match the private key it's paired with. Treating all of these as one problem and randomly trying fixes wastes time; the fast path is reading the specific error message your client actually gave you, since different clients report genuinely different failure signatures for genuinely different root causes.

⭐
ToolsNovaHub Pro Tip
Always pull the chain with openssl s_client -connect host:443 -showcerts < /dev/null before touching any configuration. This shows exactly what the server currently sends, which is the only thing that matters — not what your browser has cached, and not what the CA's documentation claims should be there.
⚠️
Common Beginner Mistake
Testing a suspected fix only in a browser that already has the correct intermediate cached from visiting another site. This produces a false "it's fixed" result — always verify with a client that has never seen the certificate before, or with openssl directly against the file.

Reading the Error Your Client Actually Gave You

❌ Chrome: NET::ERR_CERT_AUTHORITY_INVALID
Chrome couldn't build a path from the presented certificate to a trusted root. Often auto-recovered via AIA fetching if only the intermediate is missing and its download URL works; a persistent failure usually means something more than a missing intermediate.
❌ Firefox: SEC_ERROR_UNKNOWN_ISSUER
Firefox doesn't perform the same automatic intermediate fetching Chrome does in most configurations, so this fires more reliably on a genuinely incomplete server-side chain than Chrome's equivalent warning does.
❌ curl / OpenSSL: unable to get local issuer certificate
The client walked the chain as far as the certificates it received allow, then couldn't find the next certificate up. This is the single most common signature of a server sending only its leaf certificate and no intermediate.
❌ Java: PKIX path building failed
Java's TLS stack couldn't construct a valid certification path to a trust anchor in its truststore. Frequently seen when a Java application's own cacerts truststore is missing a newer root or intermediate that browsers already have.
❌ Android: Trust anchor for certification path not found
Conceptually identical to Java's PKIX error (Android's TLS stack shares lineage with Java's), and historically the exact error seen on older Android versions after the 2021 DST Root CA X3 expiration broke a widely used cross-signed path.

The Most Common Cause: A Missing Intermediate

By a wide margin, the majority of real-world "broken chain" reports trace back to a server sending only its leaf certificate, with no intermediate at all. This happens when whoever configured the web server used only the single certificate file a CA's dashboard displayed most prominently, missing a separate intermediate bundle the CA also provided (often under a name like "intermediate.crt," "ca-bundle.crt," or referenced only in less-visible setup documentation). The fix is always the same regardless of server software: locate the correct intermediate for your specific certificate, and ensure it's actually included wherever your server's configuration expects a full chain.

Wrong Order in the Chain File

Less common than a missing certificate but just as effective at breaking validation on strict clients: certificates concatenated in the wrong sequence. Servers are expected to send the leaf first, then intermediates climbing toward (but not including) the root. A file built by pasting the intermediate before the leaf, or intermediates out of their actual signing order, can contain every certificate needed for a valid chain while still failing, since some clients build the chain strictly in the order received rather than reassembling it by matching issuer/subject names themselves.

An Expired Intermediate — Yes, Those Expire Too

It's easy to monitor a leaf certificate's expiry closely while forgetting the intermediate above it has its own, entirely separate validity window. When an intermediate lapses, every leaf certificate it signed fails chain validation immediately, regardless of how much time is left on the leaf's own certificate. This failure mode is particularly disorienting because nothing about the server's own certificate or configuration changed — the break originates entirely from the CA's own intermediate rotation schedule, discoverable only by actually decoding the intermediate's validity dates rather than assuming it's a permanent fixture.

A Chain Built From the Wrong Certificate

A structurally complete, correctly ordered, unexpired chain can still fail for a reason that has nothing to do with the chain itself: the leaf certificate doesn't actually match the private key the server is configured to use, typically from an old certificate/key pair being left in place after a renewal replaced only one of the two files. This produces a different class of error than a chain-validation failure (usually a handshake failure rather than a certificate-authority warning), but gets reported anecdotally as "the SSL is broken" just as often, which is why confirming the leaf certificate and private key actually match — comparing their public keys, as covered in our companion guide on chain and PEM/DER mechanics — is worth doing early in any troubleshooting session.

Server-Specific Fixes

ServerWhere the Chain LivesCommon Mistake
nginxSingle file referenced by ssl_certificate: leaf + intermediate concatenatedPointing ssl_certificate at the leaf-only file instead of a fullchain bundle
Apache (2.4.8+)Intermediate appended directly into the file referenced by SSLCertificateFileStill using the deprecated separate SSLCertificateChainFile directive incorrectly, or omitting it on older versions
IISWindows Intermediate Certification Authorities store, not a fileThe intermediate was never imported into that Windows certificate store on the server

Diagnosing the Exact Break With This Site's Tools

Pull the live chain with openssl s_client -connect yourdomain.com:443 -showcerts < /dev/null, copy every -----BEGIN CERTIFICATE----- block it prints, and paste the full set into the Certificate Chain Checker. It verifies each signature link cryptographically and names the specific broken link and reason, rather than the generic pass/fail a browser gives you — distinguishing a missing certificate, a name mismatch, or an actual signature failure from each other. For a single certificate in the chain, the Certificate Decoder confirms its validity dates and issuer independently, useful for isolating whether an intermediate has quietly expired.

A Systematic Order of Operations

When the cause isn't obvious, work through checks in this order rather than guessing: first, pull the exact chain the server currently sends and confirm how many certificates it actually contains — one certificate alone almost always means a missing intermediate. Second, decode each certificate's validity dates and confirm none has expired, intermediates included. Third, confirm the order is leaf-first and that each certificate's issuer matches the subject of the one following it — the Certificate Chain Checker automates exactly this step. Fourth, if everything above checks out, confirm the leaf certificate's public key actually matches the private key configured on the server, since a chain-level check alone won't catch a key mismatch.

Real Troubleshooting Scenarios

A team migrates a site to a new server and copies over what they believe is the full certificate but forgets the separate intermediate bundle file, producing curl and mobile-app failures that don't show up in casual browser testing since Chrome had the intermediate cached from the old server. A renewal script updates a leaf certificate automatically but doesn't refresh the bundled intermediate, and the chain silently breaks months later when that older intermediate expires on its own schedule, unrelated to the leaf's renewal date. An IIS administrator installs a new certificate through the server's GUI but the intermediate never gets imported into the correct Windows certificate store, producing chain errors specifically on non-Windows API clients hitting the same endpoint that IIS-aware Windows clients don't experience. A developer debugging a Java service's TLS failures traces it to the JVM's own bundled truststore predating a newer root the browsers on the same machine already have.

Related Reading

For the underlying mechanics of chain files, PEM concatenation, and format conversion, see our companion guide Certificate Chains & PEM vs DER Encoding. For how root and intermediate trust actually gets established in the first place, read Root CA & Intermediate Certificates Explained. To verify a chain's cryptographic signature links directly, use the Certificate Chain Checker. For decoding a single certificate's fields independently, use the Certificate Decoder.

📅 Last updated: September 2026📜 Sourced from: RFC 5280

ToolsNovaHub guides are researched against primary sources (RFCs, vendor docs) and kept up to date as standards change. Spotted an error? Let us know.

📋 Related Tools & Guides Comparison

ResourceTypeLink
Certificate Chain CheckerToolOpen Tool →
Certificate DecoderToolOpen Tool →
Certificate Chains & PEM vs DER EncodingGuideRead Guide →
Root CA & Intermediate Certificates ExplainedGuideRead Guide →
Verifying & Troubleshooting CSR ErrorsGuideRead Guide →
Try it yourself — 100% free
🚀 Open Certificate Chain Checker

🔗 More Guides

FAQ

This OpenSSL/curl error means the client walked up the chain as far as it could using what the server sent, but couldn't find a certificate for whoever issued the last one it has — almost always because the server never sent the intermediate certificate in the first place.
Chrome and other browsers can automatically fetch a missing intermediate via the Authority Information Access extension, or may have it cached from a previous visit to any site sharing the same CA. curl, most mobile app TLS stacks, and many API clients don't do this automatic fetching, so they fail on exactly the same misconfigured server a browser papers over.
Yes — intermediates have their own validity period like any certificate, and if it lapses, every leaf certificate signed by it fails chain validation immediately, even if the leaf certificate itself is still well within its own validity window.
openssl s_client -connect yourdomain.com:443 -showcerts < /dev/null shows every certificate the server actually transmits during the handshake, in the order it sent them — the definitive way to see what a real client receives, independent of any browser caching or auto-fetching.
Yes — servers are expected to send the leaf certificate first, then intermediates in signing order. A chain file with certificates concatenated in the wrong order can cause validation failures on strict clients even when every certificate in the file is individually valid.
Check whether the leaf certificate actually matches the private key configured on the server, whether any certificate in the chain has expired, and whether an intermediate is genuinely signed by the certificate that precedes it rather than a similarly-named but different one — mismatched or substituted certificates produce failures that look identical to a missing link at first glance.
nginx's ssl_certificate directive expects a single file containing the leaf certificate immediately followed by the intermediate certificate(s), concatenated in that order — commonly named fullchain.pem. Pointing ssl_certificate at just the leaf file, without the intermediate appended, is the most common nginx-specific cause of this error.
Older Apache versions used a separate SSLCertificateChainFile directive for intermediates; current versions (2.4.8+) expect the intermediate simply appended after the leaf certificate in the file referenced by SSLCertificateFile, the same concatenated-file approach nginx uses.
IIS pulls intermediate certificates from the Windows Intermediate Certification Authorities certificate store rather than a chain file — if the intermediate was never imported into that store on the server, IIS won't include it in the handshake regardless of how the site binding is configured.
Yes — pull the exact chain your server is now sending with openssl s_client -showcerts and paste it into a chain verification tool, or run openssl verify -CAfile root.pem -untrusted intermediate.pem leaf.pem locally, both of which confirm the fix before you rely on a live client happening to test it for you.
The most common unattended cause is an intermediate certificate quietly expiring on its own schedule — nothing about the server changed, but the certificate that used to complete the chain no longer does. CA-side root or intermediate rotations and distrust events can also break a previously working chain with no local configuration change at all.