Custom rustls Verifier with Revocation (Stretch)
use rustls::client::ServerCertVerifier;
struct RevocationCheckingVerifier {
inner: Arc<dyn ServerCertVerifier>,
crl_der: Vec<u8>,
issuer_cert: Vec<u8>,
}
impl ServerCertVerifier for RevocationCheckingVerifier {
fn verify_server_cert(&self, end_entity, intermediates, ..) -> Result<..> {
self.inner.verify_server_cert(end_entity, intermediates, ..)?;
let cert = X509Certificate::from_der(end_entity)?;
let issuer = X509Certificate::from_der(&self.issuer_cert)?;
match check_crl_revocation(&cert, &issuer, &self.crl_der, now())? {
RevocationStatus::Revoked { .. } => Err(rustls::Error::General(...)),
_ => Ok(...)
}
}
}