Skip to content

All tools (45)

JSON 6
Time & Date 4
Encoding & Decoding 5
Generators 3
Text & Data 5
Logs & Debugging 2
Config & Infra 3
Security & Hashing 5
Color & Design 5
Numbers & Bits 3
Web & Markup 4

Nothing leaves the cave.

Nothing you paste ever leaves your device. There is no server to send it to.

How you can check →
DevToolsCave

    This tool runs entirely in your browser. Nothing you paste is uploaded.

    How you can check →

    SSL Certificate, CSR & Chain Decoder

    Security & Hashing

    Paste an SSL/TLS certificate, a CSR or a whole chain — PEM or bare base64. See every field, every SAN, the expiry, the key size and the exact fingerprint — and whether each link in the chain is really signed by the next. Checked in this tab, against nothing but the bytes you pasted.

    Decoding, fingerprinting and signature verification all happen locally in your browser. Nothing you paste here is sent to any server. A private key is refused before it is parsed at all.

    Paste a certificate, CSR or chain above, or try an example, to see it decoded here.

    What is in an X.509 certificate

    An X.509 certificate — the kind behind every SSL/TLS connection — binds a public key to an identity (the subject) and is itself signed by another certificate's private key (the issuer). It carries the subject and issuer names, a serial number, a validity window, the public key and its type, a signature, and a set of extensions — Subject Alternative Names (SANs), key usage flags, basic constraints, and identifiers that link a chain together. This online decoder reads every one of those fields from the raw DER bytes with a hand-written parser, not a generic library, so a field that is malformed or unusual is reported specifically rather than silently mis-read.

    PEM, DER, .crt, .cer and .pem — which formats work

    Most certificate files are PEM: base64 text between -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----. A .pem, .crt or .cer file that opens as readable text in an editor is PEM — paste its contents here. Several blocks in one paste, such as a Let's Encrypt fullchain.pem or an Apache SSLCertificateChainFile, are decoded as a chain. Base64 with no BEGIN line at all — the way a Kubernetes Secret stores tls.crt — is accepted too. Indentation copied from a YAML file is stripped, and a body whose length is not a multiple of four is reported as truncated with the exact count. A binary DER file is not accepted as a file yet; convert it with openssl x509 -inform der -in cert.der -out cert.pem and paste the result. A PKCS#7 (.p7b) bundle is named for what it is rather than mis-parsed, and this page does not read it yet. PKCS#12 (.pfx, .p12) is out of scope entirely — it contains a private key, and this page will never ask for its password.

    Expiry, key size and signature algorithm

    The Summary tab shows the validity window and the days remaining, computed against your device's clock and labelled as such — an expired certificate and a not-yet-valid one are reported separately, because they have different causes. The Key tab shows what the public key actually is: for RSA the modulus size in bits (2048, 3072, 4096) and the exponent, for ECDSA the named curve — prime256v1 (P-256), secp384r1 (P-384) or secp521r1 (P-521) — and for Ed25519 or Ed448 the algorithm itself, since those carry no parameters. The signature algorithm is shown next to it: a SHA-1 signature is flagged as cryptographically broken even when it verifies, and an MD5 one is reported as not checkable in a browser rather than treated as ordinary.

    Fingerprint, thumbprint, serial number and SPKI pin

    The SHA-256 fingerprint — Windows calls the same value the thumbprint — is the hash of the entire DER-encoded certificate, printed colon-separated in uppercase to match openssl x509 -fingerprint -sha256 and the Windows certificate viewer, with SHA-1 alongside for older tooling. The serial number is shown as hex exactly as OpenSSL prints it, including any leading zero byte, so the string you copy into a revocation form or a support ticket is byte-for-byte what the CA issued. The SPKI pin is a different value over different bytes: the SHA-256 of the public key alone, base64-encoded, which is what pin-sha256, HPKP and mobile certificate-pinning configs expect. Every one of them has a copy button, and each is labelled with what it hashes so the two are never confused.

    CN vs SAN, and why a certificate with only a CN fails

    Older certificates put a hostname in the subject's Common Name (CN). Since RFC 2818 was superseded, every current browser matches only the Subject Alternative Name extension — a certificate with a CN and no matching SAN is not valid for any hostname, no matter how the CN reads. This is a real, common deployment failure, and this tool flags it explicitly rather than leaving you to notice a missing extension yourself.

    Decoding a CSR (certificate signing request)

    A CSR is what you send to a certificate authority to get a certificate issued. Paste a -----BEGIN CERTIFICATE REQUEST----- block — or the -----BEGIN NEW CERTIFICATE REQUEST----- form that Windows and IIS produce — and the decoder shows the subject, the requested SANs, and the key type and size. Those SANs live in an extensionRequest attribute nested two levels deeper than in a certificate, which is why "my SANs disappeared" is such a common CSR complaint: many viewers never look there. A CSR's signature proves only that whoever made it holds the matching private key — not who they are, and not that any CA will issue for it. A CSR has no issuer and no expiry, and this page says so instead of rendering empty rows.

    Checking the certificate chain: leaf, intermediate, root

    A server usually presents more than one certificate: the leaf (yours), one or more intermediates, and sometimes the root. The conventional order is leaf first, each certificate signed by the next. If you paste a bundle in a different order, this tool says so rather than silently reordering it — the point is to describe the chain exactly as your server would send it, because "I reordered it and it works" answers a different question than a failing handshake is asking.

    What we check, and what we cannot

    For each adjacent pair in a pasted chain, this tool checks three separate things: does the issuer's name match, does the issuer's public key actually verify the signature (via crypto.subtle.verify), and does the Authority/Subject Key Identifier hint line up. A name match with a failed signature usually means the wrong intermediate came from the right CA — a real, otherwise-baffling failure this tool is specifically good at showing. We do not check the certificate against any trust store — the result says "signed by the certificate above it", never "trusted" — and we do not check revocation (OCSP/CRL), because neither is reachable from a browser. Distribution-point URLs are shown as read, never contacted.

    Why you should not paste a private key anywhere

    A private key is the one artifact that must never leave the machine it lives on. This page checks the raw text you paste for private-key armour before any parsing happens at all — not after, not on a server — and if it finds one, it refuses to read it and clears the box. That check runs whether or not this page is trustworthy, and the same caution should apply to every other page you might be tempted to paste a key into.

    The OpenSSL equivalents

    Everything here mirrors a command you can run offline:

    • openssl x509 -in cert.pem -text -noout — decode a certificate
    • openssl x509 -in cert.pem -noout -fingerprint -sha256 — the SHA-256 fingerprint
    • openssl x509 -inform der -in cert.der -out cert.pem — convert DER to PEM
    • openssl req -in req.csr -text -noout — decode a CSR
    • openssl s_client -connect example.com:443 -showcerts — fetch a live server's chain to paste here
    • openssl verify -untrusted chain.pem cert.pem — check a chain against a trust store, which this page does not do

    Frequently asked questions

    Does my certificate get uploaded?
    No. Decoding, fingerprinting and signature verification all run in your browser via the Web Crypto API. Nothing you paste is sent to any server — you can check this in your browser's Network tab, and the privacy receipt at the bottom of the page reports the measured number of third-party requests (zero).
    Can I decode a CSR (certificate signing request)?
    Yes. Paste a -----BEGIN CERTIFICATE REQUEST----- block (or the -----BEGIN NEW CERTIFICATE REQUEST----- form Windows produces) and the tool shows the subject, the requested SANs, and the key type and size. A CSR's signature proves the requester holds the private key matching the enclosed public key — proof of possession, not identity, and not validity. A CSR has no validity dates and no issuer, and this tool says so rather than rendering empty fields for them.
    Can I open a .crt, .cer or .pem file with this?
    If the file is PEM — text that starts with -----BEGIN CERTIFICATE-----, which is what most .crt, .cer and .pem files contain — open it in any text editor and paste the contents here. A binary DER file (usually .der, sometimes .cer) is not accepted as a file yet; convert it first with openssl x509 -inform der -in cert.der -out cert.pem and paste the result.
    How do I find the SHA-256 fingerprint or thumbprint of a certificate?
    Paste the certificate and the SHA-256 fingerprint is on the Summary tab, with SHA-1 and the SPKI pin on the Key tab, each with a copy button. "Thumbprint" is the Windows name for the same value — the hash of the whole DER-encoded certificate — so the string here matches what certmgr and openssl x509 -fingerprint print, colons and all.
    Can I check when an SSL certificate expires?
    For a certificate you paste, yes: the Summary tab shows the validity dates and the days remaining, computed against your device's clock and labelled as such. Expired and not-yet-valid are reported separately, because they are different bugs. This tool does not connect to a live server to fetch its certificate — export the certificate from your browser or with openssl s_client and paste it.
    Does it work with a Let's Encrypt fullchain.pem or a Kubernetes tls.crt?
    Yes to both. A fullchain.pem is several PEM blocks in one file — paste the whole thing and each certificate becomes a node in the chain view, with the link between each pair checked. A Kubernetes Secret stores tls.crt as bare base64 with no -----BEGIN----- armour; paste that value as-is and the tool decodes it.
    Why does it say "signed by" and not "trusted"?
    This tool checks cryptographic linkage between the certificates you pasted — does the next certificate up the chain actually sign the one below it. It does not ship a trust store (Mozilla's CA bundle is megabytes and stale the day it ships), so it never claims a certificate is trusted by any real browser, only that the signature checks out against what you pasted.
    Can it check whether the certificate is revoked?
    No. Revocation checking (OCSP or CRL) needs a network request a browser cannot make to most responders — no CORS, and some aren't even HTTP. This tool displays the OCSP and CRL distribution-point URLs from the certificate's extensions and says clearly that they were read, not contacted.
    What is the difference between the certificate fingerprint and the SPKI pin?
    The certificate fingerprint (SHA-256 or SHA-1) hashes the complete DER-encoded certificate. The SPKI pin hashes only the SubjectPublicKeyInfo — the public key alone — which is what HPKP and mobile certificate pinning configs want. They are different values over different bytes; this tool labels both so you never mix them up.
    Why does my certificate work in one browser and not another?
    The most common cause is a missing intermediate certificate — the server sent the leaf but not the chain that links it to a trusted root. This tool is specifically good at showing that: paste the chain as your server sends it, and a broken or missing link is reported on the exact pair of certificates involved, not as one vague failure.