Пример проверки цепочки сертификатов при получении криптографического сообщения
VBScript
' получаем объект 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#
// Получаем сертфикат 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 ;