Skip to content
GDPR compliant. Hosted in DE.
14-day free trial →
Certificate chainTLS handshakeSSL monitoring
Security 16 min read 9 Sept 2026

Incomplete Certificate Chains: Browser Yes, App No

The browser shows the padlock while the application fails: how an incomplete certificate chain arises, why it stays invisible and how to prove it.

X

XICTRAQ

XICTRAQ

Certificate chainTLSSSL-Monitoring
0.9 %
sites with an incomplete chain (Qualys SSL Labs, June 2025)
1,256
affected sites in the monthly scan (Qualys SSL Labs)
98.8 %
mobile requests over TLS (Web Almanac 2025)
One missing link: the same chain, two outcomesThe server sends leaf and root, the intermediate is missing from the handshakeWhat the server sendsHow two clients reactServer certificate (leaf)delivered, order correctIntermediate R11missing from deliveryRoot certificatealready in the client storeBrowsercompensates for missing linksIntermediates preloadedover 2,000 entries (Mozilla)AIA fetching enabledConnection succeedsgap closed silentlyThe fault stays invisibleApplicationown trust storeno store of linksAIA disabled by defaultdeny-all as the defaultHandshake failsunknown issuerThe fault becomes visible0.9 %of trusted sites deliver the certificate chain incompletelyQualys SSL Labs, SSL Pulse, monthly scan June 2025: 1,256 of 134,380 sitesSources: Qualys SSL Labs, Mozilla, Oracle Java PKI Programmer’s Guide
A certificate on its own proves nothing. It only proves something once an unbroken line can be drawn from it to an authority the client already trusts. That line is the certificate chain, and it is where a TLS configuration fails most quietly: the browser shows the padlock, the payment interface times out, the mobile client reports an unknown issuer. On 0.9 percent of the sites rated trusted in the June 2025 monthly scan, the server delivers the chain incompletely (Qualys SSL Labs); the survey covers around 150,000 monitored sites (Qualys SSL Labs). These are not outliers but a recurring pattern. This article shows how the gap appears, why the browser hides it, how to prove it in a few minutes and how uptime monitoring keeps reading the state on a fixed cadence.

What the chain is and where it breaks

On its own, a TLS server certificate only states that some authority signed for a name. The claim becomes dependable through what sits above it: the server certificate was issued by an intermediate certificate, which in turn was issued by another intermediate or directly by a root certificate. Only the root certificate already sits in the client trust store, placed there by the operating system, the browser or the runtime, and it is therefore the one part of the chain the server does not have to deliver. How long the chain becomes depends on the hierarchy of the issuing authority: the default ECDSA chain of one widely used certificate authority comprises five links, of which only the first necessarily lives on your own server (Let’s Encrypt).

The standard spells out what to do in this situation. For the Certificate message, RFC 8446 states that the sender own certificate must come first in the list, that each following certificate should directly certify the one immediately preceding it, and that a certificate naming a trust anchor may be omitted because the peer is known to hold it anyway (IETF, RFC 8446). The whole of operational practice follows from that paragraph: leaf first, intermediates behind it, root optional. Leaving out the intermediates breaks no MUST requirement of the protocol. It shifts the sourcing onto the client and makes your own reachability depend on that client equipment.

  • Leaf certificate: carries the domain name and the public key of the server; without this link no connection is established.
  • Intermediate certificates: connect leaf and root, change regularly and are the part that goes missing in practice.
  • Root certificate: sits in the client trust store and is explicitly not expected on the wire (IETF, RFC 8446).
  • Cross-signatures: extra paths for older stores; dropping one saved over 40 percent of the certificate bytes sent in a TLS handshake (Let’s Encrypt).
  • Trust store: the list of accepted roots, maintained by the operating system, the browser or the runtime.

The chain is therefore not an accessory to encryption but the part that carries the proof. Key agreement can be immaculate, the cipher suite current, the protocol version up to date: if a link is missing the connection still ends, and it ends for precisely those clients that cannot source a replacement. Why this check belongs on a fixed cadence rather than being run once is covered in the article on automated certificate oversight.

