Статус: Новичок
Группы: Участники
Зарегистрирован: 15.09.2017(UTC) Сообщений: 3 Откуда: Москва Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день Задача - подписывать документы в браузере, затем проверять подпись (вероятно, на сервере) С подписанием в браузере разобрался. На выходе имею .sig файл, в котором вся информация о подписи + сам файл. Насколько я понял, необходимо вытащить сертификат из подписи, затем выстроить цепочку и проверить каждый элемент цепочки. Нашёл пример, проверяющий сертификат - но он проверяет сертификат, используя хранилище моего компьютера. Насколько я понимаю, для правильности проверки необходимо узнать, выдавался ли этот сертификат корневым удостоверяющим центром, отсутствует ли он в списке отозванных сертификатов. Вопрос: Правильно ли я понимаю, как организовывается проверка сертификата? Как-то можно проверять сертификат, связываясь с центрами сертификации онлайн? Вот код, который проверяет сертификат, используя локальное хранилище. В нём явно задано, что используется хранилище текущего пользователя: Код:// Открываем хранилище MY текущего пользователя.
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
// Выдаем окно выбора сертификата из коллекции сертификатов
// хранилища.
X509Certificate2Collection fcollection =
(X509Certificate2Collection)store.Certificates;
X509Certificate2Collection collection =
X509Certificate2UI.SelectFromCollection(fcollection,
"Выберите сертификат",
"Выберите сертификат для построения цепочки.",
X509SelectionFlag.SingleSelection);
X509Certificate2 certificate = collection[0];
// Строим цепочку.
X509Chain ch = new X509Chain();
ch.Build(certificate);
// Выводим информацию о цепочке.
Console.WriteLine("Цепочка");
ch.ChainPolicy.RevocationMode = X509RevocationMode.Online;
Console.WriteLine("Флаг проверки цепочки на отзыва: {0}",
ch.ChainPolicy.RevocationFlag);
Console.WriteLine("Режим проверки цепочки на отзыв: {0}",
ch.ChainPolicy.RevocationMode);
Console.WriteLine("Условия проверки цепочки: {0}",
ch.ChainPolicy.VerificationFlags);
Console.WriteLine("Время проверки цепочки: {0}",
ch.ChainPolicy.VerificationTime);
Console.WriteLine("Длина цепочки состояний: {0}",
ch.ChainStatus.Length);
Console.WriteLine("Длина массива задающих политику применения "
+ "и расширенныя использования ключа: {0}",
ch.ChainPolicy.ApplicationPolicy.Count);
Console.WriteLine("Длина массива политик, поддерживаемых "
+ "сертификатом: {0} {1}",
ch.ChainPolicy.CertificatePolicy.Count, Environment.NewLine);
// Выводим инормацию об элементах цепочки.
Console.WriteLine("Элементы цепочки");
Console.WriteLine("Количество элементов в цепочке: {0}",
ch.ChainElements.Count);
Console.WriteLine("Статус синхронизации (потокобезопасности) "
+ "цепочки: {0} {1}",
ch.ChainElements.IsSynchronized, Environment.NewLine);
foreach (X509ChainElement element in ch.ChainElements)
{
Console.WriteLine("Имя издателя: {0}",
element.Certificate.Issuer);
Console.WriteLine("Сертификат действителен до: {0}",
element.Certificate.NotAfter);
Console.WriteLine("Сертификат действителен: {0}",
element.Certificate.Verify());
Console.WriteLine("Длина цепочки состояний сертификата: {0}",
element.ChainElementStatus.Length);
Console.WriteLine("Информация: {0}", element.Information);
Console.WriteLine("Количество расширений сертификата: {0}{1}",
element.Certificate.Extensions.Count, Environment.NewLine);
if (ch.ChainStatus.Length > 1)
{
for (int index = 0; index < element.ChainElementStatus.Length; index++)
{
Console.WriteLine(element.ChainElementStatus[index].Status);
Console.WriteLine(element.ChainElementStatus[index].StatusInformation);
}
}
}
store.Close();
|