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