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

Уведомление

Icon
Error

7 Страницы«<4567>
Опции
К последнему сообщению К первому непрочитанному
Online Андрей *  
#51 Оставлено : 6 октября 2021 г. 12:50:23(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: NAlexV Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: NAlexV Перейти к цитате

Вопрос.
Существуют ли какие либо методы извлечения реальных даты и времени подписи документа из открепленного файла с подписью или иным методом?



Аналогично через COM - прочитать атрибуты...
?



Какой COM объект позволяет прочитать атрибуты штампа подписи? Какие методы для этого нужно использовать? Может быть есть пример на С++.


хм...всё тот же...
СоздатьCOMОбъектCAdESCOM("CadesSignedData");
и далее..
по С++ есть аналогичное описание, но там через структуры.

Техническую поддержку оказываем тут
Наша база знаний
Offline NAlexV  
#52 Оставлено : 6 октября 2021 г. 13:43:55(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
Автор: NAlexV Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: NAlexV Перейти к цитате

Вопрос.
Существуют ли какие либо методы извлечения реальных даты и времени подписи документа из открепленного файла с подписью или иным методом?



Аналогично через COM - прочитать атрибуты...
?



Какой COM объект позволяет прочитать атрибуты штампа подписи? Какие методы для этого нужно использовать? Может быть есть пример на С++.


хм...всё тот же...
СоздатьCOMОбъектCAdESCOM("CadesSignedData");
и далее..
по С++ есть аналогичное описание, но там через структуры.



На платформе 1С у COM объекта CadesSignedData недоступны свойства этого объекта, следовательно должны быть методы, возвращающие свойства объекта. Попробовал вызвать методы CryptVerifyDetachedMessageSignature и VerifyDetachedMessageSignature, в результате работы которых, по описанию, можно получить время подписи файла, но система сообщает, что эти методы не обнаружены.
Прошу сообщить каким способом можно получить из COM объекта CadesSignedData свойство, содержащие значение времени подписи файла.
Online Андрей *  
#53 Оставлено : 6 октября 2021 г. 13:52:15(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Цитата:
На платформе 1С у COM объекта CadesSignedData недоступны свойства этого объекта


А какие использовали?
Посмотрите цепочку внимательнее...

cadessigneddata => Signers [xxx] => SignatureTimeStampTime

писал выше про это.

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
NAlexV оставлено 08.10.2021(UTC)
Offline NAlexV  
#54 Оставлено : 6 октября 2021 г. 14:58:37(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
Цитата:
На платформе 1С у COM объекта CadesSignedData недоступны свойства этого объекта


А какие использовали?
Посмотрите цепочку внимательнее...

cadessigneddata => Signers [xxx] => SignatureTimeStampTime

писал выше про это.



Андрей, извиняюсь - не увидел ваше сообщение #49.
Теперь вопрос как правильно проинициализировать объект CadesSignedData чтобы прочитать время подписи файла из строки с подписью?
Вот написал такой код:
Код:

				ДанныеДляПроверки = СоздатьCOMОбъектCAdESCOM("CadesSignedData"); 
				ДанныеДляПроверки.ContentEncoding = 1;
				ДанныеДляПроверки.Content = СтрокаПодписи; // срока с подписью в кодировке Base64
				Для Каждого Подписант Из ДанныеДляПодписи.Signers Цикл
					Если ЗначениеЗаполнено(Подписант.SignatureTimeStampTime) Тогда
						ДатаВремяПодписи = Подписант.SignatureTimeStampTime;
						ДанныеОСертификате.ДатаПодписания = ДатаВремяПодписи;
						Прервать;
					КонецЕсли;
				КонецЦикла;

В коллекции подписантов есть один подписант (Count = 1), но свойства SignatureTimeStampTime имеет странное значение 1 января 1970 г.
Snimok.PNG (14kb) загружен 6 раз(а).

Подскажите как правильно инициализировать COM объект CadesSignedData для получения даты подписи из строки подписью?

Отредактировано пользователем 6 октября 2021 г. 15:19:18(UTC)  | Причина: Не указана

