SSL Certificates — What No One Tells You Until Something Breaks

Midnight. Production deployment done. You crack open Chrome to do a final sanity check and your entire page is replaced by a giant red warning: "Your connection is not private."

Not a 404. Not a 500. A full-screen security error that every visitor is going to see.

I've watched developers go through this. The initial confusion, the frantic Slack messages, the "it was working an hour ago" spiral. Nine times out of ten it's something totally preventable — an expired cert, a missing intermediate, a hostname nobody thought to double-check during the migration.

SSL issues are sneaky like that. They sit completely quiet for months and then blow up at the worst possible time. Let me walk through the things that actually matter — not the textbook handshake explanation, but the real stuff that causes real incidents.

What a Certificate is Actually Doing

Most developers get the encryption part. Data in transit gets scrambled, nobody in the middle can read it. Fine, we all know this.

But encryption alone is not enough. If someone positions themselves between your user and your server — a coffee shop router, a compromised ISP node, a targeted MITM attack — they can set up their own encrypted tunnel on both ends. Your traffic is "encrypted" but you're handing it straight to an attacker. The user has no idea.

The certificate is what stops this. It's signed by a Certificate Authority your browser already trusts. That signature is proof that the server you're talking to is actually who it claims to be. The lock icon is about identity, not just privacy. Both matter.

The Chain of Trust — Where Things Actually Go Wrong

Every certificate lives inside a three-level chain. Root CA at the top, an Intermediate CA in the middle, and your Leaf Certificate at the bottom — the one actually installed on your server.

Here's the thing most tutorials skip: your server needs to send the intermediate too, not just your leaf cert.

Chrome handles a missing intermediate gracefully because it fetches it on its own. So you test in a browser, everything looks fine, you ship it. Then a week later someone's mobile app starts throwing SSL errors, your API monitoring goes red, and a third-party integration breaks. All because curl and basically every non-browser HTTP client refuses to work without the full chain.

NGINX: your ssl_certificate should point to a bundled file — leaf cert first, then the intermediate below it. Apache: SSLCertificateChainFile. Always test with a fresh curl request after deploying, not just your browser.

DV, OV, EV — Simpler Than You Think

Certificate vendors love making this complicated. It's really not.

DV (Domain Validation) — CA confirms you control the domain. Free from Let's Encrypt. Takes minutes. The padlock looks identical to every other cert type in Chrome. For APIs, web apps, SaaS products, developer tools — DV is completely sufficient. Full stop.

OV (Organization Validation) — CA verifies your organization exists. Since 2019, browsers stopped showing the org name visibly in the address bar. End users literally cannot tell it apart from DV.

EV (Extended Validation) — Most rigorous vetting. Also since 2019, the green bar UI is completely gone from Chrome and Firefox. Looks exactly like DV to anyone visiting your site. Hard to justify paying extra for something nobody sees.

Get a DV cert. Set up certbot. Automate the renewal. Done.

Wildcard vs SAN — Know the Difference

Wildcard (*.domain.com) — Covers any single subdomain level. *.toolchecking.com works for api.toolchecking.com and app.toolchecking.com. But nested.api.toolchecking.com? That extra level breaks it completely.

SAN (Subject Alternative Names) — Lists specific domains explicitly inside one cert. You can cover toolchecking.com, www.toolchecking.com, api.toolchecking.com, and even a completely different domain — all in a single certificate.

For microservice architectures, SANs win. If your wildcard private key ever gets compromised, every single subdomain is exposed at once. With SANs you can scope each cert tightly.

The SSL Mistakes That Keep Coming Up

These are the issues that come up again and again:

• Expired certificate — The number one cause of SSL outages. Set monitoring alerts at 30 days out. certbot renews automatically but the cron job can fail silently for weeks. Actually verify the renewal is running. • Hostname mismatch — Cert issued for www.example.com but the site serves bare example.com too, without a redirect. Use a SAN cert that covers both versions. • Incomplete chain — Server sending only the leaf cert. Fix it by bundling the intermediate into your NGINX ssl_certificate file. Order is leaf cert first, intermediate after. • Old protocols still running — TLS 1.0, TLS 1.1, or RC4 cipher suites still active on old servers. Add ssl_protocols TLSv1.2 TLSv1.3 in your NGINX config. • Mixed content — An HTTPS page loading scripts, images, or stylesheets over HTTP. Check DevTools Console for mixed content warnings.

Checking a Cert Without SSH Access

Sometimes you need to audit a cert fast — a client's site, something a different team manages, a subdomain you don't control. For a proper check — expiry date, issuer, full SAN list, cipher details — use our SSL Lookup Tool:

Check any SSL certificate instantly — expiry, issuer, full chain details

Try SSL Lookup Tool Free →

Prefer the terminal? One openssl command does it:

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates -subject -issuer

For the full chain: openssl s_client -connect example.com:443 -showcerts 2>/dev/null | grep -E "subject|issuer"

FAQs

Yes — confirmed as a ranking signal since 2014. More practically: Chrome shows a "Not Secure" warning on any HTTP page with a form input. Login fields, search boxes, contact forms — any of these and users get a warning before your content even loads. That destroys conversion rates, period.
SSL is deprecated and broken. SSLv2 and SSLv3 both have known vulnerabilities and nothing should be running them. TLS is what replaced it. The industry still calls it "SSL" out of habit but everything running today is TLS 1.2 or 1.3. If you see SSLv3 or TLS 1.0 in a server config anywhere, disable them immediately.
Most likely mixed content — the page is loading something over HTTP. Open DevTools and check the Security tab. If the chain is incomplete, Chrome might handle it but other clients won't. If you recently changed domains or HTTPS config, also rule out HSTS issues.
Since late 2020 the cap is 398 days for publicly trusted certs. The industry is heading toward 90-day maximums — Google has been pushing for this and it's the right call because short-lived certs force proper automation. If you're still manually renewing on a calendar reminder, get certbot or acme.sh set up now.
Yes. It's just a file. Deploy the cert and private key to as many servers as you need — load balancers, app servers, CDN origins, all of them. Just be careful with the private key: never move it unencrypted, keep access restricted. A compromised private key means immediate revocation and reissuance, no shortcuts.
Scroll to Top
Checker Tools