Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.03.2016(UTC) Сообщений: 34
|
Добрый день Клиент прислал нам подпись со штампом времени. В криптоАрм открывается нормально. Но с помощью интерфейса вашего плагина Cades проверить программно подпись не получается. Выдаётся ошибка An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in VerifyTS.exe
Additional information: Элемент не найден.Вот сам код Код:
string data =Convert.ToBase64String(File.ReadAllBytes(@"C:\Desktop\d\src.xml"));
string signature = Convert.ToBase64String(File.ReadAllBytes(@"C:\Desktop\d\src.xml.sig"));
CadesSignedData signedData = new CadesSignedData();
signedData.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
signedData.Content = data;
CADESCOM_CADES_TYPE cadesType = CADESCOM_CADES_TYPE.CADESCOM_CADES_X_LONG_TYPE_1;
signedData.VerifyCades(signature, cadesType, true);
Сами файлы прикладываю  src.xml (5kb) загружен 3 раз(а). src.xml.sig (8kb) загружен 3 раз(а).Помогите разобраться в чём дело
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Вы пытаетесь проверить подпись типа CADES X_LONG_TYPE_1 которая должна содержать помимо штампа еще другие атрибуты. И их не нашли. Скорее всего ваша подпись не X_LONG_TYPE_1 |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.03.2016(UTC) Сообщений: 34
|
Автор: cross  Вы пытаетесь проверить подпись типа CADES X_LONG_TYPE_1 которая должна содержать помимо штампа еще другие атрибуты. И их не нашли. Скорее всего ваша подпись не X_LONG_TYPE_1 Т.е. эту пришедшую подпись со штампом времени нельзя проверить средствами Cades plugin? Я приложил файлы. У вас есть возможность посмотреть этот файл с подписью? Это не может быть ошибкой плагина? Какие альтернативные способы проверки подписи со штампом времени существуют? Может быть подскажите какие-нибудь библиотеки для C#, которые могут обрабатывать отличные от Cades X_LONG_TYPE_1 подписи со штампом времени. Подпись к нам от клиента приходит. Соответственно повлиять как-то на её генерацию мы не можем( Она корректная (судя по КриптоАрм), нужно проверить программно.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.03.2016(UTC) Сообщений: 34
|
Посмотрел в "неподписанные" атрибуты Там присутствует 1.2.840.113549.1.9.16.2.14Этот атрибут означает "штамп времени на значение подписи" согласно посту Новожилова Елена https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=54184#post54184Получается с подписью всё норм и необходимы атрибут присутствует? Или чего то для корректной работы плагина там не хватает? Как вручную получить этот штамп времени из подписи? Вот написал небольшой код, но непонятно как расшифровывать asnData.RawData Код:
var contentInfo = new ContentInfo(Convert.FromBase64String(data));
var signedCms = new SignedCms(contentInfo, true);
signedCms.Decode(Convert.FromBase64String(signature));
signedCms.CheckSignature(true);
foreach (var signerInfo in signedCms.SignerInfos)
{
foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
{
//нужный нам штамп времени
if (unsignedAttribute.Oid.Value == "1.2.840.113549.1.9.16.2.14")
{
AsnEncodedData asnData = unsignedAttribute.Values[0];
byte[] asnBinary = asnData.RawData;//как преобразовать это значение? К чему привести?
}
}
}
У вас есть пример как расшифровать этот штамп времени? Меня в частности интересует дата подписи и проверить, что сам штамп времени валиден. Отредактировано пользователем 27 апреля 2016 г. 18:43:44(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.03.2016(UTC) Сообщений: 34
|
Получилось через BouncyCastle Код:
AsnEncodedData asnData = unsignedAttribute.Values[0];
byte[] asnBinary = asnData.RawData;
CmsSignedData data = new CmsSignedData(asnBinary);
TimeStampToken t = new TimeStampToken(data);
//validate timestamp with cert
try
{
foreach (Org.BouncyCastle.X509.X509Certificate bCert in data.GetCertificates("Collection").GetMatches(null))
{
t.Validate(bCert);
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Timestamp validation failed: {0}", ex.Message);
}
DateTime signTime = t.TimeStampInfo.GenTime;
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.05.2016(UTC) Сообщений: 12
Сказал(а) «Спасибо»: 1 раз
|
CryptoUser, можете подсказать, а как TimeStampToken записать в UnsignedAttribute ? И от чего нужно считать хеш, который передается службе штампов времени
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.10.2016(UTC) Сообщений: 2 
|
Присоединяюсь к просьбе. Есть ответ от TSPсервера, нужно как то положить его в структуру CRYPT_SIGN_MESSAGE_PARA в UnauthAttr? Что то вроде:
CRYPT_ATTR_BLOB cablob[1]; CRYPT_ATTRIBUTE ca[1]; cablob[0].cbData = tstResponseSize; cablob[0].pbData = tstResponse; // the response from TSA
ca[0].pszObjId = "1.2.840.113549.1.9.16.1.4"; // object identifier ca[0].cValue = 1; ca[0].rgValue = cablob; SigParams.cUnauthAtt = 1; SigParams.rgUnauthAttr = ca;
Только нужно еще в какой то момент закодировать с помощью CryptEncodeObject?
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close