DevKitLab Logo DevKitLab
SSL / TLS / Certificate Chain / Intermediate Certificate / HTTPS

Why Is My Certificate Chain Incomplete? Fix Missing Intermediate Certificates

A certificate-chain error is not always a missing intermediate. The live endpoint may be serving an old chain, a private CA, or a chain with an expired certificate. Learn how to compare the public handshake with your intended deployment and fix the actual TLS terminator.

The site opens in a browser, but curl, a Java service, or a mobile app says it cannot build a certificate chain. Reissuing the certificate is the usual first move—and usually not the useful one. The server may be omitting an intermediate certificate, or it may be presenting a completely different chain from the one you think you deployed.

A certificate is not a standalone file. A client must work from the website’s leaf certificate through one or more intermediate CAs to a root in its trust store. A missing link, an expired certificate within the chain, or a private CA at the public endpoint can all break that path. Start with the public handshake, not the PEM file on disk.

Use the SSL Checker with the real hostname, port, and SNI. It reports whether the server sent a complete chain separately from whether a public client can trust that chain. Those are related results, but they are not interchangeable.

What an incomplete certificate chain actually means

A typical public HTTPS chain has a website certificate, issued by an intermediate CA, which is in turn issued by a trusted root CA. The root is normally already in the operating system or browser trust store. Servers therefore usually send the leaf certificate and the required intermediate certificates; they do not need to send the root.

An incomplete chain usually means the server did not send an intermediate that the client needs to construct the path. A client cannot reliably infer the missing path from the leaf alone. One environment may happen to have the intermediate cached or otherwise available, while another does not. That is one reason the same site can appear to work on one device and fail on another.

Separate “not sent” from “not trusted”

These failures overlap, but they are different diagnoses:

ResultWhat it often meansNext check
The server did not send a complete chainAn intermediate is missing, in the wrong order, or not the one for this leafExport the public chain and inspect every certificate
The chain cannot reach a trusted rootA private CA, expired certificate, unknown issuer, or local interception can also cause thisCheck issuer and dates, then retry from another network
Only older devices failTheir root store or available chain path differsIdentify the roots and intermediates those devices can trust
The failure comes and goesNodes, CDN edges, IPv4/IPv6, or several TLS endpoints serve different chainsTest every public address and TLS terminator

So “deploy fullchain” is not a universal cure for chain errors. It fixes a missing intermediate, but it will not turn a private CA into a publicly trusted one or repair an expired certificate already in the chain.

Do not let the file on disk stand in for the public handshake

Seeing the right fullchain.pem on an application server does not prove visitors receive it. TLS may terminate at a CDN, load balancer, ingress controller, reverse proxy, or managed platform. You can update the backend and leave the public edge untouched.

From the live result, record the leaf certificate’s serial number or SHA-256 fingerprint, the intermediates returned, the resolved IP, and the SNI used. Put the exported chain into the Certificate Decoder and inspect subject, issuer, validity, and fingerprints certificate by certificate. The issuer of one certificate and the subject of the next should line up; that is evidence of a path, while the actual trust decision still belongs to a client or checker.

If the public leaf fingerprint is already wrong, stop investigating intermediates. You are probably testing the wrong endpoint, or an old node still has traffic.

Why a browser can work while curl, Java, or an app fails

A browser loading the page is not proof that the deployment is correct. Some browser environments may already have a needed intermediate cached or can obtain it under their own policies; command-line clients, runtimes, embedded devices, and apps may not. Their root stores, chain-building behavior, and network restrictions differ too.

Do not settle this with “it works on my laptop.” Retry with the client that failed, against the same public hostname, and keep its exact error. If the problem exists only on a corporate network, hotel Wi-Fi, or a device with security software, rule out an HTTPS-inspection proxy presenting its own certificate.

What belongs in a fullchain deployment

Field names vary by platform—certificate chain, bundle, or full certificate chain—but the rule is the same: give the component that really terminates TLS the website certificate and the intermediate certificates required to reach its public root.

  • A fullchain normally places the leaf certificate first, followed by one or more intermediates.
  • Configure the private key separately. Do not append it to the certificate chain or paste it into any online service; diagnosing a chain needs only the certificates, and the decoder on this site runs in your browser.
  • A public root certificate normally does not need to be sent by the server. Adding one blindly does not replace a missing intermediate.
  • Do not substitute any intermediate that merely looks like it came from the same CA. The issued chain and key identifiers must correspond.

Reload the real TLS terminator after deployment and test the public endpoint again. Checking only a local port or configuration file can still miss a proxy in front of it or another node.

Fixes that look reasonable but slow the investigation down

Appending a root certificate, repeatedly reissuing the leaf, or testing only in a browser are common detours. A root is not a replacement for an omitted intermediate; reissuing does not update an old CDN or load-balancer configuration; and a browser may succeed because its local state happens to be more forgiving.

Another trap is to concatenate several cross-signed intermediate variants at random. A longer chain is not a better chain. Use the chain supplied for this leaf by the CA or certificate platform, then validate it from the public handshake instead of guessing from filenames.

If the failure is intermittent, inspect every entry point

When a chain error appears on only some requests, suspect topology before blaming the client. IPv4 and IPv6 may reach different services, one node may have missed the update, a CDN edge may retain old configuration, or a health check may omit the intended SNI.

The address returned by one check is only one observation. List every A and AAAA record for the hostname with DNS Lookup, then repeat the check for every address, port, and hostname combination; where your environment permits it, compare a connection with and without the intended SNI. Any endpoint still returning the old chain must be fixed or removed from traffic.

A short, complete troubleshooting order

  1. Check the public hostname with the SSL Checker, supplying the real port and SNI.
  2. Record “was the chain sent in full?” separately from “is the chain trusted?” Do not label every failure a missing intermediate.
  3. Export the public chain and inspect leaf, issuer, dates, and fingerprints in the Certificate Decoder.
  4. Find the real TLS terminator, deploy the CA-provided fullchain there, and reload the service.
  5. Check IPv4, IPv6, CDN edges, and every load-balanced node so that all entry points return the expected chain.
  6. Retest with the client that originally failed. If the chain is complete but untrusted, investigate a private CA, expired chain certificate, or local HTTPS interception instead.

If the chain passes but the browser reports a hostname mismatch, do not keep changing intermediates. The next question is SAN, SNI, or routing: see Why Doesn’t My SSL Certificate Match My Domain?. For the wider decision tree, return to Why Is My SSL Certificate Invalid?.