Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Проверяю подпись полученного CMS/PKCS#7 сообщения, но возникает "cannot find the original signer"
Статус: Новичок
Группы: Участники
Зарегистрирован: 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. Может кто-то подсказать в чем проблема? Заранее спасибо!
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Сертификат не включен в подписанное сообщение, поэтому null. CmsSigner.IncludeOption
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 12.11.2015(UTC) Сообщений: 8 Откуда: СПб
|
Пытался выставить CmsSigner.IncludeOption = WholeChain. Certificate все равно null и ошибка все равно есть.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,330 Сказал «Спасибо»: 549 раз Поблагодарили: 2209 раз в 1724 постах
|
Автор: oleg.bragin Пытался выставить CmsSigner.IncludeOption = WholeChain. Certificate все равно null и ошибка все равно есть. А цепочка сертификации строится до корневого? Прикрепите получившийся файл в архиве? А с EndCertOnly пробовали? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 12.11.2015(UTC) Сообщений: 8 Откуда: СПб
|
Всем большое спасибо!
Проблема в неправильном поиске сертификата, его надо было искать в другом хранилище, плюс неправильно передавался параметр поиска. Для проверки использовать перегрузку метода CheckSignature, принимающую коллекцию сертификатов для проверки.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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);
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.11.2016(UTC) Сообщений: 23
|
Проблема разрешилась. Проблема заключалась в версии плагина. Подписи, сформированные на более старых версиях плагина, почему что не проверялись .NET Framework по причине отсутствия встроенного в подпись сертификата. После обновления версии плагина проблема ушла.
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Проверяю подпись полученного CMS/PKCS#7 сообщения, но возникает "cannot find the original signer"
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close