Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline RMad  
#1 Оставлено : 1 апреля 2010 г. 3:02:35(UTC)
RMad

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.10.2008(UTC)
Сообщений: 9

Добрый день.
Есть необходимость проверить действительность сертификата по CRL. Как я понял для начала надо проверить сам CRL, т.е. его ЭЦП. Вопрос как лучше это сделать?
я использую следующий алгоритм: получаю подпись в структуре PCERT_SIGNED_CONTENT_INFO, потом пытаюсь получить открытый ключ - PCERT_PUBLIC_KEY_INFO, и затем вызвать функцию CryptVerifyCertificateSignature для собственно самой проверки. Проблема в том что не удается получить структуру содержащую открытый ключ - PCERT_PUBLIC_KEY_INFO, ниже приведен используемый код.

Код:

    // Get CRL PCERT_SIGNED_CONTENT_INFO
    BYTE* pbDecSign;
    DWORD cbDecSign;
    if (!CryptDecodeObject(
        pCRLContext->dwCertEncodingType,
        X509_CERT,
        pCRLContext->pbCrlEncoded,
        pCRLContext->cbCrlEncoded,
        NULL,
        NULL,
        &cbDecSign))
    {
        return FALSE;
    }
    // Allocated the needed buffer
    pbDecSign = (BYTE*)malloc(cbDecSign);
    if (!pbDecSign)
    {
        return FALSE;
    }
    // Call again to
    if (!CryptDecodeObject(
        pCRLContext->dwCertEncodingType,
        X509_CERT,
        pCRLContext->pbCrlEncoded,
        pCRLContext->cbCrlEncoded,
        NULL,
        pbDecSign,
        &cbDecSign))
    {
        return FALSE;
    }
    PCERT_SIGNED_CONTENT_INFO pCRLSignInfo;
    pCRLSignInfo = (PCERT_SIGNED_CONTENT_INFO) pbDecSign;

    // Get CRL CERT_PUBLIC_KEY_INFO
    BYTE* pbPublicKey;
    DWORD cbPublicKey;
    if (!CryptDecodeObject(
        pCRLContext->dwCertEncodingType,
        X509_PUBLIC_KEY_INFO,
        pCRLContext->pbCrlEncoded,
        pCRLContext->cbCrlEncoded,
        NULL,
        NULL,
        &cbPublicKey))
    {
        DWORD dw = GetLastError();   // функция попадает сюда, и происходит выход. dw = 2148086027.
        dw = 0;
        return FALSE;
    }
    // Allocated the needed buffer
    pbPublicKey = (BYTE*)malloc(cbPublicKey);
    if (!pbDecSign)
    {
        return FALSE;
    }
    // Call again to
    if (!CryptDecodeObject(
        pCRLContext->dwCertEncodingType,
        X509_PUBLIC_KEY_INFO,
        pCRLContext->pbCrlEncoded,
        pCRLContext->cbCrlEncoded,
        NULL,
        pbPublicKey,
        &cbPublicKey))
    {
        return FALSE;
    }
    PCERT_PUBLIC_KEY_INFO pCRLPublicKeyInfo;
    pCRLPublicKeyInfo = (PCERT_PUBLIC_KEY_INFO) pbPublicKey;

    // Verificate CRL signature
    BOOL Result;
    Result = CryptVerifyCertificateSignature(
        NULL,
        pCRLContext->dwCertEncodingType,
        pCRLSignInfo->Signature.pbData,
        pCRLSignInfo->Signature.cbData,
        pCRLPublicKeyInfo);


(?) и еще правильно ли то что первый параметр CryptVerifyCertificateSignature имеет значение NULL, в MSDN написано следующее:
"This parameter is not used and should be set to NULL.
Windows Server 2003, Windows XP, and Windows 2000: A handle to the cryptographic service provider (CSP) used to verify the signature.
This parameter's data type is HCRYPTPROV.
NULL is passed unless there is a strong reason for passing in a specific cryptographic provider. Passing in NULL causes the default RSA or DSS provider to be acquired."
а мое приложение может быть использовано как в Vista, так и в windows xр, получается что для висты можно оставить NULL, но для того чтобы приложение работало и в хр необходимо, получить контекст выбранного криптопровайдера(Крипто ПРО) и передавать его в функцию?
Offline Kirill Sobolev  
#2 Оставлено : 1 апреля 2010 г. 15:16:40(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Открытый ключ можно получить только оттуда, где он есть - например, в сертификате издателя CRL. В самом CRL его нет.
Цитата:
но для того чтобы приложение работало и в хр необходимо, получить контекст выбранного криптопровайдера(Крипто ПРО) и передавать его в функцию?

Наоборот - надо передавать NULL, только если нет каких-то весомых причин передавать что-то другое. Это верно и для ХР, и для висты.
Техническую поддержку оказываем тут
Наша база знаний
Offline RMad  
#3 Оставлено : 1 апреля 2010 г. 17:22:10(UTC)
RMad

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.10.2008(UTC)
Сообщений: 9

Спасибо за ответы.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.