2014-10-06 76 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。