CSR Decoder — Certificate Signing Request
Paste a CSR (the block starting with -----BEGIN CERTIFICATE REQUEST-----) or drop the .csr file. Everything is decoded and checked in your browser: what the CA will see, whether the signature holds, and what it is likely to reject.
Decoded in your browser: the CSR never leaves this page, and a private key pasted along with it is skipped.
Drop a file here, or
Files are read in your browser and never uploaded.
What a CSR is
A certificate signing request is what you send a certificate authority to ask for a certificate. Its format is PKCS #10, published as RFC 2986: a certificationRequestInfo structure with a version, the subject's distinguished name, the public key as a SubjectPublicKeyInfo, and a set of attributes — followed by a signature over that structure, made with the private key that belongs to the public key inside. Attribute types come from PKCS #9 (RFC 2985); the important one is extensionRequest, which carries the X.509 extensions you would like in the certificate, above all the subject alternative names.
The request is public by design: it holds no secret, only the public key and the names you want certified. The private key stays with you. That is why a CSR can be pasted here safely — and why you should never paste the key that goes with it, here or anywhere.
What the decoder checks
Everything is read from the DER bytes with a strict decoder, so a request that a lenient parser would accept but a CA would refuse shows up as malformed rather than half-decoded. Then the decoder looks at it the way a CA's validation does:
- The self-signature. The signature is verified over the exact bytes of
certificationRequestInfo, with the public key the request contains. A valid signature proves that whoever made the request holds the private key; an invalid one means the CSR was edited after signing or corrupted in transit. RSA (PKCS #1 v1.5 and PSS), ECDSA, Ed25519 and Ed448, and ML-DSA signatures are checked locally. - The key. Its algorithm, size and curve are compared with what publicly trusted CAs accept: RSA of 2048 bits or more, ECDSA on P-256, P-384 or P-521. Weak, unusual or post-quantum keys are named as such — public CAs do not issue post-quantum TLS certificates yet, though a private CA can.
- The names. Browsers have ignored the common name since 2017 and match only subject alternative names (RFC 6125, CA/Browser Forum Baseline Requirements). The decoder warns when a request has no SAN, when the common name is not repeated among the SANs, and checks each DNS name and IP address: internal names such as
intranetordb.internal, underscores, partial wildcards likew*.example.com, reserved IP ranges — all of which public CAs refuse. - The subject. Upper bounds from RFC 5280 Appendix A (64 characters for a common name), PrintableString character sets, two-letter country codes, and the attributes CAs drop anyway, such as organisational units.
- Requested extensions and attributes. Duplicates, critical extensions nobody understands, keyCertSign without CA:TRUE, keyEncipherment for keys that cannot encrypt, and a
challengePasswordattribute, which travels in clear text inside the request.
Findings are sorted with errors first. An error is something a CA will reject; a warning is something it will silently change or that will hurt you later; a note is information.
Reading the result
The summary shows the subject both as OpenSSL prints it and in RFC 4514 form, every requested name, and the public key with its SHA-256 pin — the same value an HTTP public key pin or a certificate made from this request will carry, so you can match the certificate you get back to the request you sent. The requested extensions are listed with their criticality, and the request is re-armoured as clean PEM with 64-character lines, ready to paste into a CA's form. The equivalent OpenSSL command is there too, if you prefer to check it on your own machine.
If a request does not decode, the message says why: a certificate pasted instead of a request, a private key on its own, a truncated PEM block, or bytes that are not DER.
What runs where
Decoding, the signature check and every finding are computed in this page, in your browser. The page sends nothing about the request to any server. If a private key is pasted together with the CSR, it is skipped unread and reported. Share links keep the request in the URL fragment, which browsers do not send to servers; they never carry a private key, and a request with a challengePassword is not put into a link at all. To create a request in the browser instead of decoding one, use the CSR generator; once the CA has answered, the certificate decoder reads what it issued.