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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline oleg.bragin  
#1 Оставлено : 12 ноября 2015 г. 13:07:00(UTC)
oleg.bragin

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

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

Всем привет!

Из примеров КРИПТО ПРО .NET SDK, использовал SingleSigner.cs, чуть модифицировал:
Код для подписи:

Код:
​
// Sign the stream and save it to another stream.
private static Stream SignRequestContent(MemoryStream streamToSign, X509Certificate2 personalCertificate)
{
    var contentInfo = new ContentInfo(streamToSign.ToArray());
    var signedCms = new SignedCms(contentInfo);
    var cmsSigner = new CmsSigner(personalCertificate);
    signedCms.ComputeSignature(cmsSigner);
    return new MemoryStream(signedCms.Encode());
}


Код, который декодируем и проверяет подпись:
Код:
​
public static Stream VerifyAndDecodeResponseContent(MemoryStream streamToVerifyAndDecode, string bureauResponsiblePersonCertificateSerialNumber)
{
    var signedCms = new SignedCms();
    signedCms.Decode(streamToVerifyAndDecode.ToArray());
    if (signedCms.SignerInfos.Count == 0)
    {
        return null;
    }
    var isSignatureValid = false;
    SignerInfoEnumerator enumerator = signedCms.SignerInfos.GetEnumerator();
    while (enumerator.MoveNext())
    {
        SignerInfo current = enumerator.Current;
        try
        {
            current.CheckSignature(new X509Certificate2Collection(GetCertificate(bureauResponsiblePersonCertificateSerialNumber)), false);
            isSignatureValid = true;
            signedCms.RemoveSignature(current);
        }
        catch (CryptographicException ex)
        {
            throw ex;
        }
    }
    return isSignatureValid
            ? new MemoryStream(signedCms.ContentInfo.Content)
            : null;
}


в момент проверки подписи возникает исключение "cannot find the original signer".
Фактически, если подпись не проверять, то все работает. Так как ее можно убрать и получить чистый XML, но хочется все проверить все, что нужно.
В отладчике видно, что SignerInfo.Certificate is null.

Может кто-то подсказать в чем проблема?
Заранее спасибо!
Offline Максим Коллегин  
#2 Оставлено : 12 ноября 2015 г. 17:29:34(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,393
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
Сертификат не включен в подписанное сообщение, поэтому null. CmsSigner.IncludeOption
Знания в базе знаний, поддержка в техподдержке
Offline oleg.bragin  
#3 Оставлено : 12 ноября 2015 г. 17:42:18(UTC)
oleg.bragin

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

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

Пытался выставить CmsSigner.IncludeOption = WholeChain.
Certificate все равно null и ошибка все равно есть.
Offline Андрей Писарев  
#4 Оставлено : 13 ноября 2015 г. 11:07:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2209 раз в 1724 постах
Автор: oleg.bragin Перейти к цитате
Пытался выставить CmsSigner.IncludeOption = WholeChain.
Certificate все равно null и ошибка все равно есть.


А цепочка сертификации строится до корневого?
Прикрепите получившийся файл в архиве?

А с EndCertOnly пробовали?
Техническую поддержку оказываем тут
Наша база знаний
Offline oleg.bragin  
#5 Оставлено : 14 ноября 2015 г. 12:20:20(UTC)
oleg.bragin

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

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

Всем большое спасибо!

Проблема в неправильном поиске сертификата, его надо было искать в другом хранилище, плюс неправильно передавался параметр поиска.
Для проверки использовать перегрузку метода CheckSignature, принимающую коллекцию сертификатов для проверки.
Offline N-N  
#6 Оставлено : 8 октября 2018 г. 12:47:22(UTC)
N-N

Статус: Участник

Группы: Участники
Зарегистрирован: 16.11.2016(UTC)
Сообщений: 23

Добрый день!

При проверке подписи методом SignedCms.CheckSignatures возникает ошибка "Cannot find the original signer".
Подпись отсоединенная, сертификат встроен в подпись. Подпись создана с помощью cadesplugin в JavaScript.
Проблема заключается в том, что КриптоАРМ успешно проверяет подпись, показывает сертификат автора подписи, показывает штамп времени и вроде как все с подписью хорошо.
Но если эту подпись проверить с момощью .NET, то возникает описанная выше ошибка. В отладчике видно, что сертификаты в подписи отсутствуют.
Самое интересное, что есть другая подпись, созданная тем же кодом, но другим пользователем и другим сертификатом, но выданным тем же УЦ. И у этой подписи ошибок не возникает. В отладчике видно, что сертификаты в подписи есть.
Как такое вообще может быть?

Код проверки подписи ниже
Код:

static void CheckCryptoProSignature()
{
	byte[] docBytes = File.ReadAllBytes(@"C:\Temp\InvalidSignature.pdf");
	byte[] sigBytes = File.ReadAllBytes(@"C:\Temp\InvalidSignature.pdf.sig");

	ContentInfo contentInfo = new ContentInfo(docBytes);
	SignedCms signedCms = new SignedCms(contentInfo, true);
	string signature = Encoding.UTF8.GetString(sigBytes);
	byte[] b = Convert.FromBase64String(signature);
	signedCms.Decode(b);
	signedCms.CheckSignature(false);
}
Offline N-N  
#7 Оставлено : 9 октября 2018 г. 17:24:48(UTC)
N-N

Статус: Участник

Группы: Участники
Зарегистрирован: 16.11.2016(UTC)
Сообщений: 23

Проблема разрешилась. Проблема заключалась в версии плагина. Подписи, сформированные на более старых версиях плагина, почему что не проверялись .NET Framework по причине отсутствия встроенного в подпись сертификата. После обновления версии плагина проблема ушла.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.