CSR Decoder and CSR Checker
Paste a certificate signing request and read every field it holds: the subject, the key, every alternative name and every extension. The page also checks the request against the rules a public CA applies, and tells you whether your private key matches it. An SSL certificate decodes here too.
Decoded in your browser. Nothing is uploaded, nothing is stored.
Drop the file anywhere on this page PEM, DER, .csr, .cer, .crt, .pem, .req, .txt
Everything on this page happens in your browser. Open your network panel and watch: no request carries your data.
What is a CSR?
A certificate signing request is a small signed file that asks a certificate authority for a certificate. It carries your public key, the names you want on the certificate, and a signature made with your private key.
The format is PKCS#10, written down in RFC 2986. The part that gets signed holds only four things: a version number, a subject name, a SubjectPublicKeyInfo holding your public key, and a set of attributes. The whole of that is then signed by the private key that goes with the public key inside it, so a CSR is self-signed. That signature is the proof of possession: anyone can read your public key, but only the holder of the private key can sign a request that verifies against it.
Your private key is not in the file and never should be. A CSR is safe to email, to paste into a CA's web form, and to decode here — which is why this page can do all of its work in your browser without sending anything anywhere.
- Wrapper4 bytes
- The part that gets signed469 bytes
- Which signature algorithm15 bytes
- The signature itself261 bytes
- Version3 bytesAlways zero: the only version the format defines
- Subject name108 bytesThe distinguished name you typed into the form
- Your public key294 bytesAlgorithm, size and the key — the one field a certificate authority is certain to use
- Attributes60 bytesWhere the alternative names you asked for travel
Your private keysigns the part aboveProof that you hold the matching private key · The signature covers that part alone, not the whole file

