I seriously need help with this piece. I searched the forum and I could
not find what i was looking for.
During an SSL handshake, I need to be able to examine the CRL
distribution points on a certificate (chain), download them, and pass
them along to OpenSSL for further revocation checks.
I thought I understood that the problem would be solved by just
overwriting "get_crl" method of X509_STORE. But it looks like there's a
lot more going to that just to read a URL and download the target.
Here's what I did and after all it didn't work. Because I got the error
"Different CRL scope" after return from my "get_crl"

**** set up X509_STORE just before SSL connection:
// do trusted certs
if (crlDownloader) {
  x509Store->get_crl = &getCrl;
  CRYPTO_set_ex_data(&x509Store->ex_data,
      CRL_GET_EXDATA_INDEX, (void *)crlDownloader);
  X509_STORE_set_flags(x509Store,
      X509_V_FLAG_CRL_CHECK |  X509_V_FLAG_CRL_CHECK_ALL);
}
SSL_CTX_set_cert_store(ctx, x509Store);


**** My get_crl:
int getCrl(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *cert)
{
  CrlDownloader *crlDownloader = (CrlDownloader*)CRYPTO_get_ex_data(
            &ctx->ctx->ex_data,
            CRL_GET_EXDATA_INDEX);
  try
  {
    // read the distribution points from the certificate (see below)
    for(/* each url in distribution URLs */)
    {
      X509_CRL* downloadedCrl = crlDownloader->download(url);
      *crl = downloadedCrl;
      X509_STORE_add_crl(ctx->ctx, *crl));
      break;
    }
    return 1;
  }
  catch(std::exception &e)
  {
    // print error
  }
  return 0;
}

***** util code to return a distribution URl minimally
for (i = 0; i < sk_DIST_POINT_num(cert->crldp); i++)
{
  DIST_POINT *dp = sk_DIST_POINT_value(cert->crldp, i);
  for (i = 0; i < sk_GENERAL_NAME_num(dp->distpoint->name.fullname); i++)
  {
    GENERAL_NAME *gen = sk_GENERAL_NAME_value(
        dp->distpoint->name.fullname, i);
    if (gen->type == GEN_URI)
    {
      list.push_back(std::string((char*)gen->d.ia5->data));
    }
  }
}

Note that if I modify my code, download the CRL at the beginning, add it
to X509_STORE and continue, then everything works as expected. But
that's not acceptable because I would have to know apriori what those
CRL distribution points would be.

So as i mentioned the above still does not work.
Looking at get_crl_delta() shows that there's a lot more logic involved
than just downloading the CRL. Unfortunately, most if not all of the
methods called inside that module are static so they're not available to
my get_crl.

I'd appreciate your feedback and guidance.
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to