SSL certificate decoder
Paste a certificate to see the names it covers and when it expires, then check it against your hostname, your chain and your CSR before you install it. Live SSL checkers tell you what's wrong once it's on the server. This one reads the file in your browser, and your text stays on this page.
- Covered by www.example.com
- Expires
Jan 1, 2036
- Chain
- 2 certificates line up: each one's issuer matches the next one's subject.
- CSR
- Same public key as certificate 1
- Lifetime
- 3,653 days. On Jan 1, 2026, a public CA couldn't issue more than 398.
Certificate 1 of 2 · serverwww.example.com
- Names (SANs)
- www.example.com
- example.com
- *.api.example.com
- Subject
- C=US, ST=Texas, L=Austin, O=Example Inc, CN=www.example.com
- Issuer
- C=US, O=Example Trust, CN=Example Issuing CA
- Valid from
- Jan 1, 2026, 12:00 AM UTC
- Valid to
- Jan 1, 2036, 12:00 AM UTC
- Key
- ECDSA P-256
- Signature
- ECDSA with SHA-256
- Serial
- 04:D2:CA:FE
- Version
- 3
- CA
- No
- Key usage
- Digital signature
- Extended usage
- TLS server
- TLS client
- Policies
- Organization validated (OV)
- OCSP
- http://ocsp.example.com
- CA issuers
- http://ca.example.com/issuing.crt
- CRL
- http://ca.example.com/issuing.crl
- Subject key ID
- 69:E2:8E:F2:83:73:5F:43:A3:2B:A9:2B:11:01:F4:14:74:92:5C:CC
- Authority key ID
- 62:AA:9F:A6:77:9F:48:58:86:FA:D3:31:13:2F:D2:2C:F0:D7:B0:E1
- SHA-256
- Calculating…
- SHA-1
- Calculating…
- Public key SHA-256
- Calculating…
Certificate 2 of 2 · rootExample Issuing CA
- Subject
- C=US, O=Example Trust, CN=Example Issuing CA
- Issuer
- C=US, O=Example Trust, CN=Example Issuing CA
- Valid from
- Jan 1, 2026, 12:00 AM UTC
- Valid to
- Dec 31, 2046, 11:59 PM UTC
- Key
- ECDSA P-256
- Signature
- ECDSA with SHA-256
- Serial
- 0A:11:CE
- Version
- 3
- CA
- Yes, path length 0
- Key usage
- Certificate signing
- CRL signing
- Subject key ID
- 62:AA:9F:A6:77:9F:48:58:86:FA:D3:31:13:2F:D2:2C:F0:D7:B0:E1
- SHA-256
- Calculating…
- SHA-1
- Calculating…
- Public key SHA-256
- Calculating…
CSRwww.example.com
- Names (SANs)
- www.example.com
- example.com
- *.api.example.com
- Subject
- C=US, ST=Texas, L=Austin, O=Example Inc, CN=www.example.com
- Key
- ECDSA P-256
- Signature
- ECDSA with SHA-256
- Public key SHA-256
- Calculating…
How to read your result
Whether the certificate is about to go on a server or has already broken HTTPS, you need the same few answers. If a row above looks wrong, here's the fix:
In the fields underneath, we'd check that the issuer is the CA you expected and the key is the type you asked for. You'll want the serial and fingerprints when you're comparing two copies or quoting one to your CA.
Does it cover your hostname?
Only the names in the Subject Alternative Name (SAN) list count. The common name looks like the answer, but RFC 9525 says it "MUST NOT be used to identify a service". Wildcards catch people too. One covers exactly one level of subdomain:
Want a site and its subdomains? List both example.com and *.example.com.
Is your chain complete?
A server has to send its own certificate and the intermediates that link it to a root clients already hold. In TLS 1.3 the server certificate must come first, and each one after it should certify the one before.
www.example.com
Issuer: Example Issuing CA
↓
Example Issuing CA
Issuer: Example Root
fullchain.pem
↓
Example Root
Issuer: Example Root
Clients already have this
With Certbot, this comes down to one line of nginx config. Certbot writes the server certificate alone to cert.pem and the full set to fullchain.pem, and nginx's ssl_certificate needs fullchain.pem.
Here's our own site as an example. On Nov 4, 2026, americancloud.com sent three certificates. Paste only the first and the Chain row reads: "One certificate. Its issuer, WE1, isn't here. Serve this on its own and you've left out the intermediate." Paste all three and it reads "3 certificates line up", and notes that the last one's issuer, GlobalSign Root CA, isn't there. That's fine for a root.
Does this certificate match your CSR or key?
Paste the CSR under the certificate. If they share a public key, the certificate came from that CSR or another request using the same key.
Paste a CSR on its own and the Hostname row checks its names, so you can catch a missing one before your CA issues anything. You won't see an issuer or dates yet. Those come from the CA.
The tool won't read a private key, and you shouldn't paste one into any website. Compare it on your own machine: run this and match the result against the Public key SHA-256 row.
openssl pkey -in key.pem -pubout -outform der | openssl sha256Certificate lifetimes keep shrinking
Public CAs follow a schedule from the CA/Browser Forum that cuts the longest certificate they can issue from 398 days to 47 by March 2029.
Before Mar 15, 2026
398 days
From Mar 15, 2026
200 days
From Mar 15, 2027
100 days
From Mar 15, 2029
47 days
Private CAs aren't on this schedule: Kubernetes control plane certificates last a year by default, for example. For anything a public CA signs, renewing by hand isn't a plan at 47 days, so automate it now.
Decoding a certificate isn't decrypting it
A certificate isn't encrypted, so there's nothing to decrypt. That block of text is binary data in Base64, and every server hands its certificate to anyone who connects. The secret is the private key, and it isn't in the certificate.
And "SSL" is a leftover name, this page's title included. RFC 7568 says "SSLv3 MUST NOT be used", and today these same certificates secure TLS connections.
Check a certificate with OpenSSL
The tool takes PEM text and PEM or DER files, not PFX. For a PFX, or if you'd rather stay in your terminal, these commands run on your own machine:
# Decode a certificate
openssl x509 -in cert.pem -noout -text
# Decode a CSR
openssl req -in request.csr -noout -text
# See what a server sends
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
# Turn a binary DER file into PEM
openssl x509 -inform der -in cert.der -out cert.pem
# Pull the certificates out of a PFX
openssl pkcs12 -in file.pfx -nokeys -out cert.pemWhen every row passes and the browser still complains
All this decoder knows is what you give it. Along the chain it compares names and key IDs, and it doesn't verify signatures. It doesn't check whether a browser trusts the root or whether the certificate was revoked, and it doesn't connect to your server. So "line up" means the chain reads correctly, not that a browser will accept it.
Next, check what's live. Run the s_client command above and paste all its output in here: now you're checking what your server really sends, not the file you think it's sending.
Run HTTPS on a server you control
On an American Cloud VM, HTTPS is Certbot and nginx: our Next.js deploy guide gets a Let's Encrypt certificate, reconfigures nginx for port 443 and turns on automatic renewal. Before you request one, check that your domain points at the server with our DNS lookup. Our load balancers do SSL termination, and we don't charge egress fees on any of it. And if something still looks wrong, ask a person: our support team's median reply time is under 2 minutes.