Paste or dropA CSR, a certificate or a public key — PEM, base64, a hex dump or a file. Several at once is fine.The verdictWhat a public CA does with this request: issue it, change it, or refuse it, with the reason for each.The namesEvery name the certificate would cover, with the common name checked against them.The key and the signatureAlgorithm, size, curve and exponent, and whether the request's own signature holds.Match a keyAdd the private key or the issued certificate to see whether it belongs to this request. Neither leaves your browser.How to check a CSR before you send it
Three things are worth checking: that the names are the ones you meant, that the signature verifies, and that nothing in it breaks a rule your CA applies.
Paste the request above. The page reads the subject attribute by attribute, lists every subject alternative name, shows the key's algorithm and size, and then checks the request's own signature. A request whose signature does not verify has been edited, truncated or corrupted since it was made — regenerate it rather than send it.
After that come the rules. A certificate authority applies the CA/Browser Forum's Baseline Requirements, and a request that breaks one of them is refused or quietly changed. The findings on this page are marked must fix when the CA cannot issue what you asked for, will be changed when it will issue but strip or alter a field, and worth knowing when nothing is wrong but something deserves a look.
- The namesEvery name the certificate would cover, and whether the common name is among them
- The signatureVerified with your browser's own cryptography
- The certificate authority's rulesApplied one at a time, each with the document it comes from
- Send itNothing in the request breaks a rule
- It will be refusedThe file is sound; what it asks for is not allowed
- Make it againA signature that does not verify means the file was edited, truncated or copied badly after it was made
What is in a CSR — and what your CA actually uses
Of everything in a CSR, a public CA reliably uses one field: the public key. Most of the rest it validates itself, overwrites, or is forbidden to copy.
DigiCert puts it plainly in its own documentation: "DigiCert uses the public key embedded in the CSR to create your client certificate. All other fields in the CSR are ignored." On an OV or EV certificate the CA has to validate the organisation, locality and country itself before they go in; what you typed is not taken on trust. Validity dates are never taken from a request: they follow the Baseline Requirements' schedule.
Two subject fields are not merely ignored but prohibited. organizationalUnitName (OU) must not appear in a public TLS certificate — under CA/Browser Forum ballot SC047 no certificate issued since 1 September 2022 may carry it — and emailAddress is not permitted in a domain-validated certificate at all. A common name is allowed but discouraged, and if it is present it must repeat one of the subject alternative names exactly. That last rule is why this page flags a common name that is missing from the SAN list.
| In your request | What becomes of it | Why |
|---|---|---|
| Public keySubjectPublicKeyInfo | Used as you sent it | The one thing a certificate authority is certain to take from you |
| Alternative namessubjectAltName2.5.29.17 | Used as you sent it | The CA confirms you control each name before it writes any of them down |
| Common nameCN2.5.4.3 | Validated, then written by the CA | Discouraged; if it is there it must repeat one of the alternative names exactly |
| Organisation, locality, stateO, L, ST2.5.4.10 | Validated, then written by the CA | On an organisation-validated certificate these come from the CA's own validated records, not from what you typed |
| CountryC2.5.4.6 | Validated, then written by the CA | May appear, whatever the validation level |
| Organisational unitOU2.5.4.11 | Not allowed at all | Prohibited in a public certificate since September 1, 2022 |
| Email addressemailAddress1.2.840.113549.1.9.1 | Not allowed at all | Not permitted in a domain-validated certificate |
| Valid from, valid tonotBefore, notAfter | Never comes from the request | Set by the schedule the certificate authority follows, never by your request |
“DigiCert uses the public key embedded in the CSR to create your client certificate. All other fields in the CSR are ignored.”
Why a CA rejects a CSR
Almost every rejection comes down to a name a CA may not certify, a wildcard that is too broad, a reserved IP address, a key that is too small, a signature hash that is too old, or a request whose signature does not verify.
A certificate authority may not issue for an internal name — one that "does not end with a Top-Level Domain registered in IANA's Root Zone Database". That catches server.local, intranet, a single-label name with no dot at all, and any made-up suffix. Labels must be letters, digits and hyphens, so an underscore in a host name is refused, and a name must not be written with a trailing dot. A wildcard may only replace the whole left-most label, and never a public suffix: *.example.com is fine, *.co.uk is not. An IP address may appear, but not a reserved one — no 10.0.0.0/8, 192.168.0.0/16, 127.0.0.1 or fc00::/7.
On keys, the Baseline Requirements are exact: an RSA modulus of at least 2048 bits, evenly divisible by 8, or a point on P-256, P-384 or P-521, and "no other algorithms or key sizes are permitted". A CA must also refuse a key it can factor, including one "which can be factored within 100 rounds using Fermat's factorization method" — this page runs that test on the key in your request. And although a CSR's own signature hash is not the certificate's, Let's Encrypt stopped accepting SHA-1 self-signatures in 2022, so an old tool that still signs with SHA-1 will have its request turned away.
server.localAn internal nameIt does not end in a top-level domain that exists in the public root zone, so nobody can prove it is yoursRefusedintranetA single labelA name with no dot at all falls under the same definitionRefusedmy_host.example.comAn underscoreA label may hold letters, digits and hyphens, and nothing elseRefused*.co.ukA wildcard over a whole registryA wildcard may stand in for the left-most label, never for a public suffixRefused192.168.1.10A reserved addressA public address can be certified; one from a private or special-purpose range never canRefusedexample.com.A trailing dotThe empty root label must not be written outRefused
How do I know my private key matches my CSR?
A private key file already carries its own public key, so the match is a comparison of two public keys — no secret is needed and nothing has to be sent anywhere.
Open Match a key or certificate above and add the key beside the request. The page reads only the public half out of the file — PKCS#8, PKCS#1 and SEC1 keys are all understood — compares it with the key in the request, and answers. Nothing is uploaded, nothing is kept, and the key is cleared when you leave the field. The same check works between a request and the certificate that came back from the CA, which catches "the certificate and the private key do not match" before a server refuses to start.
If you would rather not paste a key into any web page, the same answer is two commands on your own machine. openssl req -in request.csr -pubkey -noout prints the public key from the request and openssl pkey -in private.key -pubout prints it from the key: identical output means they match. The older -modulus form works for RSA keys only; -pubkey works for every key type.
- The private key fileThe file you must never send anywhereIts public half is read out
- The requestThe file you send to the certificate authorityIt already carries the public key
Are these the same key?
- They matchThe certificate that comes back will install against this key
- They do not matchThis is the mismatch a web server reports when it refuses to start
Nothing crosses this line · The comparison works with the network switched offAnywhere else
openssl req -in request.csr -pubkey -nooutopenssl pkey -in private.key -puboutIdentical output means they matchCSR, certificate, private key: what is the difference?
The private key is the secret. The CSR is a request that proves you hold it. The certificate is the CA's signed answer, and it is the only one of the three that is public by design.
The three files are often in the same folder with confusingly similar names. A private key begins -----BEGIN PRIVATE KEY----- or -----BEGIN RSA PRIVATE KEY----- and must never be sent to anyone, including a certificate authority. A certificate signing request begins -----BEGIN CERTIFICATE REQUEST-----, is signed by that key, and is safe to send. A certificate begins -----BEGIN CERTIFICATE-----, is signed by the CA, and is sent to every visitor of your site anyway.
Once the certificate has been issued, the request has no further use: it is not needed to install, renew or revoke anything. The key is what you must keep, and keep safe. Paste any of the three above and this page will tell you which one it is. For a certificate or a whole chain you received, the certificate decoder goes further: it checks each link and whether the major browsers' root stores trust it.
The private keySecret
Its first line
-----BEGIN PRIVATE KEY-----Also in wide use-----BEGIN RSA PRIVATE KEY------ Signed by
- Nothing — it is what does the signing
- Who may see it
- You, and nobody else
- What it is for
- Proves that this server is the one the certificate was issued to
The certificate signing requestPublic
Its first line
-----BEGIN CERTIFICATE REQUEST-----Also in wide use-----BEGIN NEW CERTIFICATE REQUEST------ Signed by
- Itself, with the private key
- Who may see it
- You and the certificate authority
- What it is for
- Asks for a certificate, and proves you hold the key it is for
The certificatePublic
Its first line
-----BEGIN CERTIFICATE------ Signed by
- The certificate authority
- Who may see it
- Every visitor to your site
- What it is for
- Tells a browser that this key belongs to these names
.csr.pem.req.txtNo standard assigns a request a file extension; all of these are in use, and this page reads the contents rather than the name
Is it safe to decode a CSR online?
A CSR holds no secret, so decoding one anywhere is harmless. A private key is a different matter, and that is the file people confuse it with.
Everything on this page runs in your browser. The request is parsed by code that was downloaded with the page, the signature is checked with your browser's own Web Crypto, and no request is made to any server with your data in it — you can watch the network panel while you use it. That is a property of how the page is built, not a promise we are asking you to take on trust.
The reason it matters is the file next to the CSR. The CA/Browser Forum's own definition is unforgiving: "A Private Key is said to be compromised if its value has been disclosed to an unauthorized person, or an unauthorized person has had access to it." No misuse is needed — reaching someone else's server is enough. In 2020 DigiCert found 337 private keys that customers had pasted in alongside their CSRs and revoked every certificate involved, writing that "by sending the private key to DigiCert along with the CSR, the customer has compromised the private key". If this page ever reads a private key you paste, it says so, refuses to decode it, and keeps none of it.
This page
- The file is read
- It is taken apart by code that arrived with the page
- The signature is checked by the browser itself
- The result is drawn
No request leaves with your data in itOpen the network panel and watch while you use it
A page that uploads it
The file is uploaded…together with whatever was pasted beside it
Someone else's server
A private key that arrives there is compromised by that alone
“A Private Key is said to be compromised if its value has been disclosed to an unauthorized person, or an unauthorized person has had access to it.”
It has already happenedIn 2020 one certificate authority found 337 private keys pasted in beside a requestEvery certificate involved was revoked
RSA or ECDSA: which key should a CSR ask for?
An ECDSA P-256 key is as strong as an RSA 3072-bit key and much smaller, so it is the better default. RSA 2048 remains universally accepted.
NIST puts P-256 and RSA-3072 at the same 128-bit security strength, and its table has no row for RSA-4096 at all: the next row is RSA-7680, at 192 bits, the level P-384 reaches. So a 4096-bit RSA key costs every visitor extra handshake work for no documented gain over 3072. The Baseline Requirements allow P-521 as well, but Let's Encrypt refuses it, so a P-521 request can be perfectly legal and still fail at the CA you were going to use.
Ed25519 is not an option for a public TLS certificate today, however good the algorithm is: the Baseline Requirements list RSA and the three NIST curves and add "no other algorithms or key sizes are permitted". Nor is a post-quantum key — the ballot that would have allowed ML-DSA in public TLS was closed unmerged in October 2026. Ed25519 and ML-DSA are still useful for SSH, for signing, and for a private CA, and this page reads requests that use them.
| Strength | RSA key | Curve |
|---|---|---|
| 112 bits of security | 2,048 bitsAny public CA | No curve a public certificate authority allows sits at this strength |
| 128 bits of security | 3,072 bitsAny public CA | P-256Any public CA |
| 4,096 bitsAny public CA4,096 bits is not in the table at all | ||
| 192 bits of security | 7,680 bitsAny public CA | P-384Any public CA |
| 256 bits of security | 15,360 bitsAny public CA | P-521Any public CA |
- RSA key
- Curve
- The steps go straight from one size to the next and skip the popular one in between, so the extra handshake work it costs every visitor buys nothing anybody has written down
- Accepted byLet's Encrypt
A curve carries the same strength in a fraction of the bytes
How to make a CSR on any platform
One OpenSSL command covers Linux, macOS and Windows with OpenSSL installed. IIS has certreq, macOS has Keychain Access, and this site has a generator that never sends your key anywhere.
With OpenSSL, openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com" makes the key and the request in one step. (-nodes leaves the key unencrypted. OpenSSL 3 also spells it -noenc, but the LibreSSL built into macOS knows only -nodes.) Then openssl req -in example.com.csr -text -verify -noout shows and verifies it. On Windows, certreq -new request.inf request.req reads an .inf file whose alternative names go under OID 2.5.29.17 with _continue_ lines — there is no SAN= key. Microsoft's own reference page warns that its example uses SHA-1, which a CA will now refuse, so set the hash yourself.
On a Mac, Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority writes one, with the key size behind the "Let me specify key pair information" box. Or use our CSR generator, which makes the key with your browser's Web Crypto and hands you both files without them touching a server. No standard assigns a file extension to a CSR: .csr, .pem, .req and .txt are all in use, and this page reads the contents rather than trusting the name.
OpenSSLLinux, macOS, Windows
Makes the key and the request in a single commandopenssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com"Then read it back and verify its own signatureopenssl req -in example.com.csr -text -verify -nooutcertreqWindows Server and IIS
Reads a plain text file; the alternative names go in an extensions section, one line eachcertreq -new request.inf request.req[Extensions] 2.5.29.17 = "{text}" _continue_ = "DNS=example.com&" _continue_ = "DNS=www.example.com"Microsoft's own example page is still written around a hash a certificate authority now refuses, so set the hash yourselfKeychain AccessmacOS
Keychain Access › Certificate Assistant › Request a Certificate From a Certificate AuthorityYour Mac names these menus in its own languageKey type and size hide behind the box that lets you specify the key pairRSA keys from 2048 to 4096 bits; smaller ones are no longer offeredDNS RobotAny browser
Makes the key with your browser's own cryptography and hands you both files without either touching a serverOpen the generator
How long will the certificate last?
A public TLS certificate issued today may not exceed 200 days. That falls to 100 days in March 2027 and to 47 days in March 2029.
The schedule comes from CA/Browser Forum ballot SC-081v3, adopted in April 2025, and it is not something a CSR can influence: validity never comes from the request. Each step has two numbers, a SHOULD NOT one day below the MUST NOT — 199 and 200 today, 99 and 100 from 2027-03-15, 46 and 47 from 2029-03-15. For the purpose of the count, "a day is measured as 86,400 seconds", and any part of a further day counts as a whole one.
The practical consequence is that renewal has to be automatic. If you are still making a CSR by hand every year, now is the time to move to ACME, where the client makes the request for you — and where, incidentally, PKCS#10 really is required, even though the Baseline Requirements themselves only ask for "a certificate request in a form prescribed by the CA".
- before March 15, 2026Where today sits397 days398 days
- from March 15, 2026199 days200 days
- from March 15, 202799 days100 days
- from March 15, 202946 days47 days
- The whole schedule comes from one ballot, SC-081v3, adopted April 11, 2025
- A day is counted as exactly 86,400 seconds and any part of a further day counts as a whole one
- Nothing in a request changes any of this
What the raw ASN.1 shows you
Under the base64, a CSR is a DER-encoded tree. The decoder draws it with byte offsets and names every object identifier it knows, which is what openssl asn1parse prints.
It is the honest way to show a field nobody has a friendly name for. Open Raw structure on any decoded item and you can see the CertificationRequestInfo, the subject's relative distinguished names one by one, the SubjectPublicKeyInfo, the attributes [0] set and, inside it, the extensionRequest attribute — object identifier 1.2.840.113549.1.9.14, defined not in RFC 2986 but in RFC 2985 §5.4.2 — carrying the very X.509 extensions of RFC 5280.
The other attribute you may meet there is challengePassword (1.2.840.113549.1.9.7). It was meant as a shared secret for revoking a certificate later, is still used by SCEP enrolment, and plays no part in a normal web certificate order. This page shows it when it is there, because a field you cannot see is a field you cannot check.
| At byte | Structure | Size |
|---|---|---|
| 0 | SEQUENCE | 749 bytes |
| 4 | SEQUENCE | 469 bytes |
| 8 | INTEGER0 | 3 bytes |
| 11 | SEQUENCE | 108 bytes |
| 13 | SET | 13 bytes |
| 15 | SEQUENCE | 11 bytes |
| 17 | OBJECT IDENTIFIERC2.5.4.6 | 5 bytes |
| 22 | PrintableStringUS | 4 bytes |
| 26 | SET | 21 bytes |
| 28 | SEQUENCE | 19 bytes |
| 30 | OBJECT IDENTIFIERST2.5.4.8 | 5 bytes |
| 35 | UTF8StringCalifornia | 12 bytes |
| 47 | SET | 24 bytes |
| 49 | SEQUENCE | 22 bytes |
| 51 | OBJECT IDENTIFIERL2.5.4.7 | 5 bytes |
| 56 | UTF8StringSan Francisco | 15 bytes |
| 71 | SET | 22 bytes |
| 73 | SEQUENCE | 20 bytes |
| 75 | OBJECT IDENTIFIERO2.5.4.10 | 5 bytes |
| 80 | UTF8StringExample Inc | 13 bytes |
| 93 | SET | 26 bytes |
| 95 | SEQUENCE | 24 bytes |
| 97 | OBJECT IDENTIFIERCN2.5.4.3 | 5 bytes |
| 102 | UTF8Stringwww.example.com | 17 bytes |
| 119 | SEQUENCE | 294 bytes |
| 123 | SEQUENCE | 15 bytes |
| 125 | OBJECT IDENTIFIERrsaEncryption1.2.840.113549.1.1.1 | 11 bytes |
| 136 | NULL | 2 bytes |
| 138 | BIT STRING2,160 bits30 82 01 0a 02 82 01 01 00 c5 47 47 1d 26 1c bf | 275 bytes |
| 413 | [0] | 60 bytes |
| 415 | SEQUENCE | 58 bytes |
| 417 | OBJECT IDENTIFIERextensionRequest1.2.840.113549.1.9.14 | 11 bytes |
| 428 | SET | 45 bytes |
| 430 | SEQUENCE | 43 bytes |
| 432 | SEQUENCE | 41 bytes |
| 434 | OBJECT IDENTIFIERSubject Alternative Name2.5.29.17 | 5 bytes |
| 439 | OCTET STRING32 bytes30 1e 82 0f 77 77 77 2e 65 78 61 6d 70 6c 65 2e | 34 bytes |
| 473 | SEQUENCE | 15 bytes |
| 475 | OBJECT IDENTIFIERsha256WithRSAEncryption1.2.840.113549.1.1.11 | 11 bytes |
| 486 | NULL | 2 bytes |
| 488 | BIT STRING2,048 bits00 57 41 c5 09 98 14 78 8c ee c3 61 d4 c0 e0 2d | 261 bytes |
- Holds other things
- Holds a value
- Named by its position
The attribute that carries the extensions
1.2.840.113549.1.9.14It is defined in a different document from the one that defines the request itself, which is why the alternative names travel inside an attribute instead of sitting beside the subjectThe other attribute you may meetNot in this request
1.2.840.113549.1.9.7A shared secret, meant for asking later that the certificate be revoked, and still used when a device enrols itself on a network
CSR decoder: questions and answers
How do I decode a CSR?
-----BEGIN CERTIFICATE REQUEST----- and -----END CERTIFICATE REQUEST----- lines, or drop the file on the page. It decodes as you paste: the subject, the public key, every subject alternative name, every requested extension and the fingerprints. You can also paste the base64 body on its own, a hex dump, or upload a binary DER file.Is this CSR decoder safe to use?
How do I check whether my CSR is valid?
Why does my certificate authority reject my CSR?
server.local or a single-label host name, an underscore in a host name, a wildcard over a public suffix like *.co.uk, a private IP address in the alternative names, an RSA key under 2048 bits, or a request still signed with SHA-1. Decode the request above and every one of those is named explicitly, with the rule it breaks.How do I know my private key matches my CSR?
openssl req -in request.csr -pubkey -noout and openssl pkey -in private.key -pubout print the same public key when they match. The same comparison works between a key and an issued certificate.Can this decode an SSL certificate too?
What fields does a certificate authority actually use from my CSR?
OU and, on domain-validated certificates, emailAddress.Does the common name still matter?
Can I decode several files at once?
What is a challenge password in a CSR?
Can I use an Ed25519 key for a public certificate?
How long is a certificate valid now?
Missing something?Suggest a feature or a new tool
Related tools
Certificate Decoder
Decode an SSL certificate or a whole chain: every field, each link checked, trust in the 4 browser root stores, PEM and DER
SSL Converter
Convert PFX to PEM, PEM to PFX, P7B, DER, CRT and CER: the files your server needs, in order, and your private key never leaves your browser
CSR Generator
Create a certificate signing request and private key in your browser: RSA or ECDSA, with SANs and the matching OpenSSL command
SSL Certificate Check
Verify SSL certificate validity and security details
DNS Health Check
Grade a domain's DNS: delegation, nameservers, SOA, DNSSEC and mail in 40 checks
DMARC Checker
Check any domain's DMARC policy the way receivers read it, with reports, SPF and DKIM