Online Андрей *  
#55 Оставлено : 6 октября 2021 г. 15:24:53(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
а штамп есть?
Техническую поддержку оказываем тут
Наша база знаний
Offline NAlexV  
#56 Оставлено : 6 октября 2021 г. 15:39:06(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
а штамп есть?

Штамп (файл с подписью) есть.
Вот: Otzyv.txt.sgn (671kb) загружен 2 раз(а).

Offline NAlexV  
#57 Оставлено : 7 октября 2021 г. 11:36:52(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: NAlexV Перейти к цитате
Автор: Андрей * Перейти к цитате
а штамп есть?

Штамп (файл с подписью) есть.
Вот: Otzyv.txt.sgn (671kb) загружен 2 раз(а).



Андрей, добрый день.
Можете мне помочь в решении описанной выше проблемы?
Offline NAlexV  
#58 Оставлено : 7 октября 2021 г. 16:07:58(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Коллеги, добрый день
Как имея строку УКЭП проинициализировать COM объект CadesSignedData в среде 1С:Предприятие чтобы прочитать время подписи из строки с подписью в формате CADES-T?
Написал вот такой код:
Код:

			// Подпись в формате CADES-T
			Крипто = СоздатьCOMОбъектCAdESCOM("CPSigner"); 
			Крипто.Certificate = ПолучитьСертификатПоОтпечатку(СтрокаОтпечатка);
			Крипто.KeyPin = Константы.ПарольДоступаКЗакрытомуКлючу.Получить();
			Крипто.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
			ДанныеДляПодписи = СоздатьCOMОбъектCAdESCOM("CadesSignedData"); 
			ДанныеДляПодписи.ContentEncoding = 1;	// двоичные данные в кодировке Base64
			ДанныеДляПодписи.Content = ПолучитьBase64СтрокуИзДвоичныхДанных(ПодписываемыеДвоичныеДанные);
			ТипПодписи = 5;	// CADES-T 
			ВидПодписиОтдельная = Истина;
			КодировкаПодписи = 0;	//  кодировка  Base64
			ДанныеОСертификате = ПолучитьДанныеОСертификате(НайденныйСертификат);
			СтруктураСообщения.Вставить("ДанныеОСертификате", ДанныеОСертификате);
			СтрокаПодписи = ДанныеДляПодписи.SignCades(Крипто, ТипПодписи, ВидПодписиОтдельная, КодировкаПодписи); 
			Если ЗначениеЗаполнено(СтрокаПодписи) Тогда
				Подпись = Base64Значение(СтрокаПодписи);
				ДанныеДляПроверки = СоздатьCOMОбъектCAdESCOM("CadesSignedData"); 
				ДанныеДляПроверки.ContentEncoding = 1;	// двоичные данные в кодировке Base64
				ДанныеДляПроверки.Content = СтрокаПодписи;
				Для Каждого Подписант Из ДанныеДляПодписи.Signers Цикл
					Если ЗначениеЗаполнено(Подписант.SignatureTimeStampTime) И Подписант.SignatureTimeStampTime > ДанныеОСертификате.ДатаПодписания Тогда
						ДатаВремяПодписи = Подписант.SignatureTimeStampTime; // здесь получаю дату 01.01.1970 г.
						ДанныеОСертификате.ДатаПодписания = ДатаВремяПодписи;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;

но почему-то получаю странную дату подписи 01.01.1970 г. Наверно неправильно проинициализировал объект? Или причина в ином? Что мне нужно исправить, чтобы получить дату и время подписи документа?
Offline two_oceans  
#59 Оставлено : 8 октября 2021 г. 5:48:53(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: NAlexV Перейти к цитате
но почему-то получаю странную дату подписи 01.01.1970 г. Наверно неправильно проинициализировал объект? Или причина в ином? Что мне нужно исправить, чтобы получить дату и время подписи документа?
Добрый день. И правда. Выше же уже писали рецепт:
Автор: Андрей * Перейти к цитате
инициализировать объекты, заполнить, проверить подпись: cadessigneddata https://docs.cryptopro.r...om_class/cadessigneddata
Главная ошибка: чтобы из значения подписанных данных получить Signers нужно проверить подпись. Если посмотрите внимательнее, то больше никуда "впихнуть" подписанные данные нельзя, только в функцию проверки. При успешной проверке Signers будут заполнены из подписанных данных. У Вас в коде проверки нет, так что значение свойств метки времени на самом деле не проинициализировано из переданных данных, а заполнено по умолчанию нулем (то есть 01 января 1970 года). Не все свойства имеют тип вариант, так что и функция проверки заполнения для них покажет что вроде как заполнены, но на самом деле там "умолчательное" значение. Можно опираться на тип подписи и результат проверки для определения что они заполнены реальным значением.

