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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline d.dolbilov  
#1 Оставлено : 15 сентября 2017 г. 18:00:45(UTC)
d.dolbilov

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

Группы: Участники
Зарегистрирован: 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();
Offline Андрей Писарев  
#2 Оставлено : 15 сентября 2017 г. 22:18:42(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,342
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Здравствуйте.

Скачайте SDK, там есть примеры.

Цитата:
Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\CMS\cs\Verify.cs
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
d.dolbilov оставлено 18.09.2017(UTC)
Offline d.dolbilov  
#3 Оставлено : 18 сентября 2017 г. 11:05:46(UTC)
d.dolbilov

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

Группы: Участники
Зарегистрирован: 15.09.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: Андрей * Перейти к цитате
Скачайте SDK, там есть примеры.

Цитата:
Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\CMS\cs\Verify.cs


Здравствуйте, спасибо за ответ!
Примеры очень помогли, но есть ещё один вопрос
Подписываю через криптоАРМ, если при подписании выбираю "DER-кодировка", в последствии код проверки выполняется успешно. Если же выбрать BASE-64 кодировка, то на этом шаге:
Код:
// Декодируем сообщение.
signedCms.Decode(encodedSignedCms);

Возникает исключение:
System.Security.Cryptography.CryptographicException: "Встречено неверное значение тега ASN1
Не подскажете, в чём может быть проблема?

Пример файла, подписанного с галочкой Base-64:
fileToSign.txt.sig (3kb) загружен 5 раз(а).

Отредактировано пользователем 18 сентября 2017 г. 11:07:50(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#4 Оставлено : 18 сентября 2017 г. 11:28:35(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,342
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Цитата:
signedCms.Decode


Ждет ASN.1 (DER), а не BASE64.

Т.е. необходимо декодировать данные из BASE64 предварительно.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
d.dolbilov оставлено 18.09.2017(UTC)
Offline d.dolbilov  
#5 Оставлено : 18 сентября 2017 г. 14:34:44(UTC)
d.dolbilov

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

Группы: Участники
Зарегистрирован: 15.09.2017(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: Андрей * Перейти к цитате
Т.е. необходимо декодировать данные из BASE64 предварительно.


Спасибо, вроде всё получилось!

Для тех, кто столкнётся с такой же проблемой, вот мой код:
Код:

string text = File.ReadAllText(filename);
text = text.Substring(text.IndexOf('\n'), (text.Substring(0, text.LastIndexOf('\n') - 1).LastIndexOf('\n') - text.IndexOf('\n')));
byte[] encodedSignedCms = Convert.FromBase64String(text);


Операцию со обрезанием строк выполняю для того, чтобы отрезать в начале и конце файла "----- BEGIN PKCS7 SIGNED -----" и "----- END PKCS7 SIGNED -----". Или другие метки начала и конца. Если кто подскажет более лакончиный способ выдрать base64 контент из файла - буду рад :)
thanks 1 пользователь поблагодарил d.dolbilov за этот пост.
dmi-viktor оставлено 22.10.2022(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.