JWK-Validator: Reject von OCSP-Responses mit ungültiger Nonce
Zusammenfassung
Die Prüfung des Timestamp in der Methode checkCertStatusForLocations
greift nicht nur, wenn in der Response keine Nonce enthalten ist, sondern fälschlicherweise auch, wenn eine Nonce in der Response enthalten ist, die von der Nonce im Request abweicht. Gemäß RFC5019, Kapitel 7.1 müssen ungültige Nonces jedoch ohne Prüfung des Timestamp zu einem Abbruch der OCSP-Prüfung führen: „If a client can determine that the server supports nonces, it MUST reject a reply that does not contain an expected nonce“. In diesem Fall ist von einer manipulierten Nonce auszugehen.
Weitere Informationen
Clients MUST check for the existence of the nextUpdate field and MUST ensure the current time, expressed in GMT time as described in Section 2.2.4, falls between the thisUpdate and nextUpdate times. If the nextUpdate field is absent, the client MUST reject the response.
clients that opt to include a nonce in the request SHOULD NOT reject a corresponding OCSPResponse solely on the basis of the nonexistent expected nonce, but MUST fall back to validating the OCSPResponse based on time
Wie verhält sich der aktuelle Fehler?
- Bei vorhandener, aber ungültiger Nonce wird mit einer Prüfung des Timestamp fortgefahren.
Was ist das erwartete richtige Verhalten?
-
Gemäß RFC5019, Kapitel 7.1 führt eine vorhandene, ungültige Nonces direkt zu einem Abbruch der OCSP-Prüfung (ohne Prüfung des Timestamp). -
Timestamp wird überprüft unabhängig von Vorhandensein einer Nonce-Extension
Relevante Protokolle/Screenshots/Anfragen
if (!responseNonceValid(ocspReq, basicResponse, leafCert, serviceURL)) {
/* https://tools.ietf.org/html/rfc5019
Clients that opt to include a nonce in the request SHOULD NOT reject a corresponding OCSPResponse solely on the
basis of the nonexistent expected nonce, but MUST fall back to validating the OCSPResponse based on time. */
if (!responseTimestampValid(basicResponse, leafCert, serviceURL)) {
continue;
}
}
private boolean responseNonceValid(OCSPReq ocspReq, BasicOCSPResp basicResponse, X509Certificate leafCert, String serviceURL) {
[...]
if (!reqNonce.equals(respNonce)) {
log.debug("Request nonce and response nonce are not equal for leaf cert {} and url {}",
leafCert.getSerialNumber(), serviceURL);
return false;
}
return true;
}