An SSL certificate checker verifies whether a TLS certificate is valid, identifies why it might fail, and reveals what is about to break across different clients and environments. The most useful SSL checkers go beyond a simple pass/fail — they surface incomplete chains, expiring intermediates, SAN mismatches, and weak cipher suites that cause silent failures in non-browser clients like curl, Java, and Go. If you've ever been paged at 2am because an intermediate expired that Chrome gracefully handled but your partner's Java 8 client did not, you know the difference between "valid" and "actually working." This guide covers what an SSL certificate checker actually reveals, how to run checks from the command line, how to automate monitoring so you stop firefighting, and what changes when you're managing hundreds of certs across multiple clouds.
What an SSL Certificate Checker Actually Tells You
An SSL certificate checker returns certificate chain status, expiration dates, SAN coverage, protocol versions, OCSP stapling configuration, and key strength — each mapping directly to a specific production failure mode. Most tools dump this information without context, so here's what each field means operationally and what breaks when it's wrong.
Certificate chain validation
An incomplete certificate chain is the single most common TLS issue in production. When you check an SSL certificate chain, you verify that every link from the leaf cert to a trusted root is present and correctly ordered. According to Netcraft's 2024 SSL survey, roughly 5% of certificates observed on the public web have chain issues.
The reason incomplete chains are so insidious:
- Chrome and Firefox (desktop) silently download missing intermediates via AIA (Authority Information Access) fetching
- Safari also performs AIA fetching
- Android < 7.0 hard fails with no AIA fetching
- Java (default trust manager) hard fails
- Go
net/httphard fails - Python
requestshard fails - curl (with system CA bundle) hard fails
Your monitoring says green. Then a non-browser client hits the same endpoint and gets a hard failure. A checker should show you exactly which certificates are served and whether the root is unnecessarily included (it adds bytes to every TLS handshake but isn't functionally required since clients already have it in their trust store).
Expiration and renewal status
An SSL certificate expiration check should return days-to-expiry as a number, not just a date string requiring mental math. A cert expiring in 29 days is fine if you have ACME automation. It's a crisis if it's a manually provisioned OV cert and the person who ordered it left the company. The operational question is renewal cadence relative to your automation posture.
Cipher suite and protocol negotiation
A good SSL checker tests which TLS versions and cipher suites the server actually accepts. Key findings to watch for:
- TLS 1.0 negotiation indicates a compliance problem
- CBC-mode ciphers create BEAST/Lucky13 risk that scanners flag
- Qualys SSL Labs grades cipher configuration thoroughly via its web interface
nmap --script ssl-enum-ciphersandtestssl.shprovide equivalent analysis with scriptable CLI output
SAN coverage and mismatches
The Subject Alternative Names (SANs) field determines which hostnames a certificate covers. A name mismatch error means a client requested api.example.com but the cert only covers example.com and www.example.com. Critical SAN facts that catch teams off guard:
- A wildcard
*.example.comdoes not coverexample.comitself - A wildcard
*.example.comdoes not cover*.sub.example.com - Post-2017, browsers ignore the CN field entirely and only check SANs, per CA/B Forum Baseline Requirements
For more on these tradeoffs, see our guide on wildcard vs. SAN certificates.
| Field | What breaks when it's wrong | Severity |
|---|---|---|
| Chain completeness | Android, curl, Java, Go clients fail silently | High |
| Expiration | Total outage for all clients | Critical |
| SAN coverage | Specific hostname requests fail | High |
| Protocol version | Compliance scanners flag, old clients fail | Medium |
| OCSP stapling | Slower handshakes, potential soft-fail revocation gaps | Low-Medium |
| Key size | < 2048-bit RSA rejected by modern browsers | High |
How to Check SSL Certificates from the Command Line
The fastest way to check an SSL certificate from the command line is with openssl s_client, which works on any Linux system without installing additional tools. CLI-based checks matter because half the environments where you actually need to debug TLS don't have a browser — bastion hosts, CI runners, air-gapped networks, containers running as non-root. According to the 2023 Stack Overflow survey, 87% of DevOps professionals use Linux as their primary work environment.
openssl s_client: the essential commands
Check SSL certificate details including the full chain:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer
The -servername flag is critical — without it, you're not sending the SNI extension, and on any server hosting multiple certificates, you'll get the default cert instead of the one you're testing. This is the single most common reason people say "openssl shows a different cert than my browser."
Check SSL certificate expiration and get a machine-parseable date:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -enddate
Dump the full certificate chain for inspection:
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
Verify against a specific CA bundle (useful for mutual TLS or private CAs):
openssl s_client -connect example.com:443 -servername example.com -CAfile /path/to/ca-bundle.crt
curl verbose output for quick checks
For a fast pass/fail with certificate context:
curl -vI https://example.com 2>&1 | grep -A6 'Server certificate'
This is faster to type than the openssl equivalent and gives you the essentials. Add --resolve example.com:443:10.0.0.1 to test a specific backend server behind a load balancer without DNS changes.
cfssl and certigo for structured JSON output
For scripting SSL checks, cfssl (from Cloudflare) and certigo (from Square) output JSON, which pipes cleanly into jq and downstream tooling:
cfssl certinfo -domain example.com | jq '.not_after'
certigo connect example.com:443 --json
Both tools handle edge cases better than raw openssl — certigo warns about SHA-1 intermediates and weak keys automatically without manual output parsing.
Automating SSL Certificate Checks in CI/CD and Monitoring
SSL certificate monitoring must be automated to scale beyond approximately 12 endpoints before someone inevitably misses a renewal. According to the Ponemon Institute's 2023 report, the average cost of a certificate-related outage is $300,000. Effective automation has three layers, and most teams only implement one.
Pre-deploy certificate validation in pipelines
A CI/CD pipeline deploying a TLS-terminating service should validate the certificate before the deploy completes. This catches the "someone uploaded a staging cert to production" class of errors. At minimum, the pipeline gate should verify:
- The certificate isn't expired (and won't expire within 7 days)
- The SANs match the expected hostnames for the target environment
- The chain is complete, including all intermediates
This requires a 10-line shell script using the openssl commands above, or a single step using the step CLI from Smallstep. A pipeline gate that takes 2 seconds to run is the cheapest insurance against a $300,000 outage.
Prometheus ssl_exporter for ongoing monitoring
For continuous SSL certificate expiration monitoring, the Prometheus ssl_exporter is the standard open-source approach. It probes endpoints on a schedule and exposes ssl_cert_not_after as a gauge metric, feeding Grafana dashboards and Alertmanager rules. The Nagios check_ssl_cert plugin serves the same function for teams in the Nagios/Icinga ecosystem. For more on building a monitoring strategy, see our guide on TLS certificate expiration monitoring.
The important principle: SSL certificate monitoring should exist as a distinct concern, not bolted onto your HTTP health checks.
Alerting: time-based vs. error-based
Most teams get SSL alerting wrong by relying solely on time-based expiry warnings. The standard 30/14/7-day alert cadence creates alert fatigue when you have 500 certificates and 90-day Let's Encrypt certs renewing constantly. A better alerting model:
- 30 days before expiry: informational notification to the cert owner (not the on-call channel)
- 14 days before expiry: warning to the team channel if ACME renewal hasn't already succeeded
- 7 days before expiry: page the on-call, because something is actually broken
- Immediately on error: alert on any invalid chain, expired cert, or handshake failure, regardless of time remaining
A cert that expires in 25 days is a task. A cert serving an incomplete chain right now is an incident. The distinction between time-based and error-based alerting is what separates functional monitoring from noise.
Common SSL Certificate Errors and How to Fix Them
Four root causes account for approximately 60% of SSL certificate errors encountered in production. Here's each one with diagnosis and fix.
Incomplete chain: the most common production issue
- Symptom: site works in Chrome and Firefox on desktop, fails on Android < 7.0, fails in
curlwithout--cacert, fails in Java withPKIX path building failed - Root cause: server sends the leaf certificate but omits one or more intermediates; desktop browsers mask this with AIA fetching, but non-browser clients don't
- Fix: configure your web server to send the full chain using
cat leaf.pem intermediate.pem > fullchain.pem- nginx: set the
ssl_certificatedirective to the fullchain file - Apache 2.4.8+: bundle intermediates with
SSLCertificateFile - Apache (older): use
SSLCertificateChainFileseparately
- nginx: set the
After monitoring thousands of endpoints, incomplete chains remain the most frequent issue because browser AIA fetching hides the problem from the people most likely to notice it.
Name mismatch and SAN coverage gaps
- Symptom: clients report "ssl certificate not trusted" or
ERR_CERT_COMMON_NAME_INVALID - Root cause: the certificate's SANs don't include the requested hostname; post-2017, browsers ignore the CN field entirely per CA/B Forum Baseline Requirements
- Fix: reissue the cert with the correct SANs; audit your SAN list against your actual DNS records before ordering
Our guide on wildcard vs. SAN certificates covers the tradeoffs in detail.
Expired intermediates that don't show in browsers
- Symptom: openssl shows an expired intermediate in the chain, but browsers continue working
- Root cause: browsers cache a cross-signed version of the intermediate with a later expiry date; server-side clients use the chain file as served
- Canonical example: the Let's Encrypt DST Root CA X3 expiry in September 2021 broke millions of API integrations while browsers continued working
- Fix: update your chain file to use the current intermediate; monitor intermediate expiry dates, not just leaf cert dates
Certificate transparency logs can help you track when CAs issue new intermediates.
Mixed content and HSTS preload failures
After deploying a valid certificate, mixed content warnings and HSTS preload issues are the most common follow-up problems. These aren't certificate errors per se, but they appear in the same debugging session. HSTS preload list requirements:
- Certificate must cover the bare domain and the
wwwsubdomain max-agemust be at least 31,536,000 seconds (1 year)
Managing SSL Certificates at Scale: What Changes After 50 Certs
Certificate lifecycle management breaks down after approximately 50 certificates, when individual checks stop being sufficient and fleet-level visibility becomes the core challenge. According to a 2024 Keyfactor survey, 62% of organizations don't know exactly how many certificates they have.
Certificate inventory and ownership tracking
You can't monitor what you don't know about. The first step is discovery — scanning networks, cloud provider APIs, and load balancer configs to build a certificate inventory. Every certificate needs:
- An owner — a person or team responsible for renewal
- A purpose — what service or endpoint it protects
- A criticality level — what breaks if it expires
Without this, expiry alerts fire into a void where nobody knows whose problem it is.
Wildcard vs. SAN vs. per-service certs
- Wildcard certificates reduce operational overhead (one cert covers all subdomains) but increase blast radius (one compromised key exposes everything)
- Per-service certificates are more secure but multiply renewal burden
- Recommended approach: use wildcards for internal services behind your perimeter; use per-service certs for anything internet-facing
See our full comparison for the details.
Multi-cloud certificate sprawl
Running services across AWS, GCP, and Azure means certificates live in three different systems, each with its own renewal mechanism and failure modes:
| Cloud Provider | Certificate Service | Auto-Renewal Caveat |
|---|---|---|
| AWS | ACM (AWS Certificate Manager) | Only renews if DNS validation records still exist |
| GCP | GCP Managed Certificates | Doesn't support wildcards in all configurations |
| Azure | Azure Key Vault | Integrates with its own CA ecosystem |
A unified view across providers is the core challenge of multi-cloud certificate management.
ACME automation and its limits
Let's Encrypt and ACME protocol automation solved certificate renewal for internet-facing HTTP services. However, ACME falls short in several scenarios:
- Internal services unreachable by the CA
- DNS validation in split-horizon DNS setups
- Certificates requiring OV/EV validation for compliance
- Environments where an ACME client can't run
Industry data indicates roughly 30% of certificates in a typical mid-market environment can't be automated with ACME alone.
Comparing SSL Certificate Checkers: Web Tools, CLIs, and Platforms
The best SSL certificate checker depends on your use case — one-off diagnosis, pipeline automation, or fleet-level management. Here's an honest breakdown by category.
Free web-based checkers — Qualys SSL Labs, DigiCert SSL Tools, SSL Shopper:
- Best for one-off deep analysis; Qualys SSL Labs is the gold standard for grading
- Limitation: no API access, no bulk checking, no alerting
Open-source CLI tools — openssl, testssl.sh, cfssl, certigo, step:
- Best for pipeline integration and automation; full control, scriptable, works in restricted environments
- Limitation: you build and maintain the monitoring infrastructure yourself
Certificate management platforms — CertPulse, Keyfactor, Venafi, Sectigo:
- Best for fleet-level visibility, automated discovery, ownership tracking, and multi-cloud inventory
- This is where the
check ssl certificatecommand line approach stops scaling and a centralized system becomes necessary
| Capability | Web Tools | CLI Tools | Platforms |
|---|---|---|---|
| Single cert check | Yes | Yes | Yes |
| Bulk/fleet checks | No | Scriptable | Native |
| API access | Rarely | N/A | Yes |
| Chain validation depth | Good | Full | Full |
| Expiry alerting | No | DIY | Built-in |
| Ownership tracking | No | No | Yes |
| Cost | Free | Free | Paid |
Most teams end up using all three categories: web tools for quick one-off checks, CLI tools in their pipelines, and a platform when they realize the spreadsheet tracking 200 certs has three different "Owner" columns and none of them are current.
FAQ
What's the fastest way to check if an SSL certificate is expired?
Run openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -enddate from any terminal. This returns the exact expiration date in one line without needing a browser or web tool.
Why does my SSL certificate work in Chrome but fail in curl or Java? Chrome and Firefox use AIA (Authority Information Access) fetching to silently download missing intermediate certificates. Non-browser clients — including curl, Java, Go, and Python — do not perform AIA fetching. If your server isn't sending the complete certificate chain, browser users won't notice but API consumers will get hard failures. According to Netcraft's 2024 SSL survey, approximately 5% of public web certificates have chain issues that cause exactly this behavior.
How often should I check SSL certificates for expiration? Check every 6–12 hours with automated monitoring. Alert at 30 days (informational to cert owner), 14 days (warning if auto-renewal hasn't fired), and 7 days (page the on-call). Separately, run error-based checks that alert immediately on invalid chains or handshake failures regardless of expiry date. According to the Ponemon Institute's 2023 report, certificate-related outages cost an average of $300,000, making frequent automated checks the cheapest insurance available.
Do wildcard SSL certificates cover the base domain?
No. A wildcard certificate for *.example.com covers sub.example.com and www.example.com, but it does not cover example.com itself. You need to include the bare domain as a separate SAN entry. Additionally, *.example.com does not cover multi-level subdomains like api.staging.example.com.
What's the difference between an SSL checker and a certificate management platform? An SSL checker (like Qualys SSL Labs or openssl) tells you the current state of a single certificate. A certificate management platform (like CertPulse, Keyfactor, or Venafi) provides inventory, ownership tracking, automated discovery, expiry alerting, and renewal tracking across your entire certificate fleet. The first is a diagnostic tool; the second is an operational system. According to a 2024 Keyfactor survey, 62% of organizations don't know exactly how many certificates they have — a gap that checkers alone cannot close.
This is why we built CertPulse
CertPulse connects to your AWS, Azure, and GCP accounts, enumerates every certificate, monitors your external endpoints, and watches Certificate Transparency logs. One dashboard for every cert. Alerts when auto-renewal fails. Alerts when certs approach expiry. Alerts when someone issues a cert for your domain that you didn't request.
If you're looking for complete certificate visibility without maintaining scripts, we can get you there in about 5 minutes.