Decode an X.509 certificate field by field, check which host names it covers, and verify that each certificate in a chain was signed by the one above it
Initializing in your browser…
Build a PKCS#10 certificate signing request with subject alternative names, RSA, ECDSA or Ed25519. Signed and verified in the page before you send it to a CA.
Generate SSL/TLS certificates for local development, with hostnames placed in the Subject Alternative Name where browsers look. Exports PKCS#8, PKCS#1 and PKCS#12, with fingerprints and install config.
Read the certificate chain a server sends and say whether it is complete, in order and in date, and build the OpenSSL commands that fetch it.
A colleague sends a root certificate to add to a trust store and you want to know what it actually is before you do that. The Load sample button on the tool holds this exact certificate, so every value below can be reproduced in one click.
Pasted
-----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh ... CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE-----
Decoded
Subject CN=DigiCert Global Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
Issuer the same, so this is self-issued
Serial 083BE056904246B1A1756AC95991C74A (10944719598952040374951832963794454346)
Validity 2006-11-10 00:00:00 UTC to 2031-11-10 00:00:00 UTC, a 9131 day lifetime
Key RSA 2048 bit, exponent 65537
Signature sha1WithRSAEncryption
Extensions 3 of 3 decoded
Key Usage [critical] Digital Signature, Certificate Sign, CRL Sign
Basic Constraints [critical] CA:TRUE
Subject Key Identifier 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
SHA-1 A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
Pin r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=
Signed with SHA-1 with RSA MD5 and SHA-1 signatures have been refused by every
mainstream browser since 2017.
No Subject Alternative Name Chrome stopped falling back to the Common Name in
version 58. This certificate covers no host name.
This is a CA certificate Basic constraints say CA:TRUE.
Issuer and subject are the same.
Signature verified (self-signed)The three lines that matter here are the ones the tool volunteers. Basic constraints say CA:TRUE, so this signs other certificates rather than serving a site, and adding it to a trust store means trusting everything it has ever signed. It carries no Subject Alternative Name, so it covers no host name at all and typing one into the host box returns no match with that as the reason. And it is signed with SHA-1, which is fine for a self-signed root because nothing verifies a root's own signature in practice, but would be fatal on a leaf. The SHA-1 fingerprint shown is DigiCert's published value for this root, which is how you confirm the file you were sent is the certificate you think it is. The signature is checked against the certificate's own key, since issuer and subject are the same, and it verifies.
Your CI pipeline just failed with a cryptic certificate error, and you need to know what is inside that PEM file right now. Paste a certificate, or drop the .pem, .crt, .cer or .der file, and every field is decoded as you type: subject and issuer with every attribute in order, serial, validity, public key, all nine kinds of Subject Alternative Name, and the standard extensions in words rather than hex. Type a host name and it tells you whether the certificate covers it, and why. Paste a fullchain.pem and each certificate's signature is checked against the one that issued it.
X.509 packs a lot of structured data into a Base64 blob, and most of the interesting parts are nested inside extensions. This decoder reads the DER itself rather than leaning on a library's summary, and every field it prints is compared against `openssl x509 -text` in the project's test suite: 472 assertions across thirteen certificates covering RSA, ECDSA P-256 and P-384, Ed25519 and RSASSA-PSS, a v1 certificate with no extensions at all, a certificate with two organizational units, one with a non-ASCII subject, one whose serial carries a DER pad byte, and one with a critical extension nothing here recognises.
The distinguished names keep every attribute in the order the certificate stores them, including repeated ones: a subject with two OU values shows both, and a multi-valued RDN is marked as such. Values are decoded according to the string type their tag names, so a UTF8String holding a German organisation name reads as "Münchener Straßenbahn GmbH" rather than as mojibake. The RFC 4514 one-line form is shown underneath and can be copied.
The serial is shown the way OpenSSL shows it, as the integer. DER stores a positive integer whose top bit is set with a leading zero byte, and that byte is not part of the serial; where the two differ, the DER bytes are shown underneath with a note, because comparing a serial against what a CA displays is a common reason to open this tool.
Extensions are decoded, not dumped. Basic constraints give CA and path length. Key usage is the nine named bits of RFC 5280 section 4.2.1.3, not a bit string in hex. Extended key usage names each purpose and gives its OID. Subject Alternative Name handles all nine GeneralName kinds: DNS, IP (v4 and v6, printed uncompressed the way OpenSSL prints it with the readable compressed form beside it), email, URI, directory name, registered ID and otherName. Authority and subject key identifiers, CRL distribution points, authority information access with its OCSP and CA Issuers URLs, certificate policies with their CPS links, name constraints, the TLS feature extension used for OCSP must-staple, and a count of embedded certificate transparency timestamps are all read. Anything else is shown with its OID and its raw value, and if it is marked critical the page says so out loud, because RFC 5280 section 4.2 requires software that does not understand a critical extension to reject the certificate.
Three things are checked rather than just displayed. Host name matching follows RFC 6125 as browsers apply it and as `openssl x509 -checkhost` implements it: a wildcard is the whole leftmost label, covers exactly one label, and never matches the bare domain, and a certificate carrying any dNSName in its SAN is never checked against its Common Name. Signature verification uses the Web Crypto API to confirm that a certificate was really signed by the key in the certificate above it, covering RSA PKCS#1 v1.5, RSASSA-PSS, ECDSA on P-256, P-384 and P-521, and Ed25519; a fullchain.pem is linked up by name and key identifier and each link is confirmed by the signature, so a chain pasted out of order still resolves. Fingerprints are SHA-256 and SHA-1 over the certificate plus the base64 SHA-256 of the public key, which is the pin-sha256 value.
What this tool does not do: it has no network access, so it cannot fetch a certificate from a host, check revocation, or tell you whether a root is in any trust store. "Within its validity period" is a statement about dates and nothing more.
Type the host you are connecting to and get a yes or no with the reason, rather than reading a SAN list yourself and hoping you applied the wildcard rule correctly.
Confirm the new certificate has the right validity window, key size, SANs and key usage, and that it really was signed by the intermediate you expect.
Paste the whole fullchain.pem. Each certificate is listed with its subject and with the index of the one that signed it, confirmed by the signature.
See the full extension set including anything critical that standard tooling would refuse, before you install it in a trust store.
The base64 SHA-256 of the SubjectPublicKeyInfo is computed for you, which is the value pinning configurations want.
PEM (the BEGIN CERTIFICATE block), bare Base64 with the markers stripped, and binary DER by file upload or drag and drop. A file holding several certificates, such as a fullchain.pem, is read as a chain.
Yes. Every certificate in the file is listed, and each one is linked to whichever certificate in the file signed it, confirmed by verifying the signature rather than by trusting the order of the file.
No. It means the bytes in front of you were really signed by the key in the certificate above them. Trust depends on whether the root is in your trust store and on revocation, and neither can be checked without a network, which this page does not have.
Usually the wildcard rule. A wildcard covers exactly one label, so *.example.com covers a.example.com but neither example.com nor a.b.example.com. The other common reason is that the certificate has no Subject Alternative Name at all, so only the Common Name exists to check against, and browsers stopped accepting that in 2017.
It is not, once the encoding is accounted for. DER stores a positive integer whose leading bit is set with an extra zero byte in front, and that byte is not part of the serial. The page shows the integer, the same as openssl x509 -serial, and shows the DER bytes underneath when the two differ.
Only if it is also marked critical. RFC 5280 requires software that meets a critical extension it does not understand to reject the certificate, so that combination is flagged. The raw value is shown either way.
No. Decoding, hashing and signature verification all happen in the page. The certificate never goes into the URL, the browser history or a share link.
This runs as client-side JavaScript. Keys, tokens, payloads, and other inputs never leave your device.