OCSP Response & Request Decoder
Reads an OCSP message — RFC 6960 — from a DER file, base64, PEM or a hex capture, and shows what a client would make of it. For a response that means the OCSPResponseStatus first, because only successful carries any data at all: a six-byte tryLater is a complete, valid response that says nothing about any certificate, and reading it as a truncated file is a common false alarm. Then the responder ID and which form it takes, by name or by the SHA-1 of the responder key; producedAt; and for every single response the CertID, the good, revoked or unknown status, thisUpdate, nextUpdate, and for a revoked certificate the revocation time and the CRLReason. The extensions worth reading are decoded rather than listed as bare OIDs: the nonce at request and response level, the archive cutoff, the CRL reference, and extended-revoke, which changes what unknown means, because a responder that sets it answers revoked for certificates it never issued. The page also answers the questions people actually open a decoder for. Is this response still fresh — thisUpdate and nextUpdate are compared against a reference instant that is shown, and a response with no nextUpdate is called out as good until superseded rather than quietly treated as current. Did the responder echo my nonce — paste the request you sent and the two are compared, since a dropped nonce is the single most common surprise when debugging stapling. Is this signed by the CA itself or by a delegated responder — the public key of each certificate carried in the response is hashed and matched against the issuerKeyHash in the CertID, and a delegated responder without id-kp-OCSPSigning in its extended key usage is flagged, because clients must reject it. Two limits are worth stating plainly. A CertID identifies a certificate by hashes of the issuer name and issuer key plus a serial number, so it cannot be turned back into a subject name — the decoder cannot tell you which website this is about, only which serial the issuer numbered it. And nothing here verifies the signature: that needs the issuer public key, which the page does not have, so everything shown is what the bytes say rather than proof that a responder you trust said it.
How to use
- Drop the .der file, or paste the response as base64, PEM or a hex dump from a packet capture. Everything is parsed in the page.
- Read the response status first. Anything other than successful is a complete, unsigned response that carries no certificate status at all.
- Check the certificate status table: good, revoked or unknown, with thisUpdate and nextUpdate beside it, and the revocation time and reason where there is one.
- Look at the freshness line and the reference instant next to it. A response past nextUpdate is one a compliant client would refuse.
- Paste the request you sent into the last box to confirm the responder echoed its nonce, and read the certificates section to see whether a delegated responder holds id-kp-OCSPSigning.
Frequently asked questions
- My response is only six bytes. Is it truncated?
- Almost certainly not. An OCSPResponse is a SEQUENCE whose first field is the status, and the response bytes that follow are present only when that status is successful. So malformedRequest, internalError, tryLater, sigRequired and unauthorized are complete responses in five or six bytes: no signature, no producedAt, no certificate mentioned. tryLater in particular is what a busy responder returns under load, and a client is meant to retry rather than treat it as a failed check. If you are storing responses for stapling, storing one of these is the bug — nothing downstream can learn anything from it.
- Why does the CertID still use SHA-1, and is that a weakness?
- Because it identifies rather than authenticates. A CertID is the hash of the issuer name, the hash of the issuer public key and the certificate serial number; it is a lookup key that lets the responder find the right entry, and the answer it returns is protected by the signature over the whole response, not by the hash. A collision attack would need two issuers with the same name hash and key hash and the same serial, which buys an attacker nothing they could not get more easily elsewhere. That is why RFC 6960 still names SHA-1 here while everything else has moved on. A SHA-1 signature on the response, on the other hand, is a real problem, and this decoder flags that separately.
- The response has no nextUpdate. When does it expire?
- It does not, formally. RFC 6960 says that when nextUpdate is absent, newer information is available at all times, and the response may be relied on until it is superseded. In practice clients apply their own ceiling, but many will accept such a response for as long as it parses, which is exactly the window a replay attack wants. That is what makes the nonce interesting: with one, a captured response cannot be reused for a later question, because the answer is bound to a value the client chose.
- The responder dropped my nonce. Is the response invalid?
- No, and this is the most common surprise when debugging. Big public CAs precompute responses in bulk and serve them from a CDN, which is incompatible with echoing a per-request nonce, so they simply omit it — RFC 8954 even allows a responder to ignore the extension. The response is still valid; what you lose is the proof that it was made for your request, and you fall back on thisUpdate and nextUpdate for freshness. Paste your request into this tool and it will tell you whether the nonce came back, was dropped, or came back different, which is the case that really does mean you are looking at the answer to someone else's question.
- What is the difference between unknown and a response that says nothing?
- unknown is a real answer: this responder has no record of that serial, usually because the certificate was issued by a different CA than the one the CertID names, or because it never existed. It is not the same as good, and a client should not treat it as such. It is also not the same as an unauthorized response, which says the responder will not answer for this certificate at all. And if the response carries the extended-revoke extension, the meaning narrows further: such a responder answers revoked, with a revocation time at the start of 1970, for certificates it never issued, so unknown from it means something closer to "not in my scope".
- Can this tool tell me which certificate the response is about, or verify the signature?
- Not the first, and it deliberately does not claim the second. The CertID is a set of hashes plus a serial, and hashes do not run backwards, so the only way to match a response to a certificate is to hash that certificate's issuer name and key and compare — you need the certificate in hand already. Signature verification needs the issuer public key, which this page does not have and does not fetch, so what you see is a faithful reading of the bytes rather than a trust decision. What it can settle from the bytes alone is who signed: hashing the key of each certificate carried in the response and comparing it with the CertID's issuerKeyHash distinguishes the issuing CA from a delegated responder.
Related tools
HTTP Status Code Reference
Searchable list of every HTTP status code (1xx-5xx) with summary, RFC, when to use, and common pitfalls.
CRL Decoder (X.509)
Read a certificate revocation list in your browser: issuer, CRL number, validity window, every revoked serial with its reason, and the signature.
CSR Decoder (PKCS#10)
Read a certificate signing request before you send it: subject, SANs, key size, signature algorithm, and whether its self-signature verifies.
ASN.1 / DER Decoder
Paste any DER structure — PEM, base64 or hex — and see its ASN.1 tree: offsets, tags, lengths and decoded values.
CAA Record Builder (DNS Certificate Authority Authorization)
Generate Certificate Authority Authorization (CAA) DNS records so only the CAs you trust can issue TLS certificates for your domain.
PKCS#12 Keystore Inspector
Open a .p12 or .pfx in your browser: MAC and ciphers before the password, then the certificate chain, the private key, and whether they match.