2014-10-06 131 views
2

我正在尝试使用OpenSSL C API编写CertificatePathValidation测试。 我目前停留在测试撤销中间(ca-)证书。有两种测试用例:1. EndCert被吊销,并且2. SubCACert被吊销。我的代码的一部分:OpenSSL C API CRL检查

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失败(返回证书是有效的)。如果我使用X509_V_FLAG_CRL_CHECK_ALL标志,则情况1和2都会失败。 有谁知道我错过了什么?

回答

4

的这个设置的行为是略有不同的文档建议:

  • 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,文件加密/ 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; 

正如你可以看到它会跳过行672673全吊销检查,如果没有设置X509_V_FLAG_CRL_CHECK。