How to Install an Intermediate SSL Certificate

VigilDog Team · October 30, 2026 · 7 min read

Your certificate authority sent you a leaf certificate and one or two intermediate certificates, and now the site loads fine in Chrome but curl throws a verification error. That gap is almost always a broken chain. Getting the intermediate certificate installed in the right order is the whole job, here's how to do it and prove it works.

Why the intermediate certificate matters

Public certificates are trusted through a chain. Your browser and operating system ship with a small set of trusted root certificates. Roots almost never sign your certificate directly, instead a root signs an intermediate certificate, and that intermediate signs the leaf certificate for your domain. A client validates the leaf, then walks up: leaf signed by intermediate, intermediate signed by root, root already trusted. If any link is missing, the chain can't be built and the connection fails.

The intermediate exists so the CA can keep its root offline and safe. That design is good for security but it means your server has to present the intermediate itself. The root is already on the client, so you never send it, but the intermediate lives only in the bundle your CA gave you, and it is your job to serve it alongside the leaf.

Root CAin the trust storeIntermediatemust be installedYour certificateleaf, for your domain
The TLS certificate chain of trust

The classic symptom: works in a browser, fails everywhere else

A missing intermediate produces one of the most confusing failure patterns in TLS: the site works in your browser but breaks in API clients, mobile apps, payment webhooks, and monitoring tools. The reason is that many browsers quietly repair a broken chain by fetching the missing intermediate over the network using the AIA (Authority Information Access) extension in the leaf certificate. So the browser looks fine while everything without AIA-fetching, curl, most programming-language HTTP clients, Java, older Android, returns 'unable to get local issuer certificate'.

Never judge a chain by your browser alone. If any non-browser client complains about an untrusted or incomplete chain, assume the intermediate is missing before you suspect anything else. You can confirm it in seconds with our SSL checker, which reports every certificate the server actually presents.

Build the chain in the right order

The server sends certificates as an ordered list. Order is not optional: the leaf must come first, then each intermediate in sequence from the one that signed your leaf up toward the root. You omit the root. Most CAs give you the pieces as separate files, your domain certificate and a bundle (sometimes called 'ca-bundle' or 'chain').

To build a full chain file, concatenate the leaf first, then the intermediate(s):

  • cat your_domain.crt intermediate.crt > fullchain.crt
  • If the CA sent multiple intermediates, add them after the first: cat leaf.crt intermediate1.crt intermediate2.crt > fullchain.crt
  • Do not append the root certificate, it adds bytes to every handshake and buys you nothing.
  • Keep your private key in a separate file; it never goes in the chain.

Install it on nginx and Apache

On nginx, there is only one certificate directive and it must point at the full chain, leaf plus intermediates in one file. A common mistake is pointing ssl_certificate at just the leaf.

On Apache 2.4.8 and newer, SSLCertificateFile accepts the full chain in a single file, so you can use the same fullchain.crt. On older Apache you must split them: the leaf goes in SSLCertificateFile and the intermediates go in the now-deprecated SSLCertificateChainFile.

  • nginx: ssl_certificate /etc/ssl/fullchain.crt; ssl_certificate_key /etc/ssl/private.key; then nginx -t && systemctl reload nginx
  • Apache 2.4.8+: SSLCertificateFile /etc/ssl/fullchain.crt and SSLCertificateKeyFile /etc/ssl/private.key
  • Apache <2.4.8: SSLCertificateFile leaf.crt + SSLCertificateChainFile intermediate.crt
  • Reload, don't just restart the process, so existing connections drain cleanly.

Verify the chain before you trust it

Reloading without an error is not proof. Verify what the server actually presents from a machine that is not your browser. The definitive local check is openssl:

Run: openssl s_client -connect example.com:443 -servername example.com. Read two things. First, the certificate chain block at the top should list your leaf, then the intermediate(s), if you only see one certificate, the intermediate is still missing. Second, look for 'Verify return code: 0 (ok)' near the bottom; anything else means the chain didn't validate. The -servername flag matters on shared hosts because it sends SNI, so you test the right virtual host.

For a second opinion that mimics real-world clients, run the hostname through our SSL checker or an external lab. If a certificate was recently reissued and something still looks wrong, our guide on an expired or broken SSL certificate walks through the adjacent failure modes.

Keep it fixed after you fix it

Chains break again at the worst times, a CA rotates an intermediate, a renewal script writes the leaf but forgets the bundle, or a config change quietly drops the chain file. Because browsers paper over the problem, you often find out from an angry customer whose integration stopped trusting you, not from your own testing.

That is exactly the gap continuous monitoring closes. VigilDog monitoring watches the full certificate chain your server presents, not just the leaf's expiry date, and alerts you the moment the intermediate goes missing or the chain stops validating, so a silent reissue never turns into a silent outage.

Questions

Frequently asked

Do I need to install the root certificate too?

No. The root is already in every client's trust store. Sending it wastes handshake bytes and can even cause problems. Serve only the leaf plus the intermediate(s).

Why does my site work in Chrome but fail in curl?

Browsers can fetch a missing intermediate over the network using the certificate's AIA extension, so they repair a broken chain silently. curl and most non-browser clients do not, so they surface the real problem: the intermediate isn't being served.

In what order do the certificates go in the chain file?

Leaf certificate first, then each intermediate in order from the one that signed your leaf upward. Omit the root. Getting the order wrong is as broken as omitting a certificate entirely.

Never serve a broken chain again

VigilDog validates the full certificate chain on a schedule and alerts you before clients start rejecting your site. Start monitoring in minutes.

Your first domain is free forever