Why the browser forgives and the application does not

Browsers have adapted to servers delivering incomplete chains and compensate in two ways. The first is a supply: a browser vendor preloads the disclosed intermediates of the Web PKI into the client, and the publisher states the list holds over two thousand entries (Mozilla 2020). If a link is missing from the handshake it is filled in from that supply without anyone noticing. The publisher reports that the number of handshake failures caused by unknown issuers went down after the mechanism was introduced in Firefox 68 (Mozilla 2020). The second way is fetching over the address embedded in the certificate itself: the client retrieves the issuing intermediate from there and closes the gap on its own.

Other clients do neither. In the Java runtime, fetching over that address is disabled by default for compatibility reasons and has to be switched on through a system property (Oracle). Once it is switched on the next barrier applies: without a configured rule list, a deny-all ruleset is in force (Oracle). So the very connection that holds in the browser breaks in the ERP system, in the payment reconciliation or in the nightly import. The certificate authority itself names the faulty chain as the most common cause when modern platforms fail (Let’s Encrypt). On top of that, a trust store ages slowly: in July 2023 the publisher measured that 93.9 percent of Android devices trusted its root, up from 66 percent three years earlier (Let’s Encrypt).

A green browser test is not proof

Testing the chain with a browser means testing the client with the best self-healing. Preloaded intermediates and fetching over the issuer address cover the fault up instead of showing it. The meaningful measurement is one that works without those aids: a command-line check against the system store, a call from the runtime your own service uses, or a measurement from a network that is not yours. What such a verification path looks like alongside the functional checks is shown in the article on the health check endpoint with real dependencies.

What the protocol requires and what the rulebook leaves open

The protocol is deliberately lenient here. RFC 8446 advises all implementations to be prepared to handle extraneous certificates and arbitrary orderings from any TLS version; the only binding part is that the end-entity certificate comes first (IETF, RFC 8446). Lenient does not mean binding, though: a recommendation obliges no client, and a lean verification path in an embedded device or an old runtime may decline it. The same holds for the pointer to the issuing intermediate inside the certificate: the industry certificate profile lists it as a recommendation rather than a requirement (CA/Browser Forum). Planning the fetch as a safety net means planning around a field that is allowed to be absent.

Chain linkWho delivers itIf it is missingWhere the fault surfaces
Leaf certificatethe server, without exceptionno connection at allevery client
Intermediate certificatethe server, a SHOULD under the protocol (IETF, RFC 8446)chain breaks on clients without their own supplyapplications, mobile clients, embedded devices
Cross-signaturethe server, only for older trust storeslegacy devices fail while new clients notice nothinginstalled base in the field
Root certificatethe client trust store, on Android only from version 7.1.1 (Let’s Encrypt)the client does not trust the issuing authoritydevice- and platform-dependent
Revocation datano longer through the online responder since 6 August 2025 (Let’s Encrypt)revocation status runs over revocation listsverification paths built on an outdated assumption

Institutions of the German federal administration face an additional layer. The German BSI minimum standard for the use of Transport Layer Security requires them to deploy TLS 1.2 and/or TLS 1.3 (BSI); for federal states, municipalities, universities and private service providers without a corresponding directive it is guidance, not an obligation. The chain check is part of the diligence that requirement presumes. In practice that means the protocol version can be evidenced in a configuration line while chain completeness cannot. It only shows in the handshake itself. How protocol and algorithm selection can be observed separately is described in the article on hardening TLS cipher suites.

Five failure patterns and how to recognise them

An incomplete chain does not fail in one single way. In practice a small number of clearly distinguishable patterns occur, with different causes and different repairs. In the June 2025 monthly scan this applied to 1,256 sites (Qualys SSL Labs). Telling the patterns apart is worth the effort, because the first reflex of having a new certificate issued only helps with one of them.

