2012-03-12 78 views
0

我正在開發一個使用帶有SSL支持的gSOAP的web服務。只要我COPY(就是這樣!)作爲gSOAP文檔提供的代碼,它就可以正常工作。試圖添加一些功能,我碰到了很多困難!我對OpenSSL庫沒有很好的瞭解,所以我想在這裏尋求幫助。 我應該添加一個CRL列表來檢查客戶端發送的證書。我該怎麼做?而且,我改變了soap.fsslverify指出的這個功能:gSoap + SSL:CRL和證書名稱檢查

int servlet_fsslverify(int ok, X509_STORE_CTX *store) 
{ 
    ok = 1; 
    char buf[1024]; 
    X509 *cert = X509_STORE_CTX_get_current_cert(store); 
    fprintf(stderr, "SSL verify error or warning with certificate at depth %d: %s\n", 
     X509_STORE_CTX_get_error_depth(store), 
     X509_verify_cert_error_string(X509_STORE_CTX_get_error(store))); 
    X509_NAME_oneline(X509_get_issuer_name(cert), buf, sizeof(buf)); 
    fprintf(stderr, "certificate issuer %s\n", buf); 
    X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf)); 
    fprintf(stderr, "certificate subject %s\n", buf); 
    /* Note: return 1 to continue, but unsafe progress will be terminated by OpenSSL */ 
    return ok; 
} 

每次客戶端嘗試進行身份驗證時都會調用它。正如你所看到的,我可以檢查客戶證書中的字段,但我真的不知道如何檢查特定證書是否存在或不在CRL中。 就是這樣,非常感謝每個人都會很高興回答。

回答

0

我在網上找到了解決方案!對不起,我不記得在哪裏,但我會盡力找回它,然後我將編輯這個帖子 - 給求解器。 在服務器上下文創建後立即插入代碼。

X509_STORE *store; 
store = SSL_CTX_get_cert_store(ServicePtr->ctx); 
if (store) 
{ 
    X509_LOOKUP *lookup; 
    X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK); 
    lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); 
    if (lookup) 
    { 
     if (X509_load_crl_file(lookup, globals.pki_crl, X509_FILETYPE_ASN1) < 1) 
     { 
      std::cerr << "CRL not found or invalid" << std::endl; 
     } 
    } 
    else 
    { 
     std::cerr << "Unable to create a valid lookup" << std::endl; 
    } 
} 
else 
{ 
    std::cerr << "Unable to get X509_STORE" << std::endl; 
}