How to Read an SSL Certificate: Issuer, SAN, Chain and Expiry

Open a certificate in your browser and you get a wall of fields, most of which you'll never need. A handful of them answer nearly every real question: which names does it cover, who issued it, when does it expire, and will every client be able to verify it. Here's how to find those fields and what they're telling you.

Getting the certificate in front of you

There are three easy ways to look.

In a browser, click the icon to the left of the address (it's no longer always a padlock), choose the connection or security details, and open the certificate viewer. Fine for a quick look, but browsers show you the chain they built, which may not be the chain the server actually sent.

Our SSL certificate checker fetches the certificate the way a client would and lays out the subject, issuer, alternative names, validity dates, serial number and SHA-256 fingerprint, plus whether it's trusted.

For everything, use openssl:

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -text

That prints the full decoded certificate. To pull out just the fields that matter, swap -text for -subject -issuer -dates -ext subjectAltName.

Subject and SAN: which names it covers

The Subject is usually just CN=example.com. It looks like the important bit, but it isn't. Browsers match the hostname against the Subject Alternative Name (SAN) extension and ignore the common name. Chrome stopped relying on the CN back in 2017.

X509v3 Subject Alternative Name:
    DNS:example.com, DNS:*.example.com

A few rules catch people out:

  • A wildcard covers exactly one label. *.example.com matches www.example.com and shop.example.com, but not a.b.example.com, and not the bare example.com. That's why certificates usually list the apex and the wildcard side by side, as above.
  • Every name has to be listed. If www isn't in the SAN, visitors to www.example.com get a name mismatch: NET::ERR_CERT_COMMON_NAME_INVALID in Chrome, SSL_ERROR_BAD_CERT_DOMAIN in Firefox. The certificate is valid, just not for that name.
  • Long SAN lists are normal on CDNs. A certificate covering dozens of unrelated domains usually means shared hosting or a CDN, not something suspicious.

Issuer and validation level

The Issuer field names the certificate authority that signed this certificate. In practice that's an intermediate CA, not the root. You'll see something like O=Let's Encrypt, CN=R12 or a commercial CA's issuing name. Let's Encrypt rotates between several short-named intermediates, so the exact name changes over time and isn't worth hard-coding anywhere.

The validation level lives in the Certificate Policies extension as an object identifier:

  • 2.23.140.1.2.1: domain validated (DV). The CA checked you control the domain, nothing more.
  • 2.23.140.1.2.2: organisation validated (OV). The CA also checked the organisation exists, and its name appears in the Subject as O=.
  • 2.23.140.1.1: extended validation (EV).

Encryption strength is identical across all three. Chrome and Firefox stopped showing the company name for EV in the address bar in 2019, so to a normal visitor the three look the same. The difference is only visible to someone who opens the certificate.

Validity dates: the expiry and what the lifetime tells you

notBefore=Jul 29 22:10:08 2026 GMT
notAfter=Oct 27 22:17:21 2026 GMT

Both times are in UTC. notAfter is the expiry, and the moment it passes, clients reject the certificate (see what an expired certificate looks like and how to fix it). A notBefore in the future also fails, which happens when a client's clock is wrong or a certificate was installed moments after issue on a server with clock drift.

The gap between the two dates tells you something too. A 90-day or shorter span points to automated issuance, usually ACME. Under the CA/Browser Forum's current rules, publicly trusted certificates issued from 15 March 2026 can last at most 200 days, falling to 100 days in March 2027 and 47 days in March 2029. So if you find a public certificate valid for over a year, it was issued before that change, and its replacement will have a much shorter life.

The chain: leaf, intermediate, root

Clients don't trust your certificate directly. They trust a small set of root certificates built into the operating system or browser, and your certificate has to link back to one of them through one or more intermediates. See what the server actually sends with -showcerts:

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null

Each certificate prints an s: (subject) and i: (issuer) line:

 0 s:CN=example.com
   i:C=US, O=Example CA, CN=Example Issuing CA 1
 1 s:C=US, O=Example CA, CN=Example Issuing CA 1
   i:C=US, O=Example CA, CN=Example Root CA

Read it as a chain: each certificate's issuer should be the next one's subject. Certificate 0 is your leaf. The server should send the leaf and every intermediate. It doesn't need to send the root, since clients already have it. Near the bottom, Verify return code: 0 (ok) means openssl could build a trusted path.

The most common chain bug is a missing intermediate, and it's sneaky because desktop browsers often paper over it. Firefox preloads known intermediates and some browsers fetch missing ones, so the site looks fine to you. curl, many Android apps, API clients and payment gateways don't do that, so they fail with "unable to get local issuer certificate". If the checker says untrusted but your browser shows a padlock, suspect the chain first. The fix is to install the full chain file your CA provides (certbot calls it fullchain.pem) rather than the leaf alone.

The rest, briefly

  • Public key: typically RSA 2048 or ECDSA P-256. Either is fine.
  • Key Usage / Extended Key Usage: a web server certificate should include "TLS Web Server Authentication".
  • CT Precertificate SCTs: proof the certificate was logged in public Certificate Transparency logs, which the major browsers require for publicly trusted certificates.
  • Serial number and SHA-256 fingerprint: unique identifiers. Handy for confirming two servers are really serving the same certificate.
  • CRL Distribution Points: where revocation lists live. Let's Encrypt shut down OCSP in August 2025, so its certificates now carry only CRL information.

Frequently Asked Questions

Does a valid certificate mean the site is safe?

No. It means the connection is encrypted and the certificate matches the domain name. A phishing site on a lookalike domain can get a DV certificate as easily as anyone else. The certificate proves which domain you're talking to, not whether that domain is honest.

How can I see every certificate ever issued for my domain?

Certificate Transparency logs are public, and search tools such as crt.sh let you query them by domain. It's a good way to spot certificates you didn't know about, including ones issued by a forgotten service or a CA you never used.

Why does the checker show a different certificate from my browser?

Either the browser built a different chain from the same leaf, or you're reaching a different server. Compare the SHA-256 fingerprints. If the leaf fingerprints match, it's a chain difference. If they don't, you have more than one server or IP answering for that name.

Do I need to send the root certificate?

No. Clients only trust roots they already hold, so sending one adds bytes and nothing else. Send the leaf followed by the intermediates, in order.

Was this useful?
Share

Related reading

0 comments

No comments yet. Be the first.

Leave a comment

Comments are reviewed before they appear. Your email is optional, is never published, and is only used if we need to reply.

« Back to Blog