The common picture is a server sending only the leaf certificate, because the configuration points at the file holding the single certificate rather than the file holding the full chain. Both sit in the same directory, both carry the same file suffix, and both produce the same green result in the browser. The second picture appears when the intermediate changes: the issuing authority now runs four of them in parallel, explicitly to prevent anyone pinning a single link (Web Almanac 2025). Anyone who hard-coded that link into their configuration delivers, after the switch, an intermediate that no longer matches the new leaf.

  • Leaf certificate only: the configuration points at the single certificate instead of the full chain.
  • Stale intermediate: a hard-coded link no longer matches the leaf after the issuing authority rotates.
  • Wrong order: the leaf does not come first, which is the single point the protocol makes mandatory (IETF, RFC 8446).
  • Extraneous certificates: expired cross-signatures stay in the file and inflate the handshake; dropping one cross-signature saved over 40 percent of the certificate bytes (Let’s Encrypt).
  • Chain behind the load balancer: the application delivers in full while the layer in front terminates TLS with its own incomplete file.

The last pattern is the most awkward, because it passes the check on the origin server and still ships the fault. A site sits behind a load balancer, a cache or an upstream service; the visitor connection ends there, not at the application server. What belongs under test is therefore the address the visitor calls, measured from a network that is not your own. The same separation applies to API endpoints, which often run under a different hostname and therefore a different termination point.

An incomplete chain caps the rating

In a widely used TLS test procedure the grade is capped at B whenever the chain is incomplete, regardless of how cleanly protocols, key lengths and algorithms were chosen (Qualys SSL Labs). That cap is less a school grade than a useful side effect: anyone recording the value regularly sees the gap in the capped grade before the first client gets in touch.

Measuring the chain yourself

The proof costs one command. What matters is that it works without the aids of a browser: no preloaded supply, no fetching over the issuer address, only the system store and whatever the server actually sends. The usual command-line tool prints the delivered certificates one by one and names the verification failure in plain text.

Two readings are enough for a verdict. First, the number of delivered certificates: if exactly one comes back while the issuing authority works through an intermediate, the chain is incomplete. Second, the verification message: a note about a missing local issuer is exactly the finding a browser repairs in silence. Anyone without access to a command line reaches the same result with the SSL quick check.

$ openssl s_client -connect shop.example:443 -servername shop.example -showcerts </dev/null | grep -c "BEGIN CERTIFICATE"
1
$ openssl s_client -connect shop.example:443 -servername shop.example </dev/null 2>&1 | grep -E "verify|Verify"
verify error:num=20:unable to get local issuer certificate Verify return code: 20 (unable to get local issuer certificate)
$ openssl s_client -connect www.example:443 -servername www.example -showcerts </dev/null | grep -c "BEGIN CERTIFICATE"
2

The counter-test belongs with it. The same call against a site with a complete chain returns two or more certificates and no verification message. Once you have seen the difference, you recognise it in seconds. A clean result concerns the chain alone and says nothing about the rest of the configuration.

Causes that keep coming back

A handful of causes sit behind these failure patterns, and they repeat across industries and server systems. What they share is that they arise where nobody expects a certificate question: during a file change, during a migration, in a script that has been running unattended for years.

The wrong file in the path

The issuance process writes the single certificate and the full chain side by side. Point the configuration at the single certificate and the fault is born, invisible in the browser. The check is the number of delivered certificates, not the file name.

The hard-coded intermediate

A link downloaded once moves into a configuration directory and stays there. The intermediate most used in the 2025 crawl sits behind 20.80 percent of the recorded desktop pages (Web Almanac 2025), but no longer issues certificates and expires on 12 March 2027 (Let’s Encrypt). The generation delivered today is valid until 2 September 2028 (Let’s Encrypt): a hard-coded chain therefore breaks not at that date, but already at the change of generation.

The second termination point

Application server, load balancer and upstream cache each hold their own certificate file. What usually gets tested is the one that is easiest to reach. The visitor hits the other one.

The renewal script without a reload

Renewal writes the new chain, the service only reads it at the next restart. Until then the running process keeps serving the old file. The link to components without vendor maintenance is close, because older server software does not read some chain formats at all.

