Пример проверки цепочки сертификатов при получении криптографического сообщения

VBScript Copy Code
    ' получаем объект CAPICOM.Certificate
    Dim oCert: Set oCert = GetCapicomCertificate()
    
    ' Строим цепочку
    Dim oChain: Set oChain = CreateObject("CAPICOM.Chain")
    oChain.Build(oCert)
    
    Dim PKIValidator: Set PKIValidator = _
        CreateObject("PKIValidator.PrivateKeyUsageValidator")
        
    ' Сначала проверяем цепочку   
    Dim isChainValidByPKUP: isChainValidByPKUP = _
        PKIValidator.IsChainValid(oChain)
        
    ' Прекращаем проверку если в цепочке один сертификатов 
    ' был использован для подписи по истечении или до наступления 
    ' срока действия закрытого ключа
    If Not isChainValidByPKUP Then _
        DoSmthIfError()
    
    ' Указываем время проверки
    Dim DateTimeValue: DateTimeValue = "14/10/2007 02:42:01 PM"

    ' Проверяем конечный сертификат на необходимый момент времени.
    ' Данная проверка не выполняет
    ' проверку статуса сертификата на отзыв.     
    Dim isCertValidOnTimeByPKUP: isCertValidOnTimeByPKUP = _
        PKIValidator.IsCertValidOnTime(oCert, DateTimeValue)

    ' Закрытый ключ сертификата не может использоваться 
    ' для подписи или шифрования. Его срок действия либо уже истек, 
    ' либо еще не наступил.
    If Not isCertValidOnTimeByPKUP Then _
        DoSmthIfError()

    ' конец примера

C# Copy Code
        // Получаем сертфикат
        CAPICOM.CertificateClass certCapicom = GetCapicomCertificate();

        // Получаем сертификат X509Certificate2
        System.Security.Cryptography.X509Certificates.X509Certificate2 certX509 =
                GetX509Certificate();

        // Строим цепочку
        CAPICOM.ChainClass chainCapicom = new CAPICOM.ChainClass();
        chain.Build(cert);


        // Получаем цепочку X509Chain
        System.Security.Cryptography.X509Certificates.X509Chain chainX509 =
                GetX509Chain();

        // Создаем объект 
        PKIValidatorLib.PrivateKeyUsageValidatorClass validator =
                new PKIValidatorLib.PrivateKeyUsageValidatorClass();

        bool isChainValidByPKUP;
        try
        {
                // Проверяем цепочку, передавая CAPICOM.Chain
                isChainValidByPKUP = validator.IsChainValid(chainCapicom);
                // Можно воспользоваться X509Chain, при этом будет передаваться PCCERT_CHAIN_CONTEXT
                // Обязательно надо преобразовать IntPtr с помощью метода IntPtr.ToInt64(), иначе
                // 64-битный указатель будет передан неправильно!
                isChainValidByPKUP = validator.IsChainValid(chainX509.ChainContext.ToInt64());
        }
        catch (Exception ex)
        {
                // Invalid Parameter
                DoSmthIfError("Invalid parameter" + ex.Message);
                return;
        }
        // Прекращаем проверку если в цепочке один сертификатов 
        // был использован для подписи по истечении или до наступления 
        // срока действия закрытого ключа
        if (!isChainValidByPKUP)
                DoSmthIfError("Chain is not valid");

        // Проверяем конечный сертификат на необходимый момент времени,
        // или в данный, если необходимо проверить можно ли использовать
        // закрытый ключ в данный момент времени. Данная проверка не выполняет
        // проверку статуса сертификата на отзыв.     
        bool isCertValidOnTimeByPKUP;

        // Получаем момент времени, на который 
        // необходимо осуществить проверку
        DateTime time = GetVerifyingTime();

        // Закрытый ключ сертификата не может использоваться 
        // для подписи или шифрования. Его срок действия либо уже истек, 
        // либо еще не наступил.
        try
        {
                // Проверяем на заданное время, передавая CAPICOM.Certificate
                isCertValidNowByPKUP = validator.IsCertValidOnTime(certCapicom, time);
                // Можно воспользоваться X509Certificate2, при этом будет передаваться PCCERT_CONTEXT
                // Обязательно надо преобразовать IntPtr с помощью метода IntPtr.ToInt64(), иначе
                // 64-битный указатель будет передан неправильно!
                isCertValidNowByPKUP = validator.IsCertValidOnTime(certX509.Handle.ToInt64(), time);
        }
        catch (Exception ex)
        {
                DoSmthIfError("Invalid Parameter" + ex.Message);
                return;
        }

        if (!isCertValidNowByPKUP)
                DoSmthIfError("Not valid now");

        return ;