OpenSSL C API CRL检查

时间:2014-10-06 14:31:32

标签: c api ssl openssl certificate

我正在尝试使用OpenSSL C API编写CertificatePathValidation测试。 我目前正在测试已撤销的中间(ca-)证书。有两个测试用例:1。EndCert被撤销,2。SubCACert被撤销。我的代码部分:

FILE* fl = NULL;
int i;
for(i=0; i<crl_count; i++){
  fl = fopen(pem_crl_files[i],"r");
  x509 = PEM_read_X509_CRL(fl, NULL,0,NULL);
  X509_STORE_add_crl(store, x509);
  fclose(fl); 
}
X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK);

所以现在当我使用X509_V_FLAG_CRL_CHECK标志时,测试用例1工作正常,测试用例2失败(返回cert有效)。如果我使用X509_V_FLAG_CRL_CHECK_ALL标志,则情况1和2都会失败。 有谁知道我错过了什么?

1 个答案:

答案 0 :(得分:5)

此设置的行为与文档建议略有不同:

  • X509_V_FLAG_CRL_CHECK启用CRL检查。如果关闭此选项,则不会进行检查。
  • 如果X509_V_FLAG_CRL_CHECK_ALL 设置,将检查整个链,否则只检查叶证书。

这意味着您需要同时设置X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL

OpenSSL 1.0.1e的相关代码,文件crypto / x509 / x509_vfy.c:

669 static int check_revocation(X509_STORE_CTX *ctx)
670         {
671         int i, last, ok;
672         if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
673                 return 1;
674         if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
675                 last = sk_X509_num(ctx->chain) - 1;

正如您所看到的,如果未设置X509_V_FLAG_CRL_CHECK,它将跳过第672,673行中的整个撤销检查。