Le protocole
Normalement, le destinataire d'un
La requête OCSP contient (un survol du protocole figure en section
2 de ce RFC) le numéro de série du certificat qu'on veut authentifier. La réponse dépend
de si le répondeur (le serveur OCSP) a l'information sur ce
certificat. Si oui, il répond positivement (
Les réponses possibles sont donc
Le répondeur peut aussi être dans l'incapacité de fournir une
réponse et, dans ce cas, le message d'erreur résultant n'est pas
signé. Parmi les causes possibles d'erreur, une requête incorrecte,
une erreur dans le répondeur (équivalent du
La réponse inclut souvent des temps : dernier moment où l'information retournée était correcte, moment de la prochaine mise à jour de l'information, moment de la signature de l'information (les réponses peuvent être pré-produites) ou moment où la révocation a eu lieu.
Mais comment un destinataire de certificat sait-il
où trouver le serveur OCSP ? Il est typiquement indiqué dans le
certificat qu'on teste, dans l'extension
% openssl x509 -text -in /tmp/site.pem
...
Authority Information Access:
OCSP - URI:http://rapidssl-ocsp.geotrust.com
CA Issuers - URI:http://rapidssl-aia.geotrust.com/rapidssl.crt
Mais cette information peut aussi être codée en
dur dans le client.
La plupart du temps, l'URL en question sera un URL
Voilà, vous savez l'essentiel, la section 4 décrit tout le
protocole, en
OCSPRequest ::= SEQUENCE {
tbsRequest TBSRequest,
optionalSignature [0] EXPLICIT Signature OPTIONAL }
TBSRequest ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
requestorName [1] EXPLICIT GeneralName OPTIONAL,
requestList SEQUENCE OF Request,
requestExtensions [2] EXPLICIT Extensions OPTIONAL }
...
Request ::= SEQUENCE {
reqCert CertID,
singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
CertID ::= SEQUENCE {
hashAlgorithm AlgorithmIdentifier,
issuerNameHash OCTET STRING, -- Hash of Issuer's DN
issuerKeyHash OCTET STRING, -- Hash of Issuers public key
serialNumber CertificateSerialNumber }
Et la réponse est un code de retour et la réponse elle-même :
OCSPResponse ::= SEQUENCE {
responseStatus OCSPResponseStatus,
responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }
OCSPResponseStatus ::= ENUMERATED {
successful (0), --Response has valid confirmations
malformedRequest (1), --Illegal confirmation request
internalError (2), --Internal error in issuer
tryLater (3), --Try again later
--(4) is not used
sigRequired (5), --Must sign the request
unauthorized (6) --Request unauthorized
}
ResponseBytes ::= SEQUENCE {
responseType OBJECT IDENTIFIER,
response OCTET STRING }
Avec
SingleResponse ::= SEQUENCE {
certID CertID,
certStatus CertStatus,
thisUpdate GeneralizedTime,
nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
singleExtensions [1] EXPLICIT Extensions OPTIONAL }
CertStatus ::= CHOICE {
good [0] IMPLICIT NULL,
revoked [1] IMPLICIT RevokedInfo,
unknown [2] IMPLICIT UnknownInfo }
RevokedInfo ::= SEQUENCE {
revocationTime GeneralizedTime,
revocationReason [0] EXPLICIT CRLReason OPTIONAL }
On note que la raison de la révocation est indiquée. Elle n'est pas
toujours indiquée par le répondeur OCSP (cela peut être une
information sensible). La présence de cette information dans
les CRL a permis à
l'
La section 5 revient sur l'analyse de sécurité d'OCSP. On notera
que les problèmes de
Un autre problème de sécurité n'est pas mentionné : que doit faire
le navigateur Web qui tente d'authentifier un certificat lorsque la
requête OCSP n'aboutit pas (peut-être parce qu'un
Les changements depuis le
Merci à Erwann Abalea pour sa relecture précise.