Ir para o conteúdo
AZ Tools

Descodificador de OCSP (resposta e pedido)

Lê uma mensagem OCSP — RFC 6960 — a partir de um ficheiro DER, base64, PEM ou de uma captura em hexadecimal, e mostra o que um cliente faria com ela. Numa resposta o primeiro campo é o OCSPResponseStatus, porque só successful traz dados: um tryLater de seis bytes é uma resposta completa e válida que nada diz sobre qualquer certificado, e lê-lo como ficheiro truncado é um falso alarme frequente. Seguem-se o ID do respondedor e a forma que toma, por nome ou pelo SHA-1 da sua chave; o producedAt; e, para cada resposta individual, o CertID, o estado good, revoked ou unknown, o thisUpdate, o nextUpdate e, se estiver revogado, a data de revogação e o CRLReason. As extensões que valem a pena são descodificadas em vez de listadas como OID: o nonce no pedido e na resposta, o corte de arquivo, a referência a CRL e a extended-revoke, que muda o sentido de unknown, porque um respondedor que a ativa devolve revoked para certificados que nunca emitiu. A página responde ainda às perguntas que levam alguém a abrir um descodificador. Esta resposta ainda está em vigor? O thisUpdate e o nextUpdate são comparados com um instante de referência que fica à vista, e uma resposta sem nextUpdate é assinalada como válida até ser substituída, em vez de ser dada como atual sem mais. O respondedor devolveu o meu nonce? Cole o pedido que enviou e os dois são comparados, porque um nonce descartado é a surpresa mais comum ao depurar o stapling. A assinatura é da própria AC ou de um respondedor delegado? A chave pública de cada certificado incluído é resumida e comparada com o issuerKeyHash do CertID, e um respondedor delegado sem id-kp-OCSPSigning é assinalado, porque os clientes têm de o rejeitar. Dois limites merecem ser ditos com clareza. Um CertID identifica um certificado por hashes do nome e da chave do emissor mais um número de série, pelo que não pode ser convertido de volta num nome de sujeito. E aqui nenhuma assinatura é verificada: isso exige a chave pública do emissor, que esta página não tem, portanto o que vê é uma leitura fiel dos bytes e não uma decisão de confiança.

Como usar

  1. Solte o ficheiro .der ou cole a resposta em base64, PEM ou como despejo hexadecimal de uma captura. Tudo é analisado na página.
  2. Veja primeiro o estado da resposta. Qualquer valor diferente de successful é uma resposta completa e sem assinatura que não informa sobre nenhum certificado.
  3. Percorra a tabela de estado: good, revoked ou unknown, com o thisUpdate e o nextUpdate ao lado, e a data e o motivo da revogação quando existem.
  4. Repare na linha de validade e no instante de referência ao lado. Uma resposta passada do nextUpdate é aquela que um cliente conforme recusaria.
  5. Cole na última caixa o pedido que enviou para confirmar o eco do nonce e veja na secção de certificados se o respondedor delegado tem id-kp-OCSPSigning.

Perguntas frequentes

A minha resposta tem apenas seis bytes. Está truncada?
Quase de certeza que não. Uma OCSPResponse é uma SEQUENCE cujo primeiro campo é o estado, e os bytes de resposta que se seguem só existem quando esse estado é successful. Por isso malformedRequest, internalError, tryLater, sigRequired e unauthorized são respostas completas em cinco ou seis bytes: sem assinatura, sem producedAt e sem mencionar qualquer certificado. O tryLater em particular é o que um respondedor sobrecarregado devolve, e o cliente deve tentar de novo em vez de o tratar como falha. Se guarda respostas para stapling, guardar uma destas é o próprio erro.
Porque é que o CertID ainda usa SHA-1? Isso é uma fraqueza?
Porque identifica em vez de autenticar. Um CertID é o hash do nome do emissor, o hash da sua chave pública e o número de série do certificado: uma chave de pesquisa para o respondedor encontrar a entrada certa. O que protege a resposta é a assinatura sobre o conjunto, não esse hash. Um ataque de colisão exigiria dois emissores com o mesmo hash de nome, o mesmo hash de chave e o mesmo número de série, e não daria ao atacante nada que não obtivesse mais facilmente por outra via. É por isso que a RFC 6960 mantém aqui o SHA-1. Já uma assinatura SHA-1 sobre a resposta é um problema a sério, e este descodificador assinala-o à parte.
A resposta não tem nextUpdate. Quando é que expira?
Formalmente, nunca. A RFC 6960 diz que, na ausência de nextUpdate, há informação mais recente disponível a todo o momento e a resposta pode ser usada até ser substituída. Na prática cada cliente aplica um limite próprio, mas muitos aceitam-na enquanto ela se deixar analisar, que é exatamente a janela procurada por um ataque de repetição. É esse o interesse do nonce: com ele, uma resposta capturada não serve para uma pergunta posterior, porque fica ligada a um valor escolhido pelo cliente.
O respondedor descartou o meu nonce. A resposta é inválida?
Não, e esta é a surpresa mais comum ao depurar. As grandes AC públicas pré-calculam respostas em lote e servem-nas a partir de um CDN, o que é incompatível com devolver um nonce diferente por pedido, e por isso simplesmente omitem-no; a RFC 8954 até permite que um respondedor ignore a extensão. A resposta continua válida: o que se perde é a prova de que foi feita para o seu pedido, e a validade passa a depender do thisUpdate e do nextUpdate. Cole o seu pedido nesta ferramenta e ela dirá se o nonce voltou, foi descartado ou voltou diferente, que é o caso que realmente significa estar a olhar para a resposta à pergunta de outra pessoa.
Qual é a diferença entre unknown e uma resposta que nada diz?
unknown é uma resposta a sério: este respondedor não tem registo desse número de série, quase sempre porque o certificado foi emitido por uma AC diferente da que o CertID nomeia, ou porque nunca existiu. Não é o mesmo que good e um cliente não o deve tratar como tal. Também não é o mesmo que unauthorized, que diz que o respondedor não vai responder por aquele certificado. E se a resposta trouxer a extensão extended-revoke o sentido estreita-se: um respondedor desses devolve revoked, com data no início de 1970, para certificados que nunca emitiu, pelo que o seu unknown se aproxima de «fora do meu âmbito».
Esta ferramenta diz-me de que certificado fala a resposta, ou verifica a assinatura?
A primeira coisa não, e a segunda não a promete. O CertID é um conjunto de hashes mais um número de série, e os hashes não se percorrem ao contrário, pelo que a única forma de ligar uma resposta a um certificado é calcular o hash do nome e da chave do emissor desse certificado e comparar — ou seja, é preciso já ter o certificado. Verificar a assinatura exige a chave pública do emissor, que esta página não tem nem procura, por isso o que aparece é uma leitura fiel dos bytes e não uma decisão de confiança. O que os bytes já resolvem é quem assinou: comparar o hash da chave de cada certificado incluído com o issuerKeyHash do CertID distingue a AC emissora de um respondedor delegado.

Ferramentas relacionadas