Short lifetimes turn a one-off into a cadence

The gap would be a one-off configuration error if certificates lasted a long time. That era is over. For certificates issued on or after 15 March 2026, the industry rulebook allows no more than 200 days of validity (CA/Browser Forum); from 15 March 2027 it is no more than 100 days (CA/Browser Forum) and from 15 March 2029 no more than 47 days (CA/Browser Forum). The calculation uses a day of exactly 86,400 seconds (CA/Browser Forum), so a renewal left to the last minute overruns the window. Platform vendors cap independently of that: server certificates issued on or after 1 September 2020 may be valid for no more than 398 days on the affected systems (Apple 2020).

That turns a one-off into a cadence. One certificate authority already offers certificates with six-day validity alongside the 90-day standard, and they cannot be operated without automation (Let’s Encrypt). Every renewal rewrites the chain, and every renewal is therefore an opportunity to lose a link. That chain changes also come with hard dates was shown when the long cross-signed chain was switched off on 6 June 2024 (Let’s Encrypt). What this means for monitoring cadence is set out in the articles on six-day certificates and on the 200-day limit.

The sender own certificate must come first in the list. Each following certificate should directly certify the one immediately preceding it.

— RFC 8446, section 4.4.2, paraphrased

Where the chain lives in the server configuration

In the server configuration the chain is a file reference, nothing more. Common web servers expect one file holding leaf and intermediates in that order; depending on the server software there are separate directives for leaf and chain as well. The most frequent fault is therefore not wrong syntax but a reference to the file that holds only the leaf.

After every change the same sequence applies: reload the configuration, test the handshake against the public address, count the certificates. Skipping the second step means relying on a file you have not seen delivered. With automated issuance the verification step belongs in the same workflow as the renewal itself; the article on certificate automation with ACME describes where that hook sensibly sits.

nginx.conf
# fullchain.pem holds leaf AND intermediates - cert.pem holds only the leaf
ssl_certificate     /etc/letsencrypt/live/shop.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/shop.example/privkey.pem;

# Apache separates the directives; the chain belongs in SSLCertificateChainFile
# SSLCertificateFile      /etc/letsencrypt/live/shop.example/cert.pem
# SSLCertificateChainFile /etc/letsencrypt/live/shop.example/chain.pem

# Counter-check after the reload - at least 2 certificates are expected:
# openssl s_client -connect shop.example:443 -servername shop.example \
#   -showcerts </dev/null | grep -c "BEGIN CERTIFICATE"

Monitoring that sees the fault before the customer does

An incomplete chain is a state, not an event. It arises during a change and persists until someone notices – usually a customer whose application no longer connects. Monitoring that runs the handshake on a fixed cadence from an external network and evaluates the chain in full moves that moment forward.

  • Record the number of delivered certificates per run, not just the status code of the page.
  • Run the chain check without fetch assistance so the measurement does not repair what it is meant to measure (Oracle).
  • Report remaining validity in stages, because the permitted lifetime drops to 200 days (CA/Browser Forum).
  • Detect intermediate rotation, because the issuing authority runs four links in parallel (Web Almanac 2025).
  • Test every termination point separately: origin server, load balancer, cache, secondary hostnames.
  • Track revocation status over revocation lists, since the online responder was switched off on 6 August 2025 (Let’s Encrypt).

The effort is small because the request happens anyway. A run that measures reachability has already completed the handshake; the chain check is an evaluation step on the same result. In XICTRAQ this sits in uptime monitoring and in the security scan, with notification going out over the configured alert channels. Anyone who also wants to watch which certificates were issued for their names will find the route in the article on certificate transparency logs.

The chain belongs in continuous monitoring

The chain is the part of TLS that gets the least attention and breaks most quietly. Encryption is no longer a corner case: 98.8 percent of all mobile requests were sent over TLS in the 2025 survey year (Web Almanac 2025), and roughly 76 percent of the recorded pages speak TLS 1.3 (Web Almanac 2025). The broader the encryption, the broader the effect of a chain fault – and the more often it hits not the browser but the machine behind it.

