Get a certificate's SHA-256 fingerprint in your browser. Inventory every object in a PEM bundle, compare against openssl, and export DER or PEM.
Paste a certificate and this tool prints its SHA-256 fingerprint, computed in your browser from the certificate’s DER bytes. That is the same value openssl x509 -fingerprint -sha256 produces and the same value Chrome and Firefox show in their certificate viewer, so you can compare a certificate you were handed against a fingerprint someone published without installing anything or uploading the file.
It handles the messy real-world case too: a .pem file that turns out to contain four objects, a bundle where nobody is sure which block is the leaf, or a blob of base64 with no header at all. Every object in the input is inventoried separately with its own byte count and its own SHA-256, and the leaf certificate is parsed so you can see what you are actually fingerprinting.
The terminology causes more confusion than the cryptography does. A certificate fingerprint is simply a hash of the certificate’s complete DER encoding. It is not a field inside the certificate, it is not the serial number, and it is not derived from the public key alone. Different tools present the same number differently:
| Where you see it | Name used | Algorithm | Format |
|---|---|---|---|
| This tool | SHA-256 | SHA-256 | 64 lowercase hex characters, no separators |
| OpenSSL | Fingerprint | Whichever you ask for | Uppercase hex, colon-separated |
| Windows certmgr / PowerShell | Thumbprint | SHA-1 | Uppercase hex, no separators |
| Chrome / Firefox viewer | Fingerprint | SHA-256 and SHA-1 | Uppercase hex, space-separated |
| Certificate pinning config | Pin / SPKI hash | SHA-256 of the public key | Base64 — a different value entirely |
Two practical consequences. First, a Windows “thumbprint” that does not match a SHA-256 fingerprint is not a mismatch — it is a SHA-1 value of the same certificate. Second, an HPKP or Android network-security-config pin is a hash of the SubjectPublicKeyInfo, not of the certificate, so it deliberately survives certificate renewal. Comparing a pin against a certificate fingerprint will never match, and that is correct behaviour rather than a bug.
Comparison is case-insensitive and separator-insensitive in meaning but not in text. Strip colons and lowercase both sides before you diff them, or you will chase a difference that is not there.
Every one of these produces the identical digest for the same certificate, because every one of them hashes the same DER bytes:
openssl x509 -in cert.pem -noout -fingerprint -sha256openssl x509 -in cert.pem -outform der | openssl dgst -sha256openssl x509 -in cert.der -inform der -noout -fingerprint -sha256openssl s_client -connect example.com:443 -servername example.com </dev/null | openssl x509 -noout -fingerprint -sha256(New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 'cert.cer').ThumbprintNote the trap in the second form: piping a PEM file into openssl dgst without the -outform der conversion hashes the base64 text plus its header lines, which is not the fingerprint and will not match anything. The conversion is what makes the numbers agree.
PEM is a container format, so one file can hold any number of objects, and files arrive misnamed constantly. The inventory scans the input for complete -----BEGIN label----- / -----END label----- pairs and lists every one it finds, in order, with:
If the input contains no PEM header at all, the whole thing is treated as base64 DER and decoded as a certificate. That covers the common case of a certificate pasted out of a JSON field, a Kubernetes secret, or a configuration file with the armour stripped.
Bounds are enforced so a pasted mistake cannot hang the page: 1 MiB of total input, at most 32 PEM blocks in one pass, and 512 KiB per block. A file you open from disk is also capped at 1 MiB and is read locally — the file picker never uploads.
When at least one CERTIFICATE block is present, its X.509 structure is decoded and summarised: subject and issuer distinguished names, serial number, the notBefore and notAfter validity window in ISO form, days remaining, signature algorithm, public key algorithm and key size, all subject alternative names (DNS, IP, email, and URI entries together), and whether subject and issuer match, which indicates a self-signed certificate.
Alongside the summary the tool raises findings without contacting anything:
| Finding | Severity | Trigger |
|---|---|---|
| Certificate is expired | High | notAfter is in the past |
| Certificate expires within 30 days | Medium | 30 or fewer days remain |
| Legacy signature digest | High | Signature algorithm names SHA-1 or MD5 |
| RSA key is smaller than 2048 bits | High | RSA public key under 2048 bits |
| Self-signed certificate | Low | Subject equals issuer |
| Private key material detected | High | A block label contains PRIVATE KEY |
| No X.509 certificate block found | Low | Material can be fingerprinted but not parsed as a certificate |
This is the limit worth stating plainly, because it is where certificate work goes wrong. Everything above is read out of the bytes you supplied. A fingerprint proves that two people are looking at the same certificate; it proves nothing about whether that certificate should be trusted. Chain construction to a trusted root, revocation status, name matching against the host you actually connected to, and policy constraints are all separate questions that need either an anchor set or a live endpoint.
Those questions have their own tools, and a saved workspace carries across to them: the certificate chain builder for leaf-to-root assembly, the OCSP and CRL checker for an explicit revocation lookup, certificate transparency search for what has been publicly issued for a domain, and the SSL checker for what a live server actually serves.
Raw input stays in page memory and is deliberately excluded from any saved workspace record. If you paste something whose PEM label contains PRIVATE KEY, the tool inventories and fingerprints it, warns you at high severity, and still writes none of those bytes to storage. The general advice stands regardless: do not paste production private keys into tools you do not need to paste them into.
What a saved workspace does hold is the derived material — object labels, byte counts, fingerprints, the parsed certificate summary, findings, and your own notes and tags. It lives in this browser’s local storage, expires after 30 days, and is capped at 24 workspaces of 128 KiB each. Nothing is transmitted, and clearing site data removes it permanently.
.pem, .crt, .cer, .der, .csr, or .key file from disk. DER files are converted to PEM for display automatically.Check three things in order. Are you comparing the same algorithm — a Windows thumbprint is SHA-1, not SHA-256. Are you comparing the same formatting — strip colons and case before diffing. And are you comparing the same certificate — in a bundle it is easy to fingerprint the intermediate instead of the leaf. If all three match and the values still differ, the certificates genuinely differ.
No. PEM is base64-encoded DER wrapped in header lines, so both encodings carry identical bytes underneath and the fingerprint is computed from those bytes. Converting formats, re-wrapping a bundle, or changing line endings leaves the fingerprint unchanged. Re-issuing or renewing the certificate changes it completely.
No. Parsing, hashing, and conversion all run in your browser using the Web Crypto API, and no request is made. Raw input is additionally excluded from saved workspaces, so private key bytes are never written to storage even locally.
Yes, and the tool will show a SHA-256 for any PEM object you give it. Be clear about what the number means: it is a digest of that object’s DER encoding, which is fine for proving two copies are identical, but only the digest of a CERTIFICATE block is what anyone means by a certificate fingerprint.
As many as you like — a typical server bundle holds the leaf plus one or two intermediates, and a CA bundle holds hundreds. This tool inspects up to 32 objects in a single pass, which covers a server bundle comfortably. For very large trust stores, split the file first.
A fingerprint hashes the whole certificate, so it changes on every renewal. A pin normally hashes the SubjectPublicKeyInfo, so it survives renewal as long as the key is reused. They are different values by design and will never be equal.
It means nothing in the input carried the CERTIFICATE label, so there are no certificate fields to summarise. That is normal for a file that holds only a key or only a CSR. The inventory, fingerprints, and format conversion all still work; only the parsed summary is unavailable.
No. This and the rest of our security tools are free and need no signup. To decode a certificate’s full field and extension set, use the X.509 decoder; to generate a CSR or convert between PEM, DER, PFX, and P7B, use the CSR generator and format converter.
No. Parsing confirms readable structure. Trust also depends on chain construction, cryptographic verification, hostname and purpose policy, time, revocation, and the platform trust store.
No. The page can identify a private-key PEM block and warns about it, but raw PEM/DER bytes and keys are excluded from saved workspace data and JSON evidence.
You can download locally loaded blocks as PEM or DER while they remain in page memory. The workspace evidence export contains fingerprints and normalized summaries, not the raw certificate or key material.
Decode and analyze X.509 SSL/TLS certificates. Parse PEM, DER, and CRT formats with detailed certificate chain validation and security analysis.
Build complete SSL/TLS certificate chains automatically — upload your certificate and the tool fetches the missing intermediate CA certs.
Generate CSRs, convert between PEM/DER/PFX/P7B formats, and verify certificate chains - 100% client-side
Search Certificate Transparency logs to find every SSL/TLS certificate issued for a domain and spot unauthorized or unexpected certificates.
Check certificate revocation status via OCSP and CRL.