CSR Decoder
Paste a certificate signing request, or open the .csr, .pem or .der file, and the page reads it field by field: the subject, the public key and its size, every extension the request asks for with the subject alternative names listed one by one, its attributes, the signature algorithm, the SHA-256 of the request and the SHA-256 pin of its public key. A second view lists the ASN.1 structure offset by offset, the same rows openssl asn1parse prints for the same file. The self-signature can be checked here too, with your browser's WebCrypto, for RSA and for ECDSA on P-256, P-384 and P-521 with SHA-1, SHA-256, SHA-384 or SHA-512; anything else is marked not checked, with the reason, rather than passed. What is not a request is named instead of guessed at: an issued certificate is identified as one, a private key is refused with none of its contents read out and nothing stored, and a cut-off request, or one whose lengths or nesting are broken, stops at the byte offset where reading failed. The reading happens in this tab, with nothing uploaded and no account.
subject C=US
O=Gizmobench Example
CN=fixture.example.test
key RSA, 2048-bit, exponent 65537
SAN DNS:fixture.example.test
DNS:www.fixture.example.test
extensions Subject alternative name
signed as SHA-256 with RSA
signature not checked yet
SHA-256 of the request, DER
A7:FD:56:0D:C4:7A:B5:0F:F5:52:4C:C2:89:55:C5:B5
6C:D6:76:12:16:B8:5E:2E:8A:70:86:9A:05:46:B6:32
SHA-256 of the public key, base64
hfMUvCj9j8Uj1+FR95Fe4d5Kr96bye8PcARc9HhuV6w=Decoded a signing request: RSA, 2048-bit, SHA-256 with RSA, subject C=US, O=Gizmobench Example, CN=fixture.example.test. Signature not checked yet.
Subject
| Name | Value |
|---|---|
| Country (C) | US |
| Organization (O) | Gizmobench Example |
| Common name (CN) | fixture.example.test |
Public key
| Field | Value |
|---|---|
| Key | RSA, 2048-bit, exponent 65537 |
| Size | 2,048 bits, read from the length of the modulus |
| Exponent | 65537 |
| Modulus | BCC09651FD62181AF549AAEB785BC482046272D12A505E66A65B974AA3D0D9B964A6D363C7A0C6355176E5706708D3E97872F3A245EED40ACB3452F934455601DAA79F21FAA3ACD9B8D5B175F8240119E9C001ECB2B687F2C096A619395223F5F4844CF99C587E0BC26FD5D0DBE10650F4A53E13E93C1B93ACFC5CA15C88144F14A44CC40FE5CBFC61B99DC45EB2ACB3B9B9E14D64B2575CF258C0F64E0172717954130B0B4150642AE2321F0B4567BD808D47A51909B603E21D1F9C1AE085CAFE57F7A9BFF15F9DD136698C8EFA8DECF9C4F5123EB8072D7997632B60EA801AD510047D6BABBD880BB87F9A4971C8AF194B88D785B52A99D2FDEEAFCBB3D801 |
| SHA-256 of the key, base64 | hfMUvCj9j8Uj1+FR95Fe4d5Kr96bye8PcARc9HhuV6w= |
| SHA-256 of the request | A7:FD:56:0D:C4:7A:B5:0F:F5:52:4C:C2:89:55:C5:B5:6C:D6:76:12:16:B8:5E:2E:8A:70:86:9A:05:46:B6:32 |
Requested extensions
| Extension | What it asks for |
|---|---|
| Subject alternative name2.5.29.17 | DNS:fixture.example.test, DNS:www.fixture.example.test |
Attributes
| Attribute | Value |
|---|---|
| Extension request1.2.840.113549.1.9.14 | 1 extension |
Examples
- RSA, 2048-bit, two DNS names requested, signature matches its key
- EC, 256-bit, explicit P-256 parameters; C=US, O=Gizmobench Example, CN=fixture.example.test, as openssl req -text shows
- named as an issued certificate, not a signing request, and not decoded as one
- stops at offset 0: the SEQUENCE claims 730 bytes and 11 follow
Up to 1 MB (1,048,576 characters or bytes) of PEM or DER, pasted, opened or dropped on the dark panel, read in this tab with no upload and no account. A private key is refused with none of its contents read out and nothing stored, and an issued certificate is named as one instead of being read as a request. The page remembers only whether you last looked at the summary or the ASN.1 view; the request itself is not kept, and Start over above the tool forgets that choice.
Common questions
- How do I decode a CSR?
- Paste it into the box, including the BEGIN CERTIFICATE REQUEST and END CERTIFICATE REQUEST lines, and the summary appears beside it as you type. You can also press Open file and pick a .csr, .req, .pem, .der or .txt file, or drop the file on the dark panel. A text file goes into the box as it is; a binary DER file is turned into base64 with BEGIN and END lines around it, so what the page decoded is always in front of you. A request copied as bare base64, out of a JSON field or a config file, with no BEGIN and END lines still works: the text is read as base64 DER, and the page says that is what it did. If the paste holds more than one request, the first is read and the page says how many there were. One reading takes up to 1 MB, hundreds of times the size of a real request.
- What is inside a certificate signing request?
- Besides a version number, four things, and the page shows each one. The subject is the name the certificate is being asked for, written as parts such as C for country, O for organization and CN for common name. The public key is the half of the key pair that will go into the certificate; the page shows its type and size, and for RSA the modulus and exponent, for EC the curve and the public point. The attributes carry anything else the request asks for, most often an extension request holding the subject alternative names, key usage and extended key usage the applicant wants. Last come the signature algorithm and the signature itself, made with the private key that matches the public key. The ASN.1 view lists all of it as bytes: the offset, type and length of each field, and what the known ones are.
- Does a matching signature mean the CSR is valid, or that a CA will accept it?
- It means one precise thing: the request was signed with the private key that belongs to the public key inside it, and nothing in the signed part has changed since. Whether a certificate authority accepts the request, and what it issues, is decided by that authority under its own rules, and this page says nothing about that. The check runs in your browser with WebCrypto for RSA, in both the PKCS#1 v1.5 and the PSS forms, and for ECDSA on P-256, P-384 and P-521, each with SHA-1, SHA-256, SHA-384 or SHA-512. A key whose curve is written out in full is checked only when its field, coefficients, base point, order and cofactor are identical to one of those three curves. Anything else, Ed25519, secp256k1, SHA-224 and DSA among them, is shown as not checked, with the reason. The example the page opens on waits for you to press Check signature; a request you paste, open or pick from the examples is checked as soon as it is read.
- How can I tell whether a CSR matches my private key or my certificate?
- Compare the SHA-256 of the public key. The page shows it in base64 in the summary as SHA-256 of the public key, and the same value comes from your own key with openssl pkey -in private.key -pubout -outform der | openssl dgst -sha256 -binary | openssl base64, and from a certificate with openssl x509 -in cert.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl base64. When the three agree, the request, the key and the certificate hold the same public key. Do this on your own machine: the private key never needs to come near this page, and a private key pasted here is refused without being read out.
- Where are the subject alternative names, and why does my CSR say none are requested?
- They live in the extension request attribute, and the page lists each one with its type, DNS, IP, email or URI, in the SAN line of the summary and in the Requested extensions table. When a request carries no subject alternative name extension, the page says so in a note. Browsers match a hostname against a certificate's SAN and have ignored the common name since 2017.
- Why is my EC key's size shown as not given?
- Because this page reports an EC key size only from something the request states outright. A named curve found in its fixed table, P-256, P-384, P-521, secp256k1, P-224, P-192, the three brainpool curves or SM2, gives the size that curve defines. A curve written out in full over a prime field gives the bit length of its prime; one over a binary field gets no size. A curve identifier the table does not hold is shown by its number, as a curve this page does not know, and gets no size, because a guessed size would be a number the request never stated.
- Can it read a certificate, or a private key?
- No, and it says which one you pasted. An issued certificate, labelled BEGIN CERTIFICATE or recognised by its shape, is named as a certificate and not decoded as a request: a request is what goes to a certificate authority, and the certificate is what comes back. A private key, by its PRIVATE KEY label or by the shape of its DER, is refused: a PEM or DER key file you open never reaches the box, a pasted key is not read out, and the key material is never quoted back. A PEM public key, CRL or PKCS#7 bundle is named the same way. A server address is refused too: this page reads a file, it does not connect to servers.
- Is my CSR uploaded or kept?
- Neither. The request is decoded in this tab and is not sent anywhere. The first check of a signature loads the checking code from this site, which carries nothing of yours. The only thing the page remembers in this browser is whether you last looked at the summary or the ASN.1 view; the request itself is not kept, so a fresh visit opens on the example again, and the Start over button above the tool forgets the view choice as well.
Reads the request's own bytes and shows its subject, public key, requested extensions and signature algorithm exactly as written, from PEM or DER up to 1 MB. The self-signature is checked in your browser only for RSA (PKCS#1 v1.5 or PSS) and ECDSA on P-256, P-384 or P-521, with SHA-1, SHA-256, SHA-384 or SHA-512, and anything else is marked not checked. A match shows the request was signed by the key it carries, not that a certificate authority will accept it or issue a certificate.