gSoap + SSL: CRL и проверка названия сертификата - PullRequest
0 голосов
/ 12 марта 2012

Я разрабатываю веб-сервис, используя gSOAP с поддержкой SSL.Он работает нормально, пока я КОПИРУЮ (и все!) Код, предоставленный в виде документации gSOAP.Пытаясь добавить какую-то особенность, я сталкиваюсь с множеством трудностей!Я не очень хорошо разбираюсь в библиотеках OpenSSL, поэтому я здесь, чтобы попросить вас о помощи.Я должен добавить список CRL, чтобы проверить сертификат, отправленный клиентом.Как мне это сделать?Более того, я изменил функцию, указанную soap.fsslverify, следующим образом:

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 или нет.Вот и все, большое спасибо всем, было бы так приятно ответить.

1 Ответ

0 голосов
/ 13 марта 2012

Я нашел решение в интернете! Извините, я не помню где, но я постараюсь найти его обратно и отредактирую этот пост - кредиты для решателя. Код для вставки сразу после создания контекста сервера.

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;
}
...