Статус: Новичок
Группы: Участники
Зарегистрирован: 28.01.2020(UTC) Сообщений: 3
|
У меня есть документ и открепленная электронная подпись. Как мне получить дату подписания документа? Пробовал сделать вот так: Код:var signedCms = new SignedCms();
signedCms.Decode(fileBuffer); // fileBuffer - файл электронной подписи в виде массива байт
foreach (var signerInfo in signedCms.SignerInfos)
{
foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
{
foreach (var counterSignInfo in signerInfo.CounterSignerInfos)
{
foreach (var signedAttribute in counterSignInfo.SignedAttributes)
{
//if (signedAttribute.Oid.Value == WinCrypt.szOID_RSA_signingTime)
{
Pkcs9SigningTime signingTime = (Pkcs9SigningTime)signedAttribute.Values[0];
//Console.Out.WriteLine("Signing Time UTC: " + signingTime.SigningTime);
}
}
}
}
}
Но в таком случае в signerInfo.UnsignedAttributes - пусто и дальнейший код не выполняется. Подскажите, пожалуйста, как же все же получить дату подписания документа? Отредактировано пользователем 28 января 2020 г. 13:07:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Цитата:foreach (var unsignedAttribute in signerInfo.UnsignedAttributes) Добрый день. Навскидку непонятно что вы ходите этой строкой добиться, ведь далее внутри цикла unsignedAttribute не используется. Может осталась от предыдущей редакции и нужно удалить строку? В целом же дело может быть в конкретном подтипе подписи. В подписи вообще может не быть никакого упоминания о времени подписания, в этом случае используется текущее время на момент проверки подписи (естественно в таком случае проверяющая сторона может отдельно сохранить время когда подпись поступила и использовать это время как "первое приближение" или добавлять свою метку доверенного времени при поступлении). Конечно, правильно будет найти метку от сервера доверенного времени, включенную подписавшим, но ее может не быть. Менее правильный вариант - найти метку времени от подписавшего (она не доверенная! можно ее использовать или не использовать на усмотрение проверяющего), но и она необязательный атрибут. Поэтому советую сначала посмотреть есть ли время подписания в подписи в принципе. Отредактировано пользователем 28 января 2020 г. 23:03:27(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 28.01.2020(UTC) Сообщений: 3
|
two_oceans, спасибо за ответ. А вы можете подсказать, как проверить, что в подписи есть дата подписания?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Для тестового файла (что я имел в виду выше) можно посмотреть каким-то другим средством проверки подписи, уточняющим, какая именно метка времени найдена (недоверенная от подписавшего, доверенная от сервера времени, метка времени на атрибуты, на подпись или на сами подписанные данные). В общем случае, придется проверить программно все места, где метка может быть и определить метку чего именно нашли. При этом программа должна учитывать что может не найти ничего. Более детально в форматы cades long type и более продвинутые не вникал, не хочу вводить в заблуждение. В соседней теме, например, подпись не проверялась потому что timestamp был не с тем оидом и подписанный. https://www.cryptopro.ru...aspx?g=posts&t=17515 Там есть ссылки на RFC по теме.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: Veligord У меня есть документ и открепленная электронная подпись. Как мне получить дату подписания документа? Пробовал сделать вот так: Код:var signedCms = new SignedCms();
signedCms.Decode(fileBuffer); // fileBuffer - файл электронной подписи в виде массива байт
foreach (var signerInfo in signedCms.SignerInfos)
{
foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
{
foreach (var counterSignInfo in signerInfo.CounterSignerInfos)
{
foreach (var signedAttribute in counterSignInfo.SignedAttributes)
{
//if (signedAttribute.Oid.Value == WinCrypt.szOID_RSA_signingTime)
{
Pkcs9SigningTime signingTime = (Pkcs9SigningTime)signedAttribute.Values[0];
//Console.Out.WriteLine("Signing Time UTC: " + signingTime.SigningTime);
}
}
}
}
}
Но в таком случае в signerInfo.UnsignedAttributes - пусто и дальнейший код не выполняется. Подскажите, пожалуйста, как же все же получить дату подписания документа? Поиск по форуму:Pkcs9SigningTime Пример кода: https://www.cryptopro.ru...&m=101624#post101624Pkcs9SigningTime в подписанных атрибутах. Либо необходимо уточнение, какая метка используется. Написано выше про rfc |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 28.01.2020(UTC) Сообщений: 3
|
Спасибо большое, попробую такой вариант
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close