On top of that comes a concentration that magnifies the lever: 52.6 percent of the recorded sites use a certificate from the same certificate authority (Web Almanac 2025). A rotation of its intermediates therefore touches a great many sites on the same day. The conclusion is unspectacular and carries far: chain completeness belongs in the same run as reachability and remaining validity, it belongs tested against the public address, and it belongs in a status report that somebody reads. How revocation checking is organised after the end of the online responder is covered in the article on certificate revocation over revocation lists.

Sources and studies

This article draws on: Qualys SSL Labs (SSL Pulse, monthly scan June 2025, and the SSL Server Rating Guide, version 2009r), Web Almanac 2025 (Security chapter), IETF (RFC 8446, section 4.4.2), CA/Browser Forum (Baseline Requirements, version 2.2.9), Let’s Encrypt (Chains of Trust, Certificate Compatibility and the announcements on chain shortening, six-day certificates and the end of the online revocation responder), Mozilla (Preloading Intermediate CA Certificates into Firefox), Oracle (Java PKI Programmer’s Guide, JDK 21), Apple (Requirements for trusted certificates in iOS 13 and macOS 10.15) and BSI (minimum standard for the use of Transport Layer Security, version 2.4). Every figure is backed by a deep link and a verbatim quotation.

Why does the browser show a padlock while the same address fails in the app?
Because the two clients contribute very different amounts of their own work. A browser keeps intermediates in stock – over two thousand entries according to one publisher (Mozilla 2020) – and additionally fetches missing links over the address embedded in the certificate. A Java application does neither: the fetch is disabled by default (Oracle), and even after switching it on a deny-all ruleset applies without a configured rule list (Oracle). Same server, same chain, two outcomes.
How do I spot an incomplete chain without an external test tool?
With a handshake from the command line and two readings: the number of delivered certificates and the verification message. If the server returns exactly one certificate while the issuing authority works through an intermediate, a link is missing. A note about a missing local issuer confirms the finding. What matters is that the measurement runs against the public address, not the origin server: load balancers and caches hold their own certificate file.
Does the server have to send the root certificate?
No, and it gains nothing. RFC 8446 explicitly records that a certificate naming a trust anchor may be omitted from the chain because the peer is known to possess it (IETF, RFC 8446). In practice a root sent along only lengthens the handshake. How much that volume matters is shown by the reverse case: dropping a cross-signature saved over 40 percent of the transferred certificate bytes (Let’s Encrypt).
Does it hurt to deliver too many or badly ordered certificates?
Usually not, but it is not something to rely on. RFC 8446 advises all implementations to cope with extraneous certificates and arbitrary orderings; the only mandatory part is that the end-entity certificate comes first (IETF, RFC 8446). A recommendation is not an obligation, and lean verification paths in embedded devices do not necessarily follow it. Expired cross-signatures should therefore leave the file once the matching installed base no longer matters.
How often should the chain be checked?
On the same cadence as reachability, because both fall out of the same request. The reason is the trend in lifetimes: certificates issued on or after 15 March 2026 may be valid for no more than 200 days, from 15 March 2027 for no more than 100 days and from 15 March 2029 for no more than 47 days (CA/Browser Forum). One certificate authority already offers certificates with six-day validity (Let’s Encrypt). The more often renewal happens, the more often the chain is rewritten – and the more often a link can be lost along the way.
Is a good report from a TLS test procedure enough as proof?
It is a useful indication, not complete proof. A widely used test procedure caps the grade at B when the chain is incomplete (Qualys SSL Labs), so the gap becomes visible in the capped value. The report, however, only measures the tested hostname at one point in time. Secondary hostnames, API endpoints and second termination points stay outside it, and the next renewal comes after the measurement. The statement becomes dependable only through repeated testing of every delivered address.

Related in XICTRAQ

Start in 60 seconds

Let XICTRAQ watch your website.

Permanent free plan available. No credit card, no installation, no hidden fees.