Далее - как передаются данные для проверки:
- если подпись отсоединенная (detached), то в Content передаются те же данные, что были подписаны. Если они в Base64, то устанавливаете ContentEncoding. Далее вызываете функцию проверки (наверно VerifyCades подойдет для Вашего случая), в нее передаете подписанные данные, еще вроде бы тип подписи и логический параметр.

Тут небольшое замечание, что так как форматы CADES основаны друг на друге, то если указать не тот формат что был при подписи, проверка может дать ложный результат.
- если подпись присоединенная, то Content не заполняется, потому что берется из подписанных данных. Соответственно ContentEncoding ни на что не влияет, можно не устанавливать. Далее вызываете функцию проверки (также передаются подписанные данные, тип подписи и логический параметр).

Подробности по функции проверки и в каком виде (BASE64 или HEX) передавать данные лучше уточнить в справке, разные интерфейсы немного отличаются в этом плане.

Отредактировано пользователем 8 октября 2021 г. 6:11:56(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
NAlexV оставлено 08.10.2021(UTC)
Offline NAlexV  
#60 Оставлено : 8 октября 2021 г. 16:02:24(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: two_oceans Перейти к цитате
Автор: NAlexV Перейти к цитате
но почему-то получаю странную дату подписи 01.01.1970 г. Наверно неправильно проинициализировал объект? Или причина в ином? Что мне нужно исправить, чтобы получить дату и время подписи документа?
Добрый день. И правда. Выше же уже писали рецепт:
Автор: Андрей * Перейти к цитате
инициализировать объекты, заполнить, проверить подпись: cadessigneddata https://docs.cryptopro.r...om_class/cadessigneddata
Главная ошибка: чтобы из значения подписанных данных получить Signers нужно проверить подпись. Если посмотрите внимательнее, то больше никуда "впихнуть" подписанные данные нельзя, только в функцию проверки. При успешной проверке Signers будут заполнены из подписанных данных. У Вас в коде проверки нет, так что значение свойств метки времени на самом деле не проинициализировано из переданных данных, а заполнено по умолчанию нулем (то есть 01 января 1970 года). Не все свойства имеют тип вариант, так что и функция проверки заполнения для них покажет что вроде как заполнены, но на самом деле там "умолчательное" значение. Можно опираться на тип подписи и результат проверки для определения что они заполнены реальным значением.

Далее - как передаются данные для проверки:
- если подпись отсоединенная (detached), то в Content передаются те же данные, что были подписаны. Если они в Base64, то устанавливаете ContentEncoding. Далее вызываете функцию проверки (наверно VerifyCades подойдет для Вашего случая), в нее передаете подписанные данные, еще вроде бы тип подписи и логический параметр.

Тут небольшое замечание, что так как форматы CADES основаны друг на друге, то если указать не тот формат что был при подписи, проверка может дать ложный результат.
- если подпись присоединенная, то Content не заполняется, потому что берется из подписанных данных. Соответственно ContentEncoding ни на что не влияет, можно не устанавливать. Далее вызываете функцию проверки (также передаются подписанные данные, тип подписи и логический параметр).

Подробности по функции проверки и в каком виде (BASE64 или HEX) передавать данные лучше уточнить в справке, разные интерфейсы немного отличаются в этом плане.


Огромное спасибо!
Отличное пояснение. Разобрался в проблеме.
Если кому интересно, то финальный код выглядит так:
Код:

Функция ПолучитьПодписьДокументаУКЭП(СтруктураСообщения, ПодписываемыеДвоичныеДанные, ОписаниеОшибки) Экспорт
	                                                               
	Подпись = Неопределено;
	
	СтрокаОтпечатка = Константы.ОтпечатокДействующегоСертификата.Получить();
	Отпечаток = ПолучитьДвоичныеДанныеИзHexСтроки(СтрокаОтпечатка);

	Крипто = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);	
	Крипто.ПарольДоступаКЗакрытомуКлючу = Константы.ПарольДоступаКЗакрытомуКлючу.Получить();
	Крипто.АлгоритмПодписи = "GR 34.10-2012 256";

	Хранилище = Крипто.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
	НайденныйСертификат = Хранилище.НайтиПоОтпечатку(Отпечаток);
	
	Если НайденныйСертификат = Неопределено Тогда
		ОписаниеОшибки = "Подпись файла УКЭП. По отпечатку не найден сертификат в хранилище";
		Возврат Неопределено;
	КонецЕсли;
	
	Попытка
		
		Если СтруктураСообщения.ПодписьКриптоМенеджером1С Тогда
			
			// Подпись в формате BES
			ДанныеОСертификате = ПолучитьДанныеОСертификате(НайденныйСертификат);
			СтруктураСообщения.Вставить("ДанныеОСертификате", ДанныеОСертификате);
			Подпись = Крипто.Подписать(ПодписываемыеДвоичныеДанные, НайденныйСертификат);
			
		Иначе
			
			// Подпись в формате CADES-T
			Крипто = СоздатьCOMОбъектCAdESCOM("CPSigner"); 
			Крипто.Certificate = ПолучитьСертификатПоОтпечатку(СтрокаОтпечатка);
			Крипто.KeyPin = Константы.ПарольДоступаКЗакрытомуКлючу.Получить();
			Крипто.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
			ДанныеДляПодписи = СоздатьCOMОбъектCAdESCOM("CadesSignedData"); 
			ДанныеДляПодписи.ContentEncoding = 1;	// двоичные данные в кодировке Base64
			ДанныеДляПодписи.Content = ПолучитьBase64СтрокуИзДвоичныхДанных(ПодписываемыеДвоичныеДанные);
			ТипПодписи = 5;	// CADES-T 
			ВидПодписиОтдельная = Истина;
			КодировкаПодписи = 0;	//  кодировка  Base64
			ДанныеОСертификате = ПолучитьДанныеОСертификате(НайденныйСертификат);
			СтруктураСообщения.Вставить("ДанныеОСертификате", ДанныеОСертификате);
			СтрокаПодписи = ДанныеДляПодписи.SignCades(Крипто, ТипПодписи, ВидПодписиОтдельная, КодировкаПодписи);
			Если ЗначениеЗаполнено(СтрокаПодписи) Тогда
				Подпись = Base64Значение(СтрокаПодписи);
				ДанныеДляПроверки = СоздатьCOMОбъектCAdESCOM("CadesSignedData"); 
				ДанныеДляПроверки.ContentEncoding = 1;	// двоичные данные в кодировке Base64
				ДанныеДляПроверки.Content = ПолучитьBase64СтрокуИзДвоичныхДанных(ПодписываемыеДвоичныеДанные);
				ДанныеДляПроверки.VerifyCades(СтрокаПодписи, ТипПодписи, ВидПодписиОтдельная);
				Для Каждого Подписант Из ДанныеДляПроверки.Signers Цикл
					Если ЗначениеЗаполнено(Подписант.SignatureTimeStampTime) И Подписант.SignatureTimeStampTime <> Дата(1970, 1, 1) Тогда
						ДатаВремяПодписи = Подписант.SignatureTimeStampTime;
						ДанныеОСертификате.ДатаПодписания = ДатаВремяПодписи;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			
		КонецЕсли;
		
	Исключение
		
		ОписаниеОшибки = "Подпись файла УКЭП. " + ОписаниеОшибки();
		
	КонецПопытки;
	
	Возврат Подпись;
	
КонецФункции

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
7 Страницы«<4567>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.