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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline NAlexV  
#41 Оставлено : 30 сентября 2021 г. 14:52:20(UTC)
NAlexV

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

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

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


Да, именно так, а нужно подписать бинарник.


Он и будет подписан. Кодируете в base64, указываете перед присваиванием, что закодировано - внутри будет декодировано и подписано бинарное представление.

Понятно, значит я не понял семантику значения CADESCOM_BASE64_TO_BINARY перечисления CADESCOM_CONTENT_ENCODING_TYPE. Получается, что смысл значения - подписать бинарник, закодированный в Base64. :)
Спасибо.


Андрей, добрый день.
Сетевики настроили сетевой доступ к серверу "http://qs.cryptopro.ru/tsp/tsp.srf", но теперь возвращается ошибка: "(CAdESCOM.CadesSignedData.1): The revocation process could not continue - the certificate(s) could not be checked." - процесс подписи не может быть продолжен, не удалось проверить сертификат. Использую сертификат с отпечатком "61 b5 87 a7 e3 94 02 e8 57 6d 66 f6 5e 72 08 fe dc 3c c0 e2".
Что не так с сертификатом?
Online Андрей *  
#42 Оставлено : 30 сентября 2021 г. 14:59:43(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Должны выполняться требования к CAdES-T.


Настраивали к qs.cryptopro.ru?

Есть еще УЦ КриптоПРО и УЦ корневой (МКС).
К их серверам тоже должен быть доступ (CRL).


также идёт запрос к OCSP:
http://qs.cryptopro.ru/ocspkc3/ocsp.srf

CRL МКС:
http://reestr-pki.ru/cdp/guc_gost12.crl


т.е. нужно, чтобы адреса (crl\ocsp), в используемых сертификатах были доступны.

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

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
Должны выполняться требования к CAdES-T.


Настраивали к qs.cryptopro.ru?

Есть еще УЦ КриптоПРО и УЦ корневой (МКС).
К их серверам тоже должен быть доступ (CRL).


также идёт запрос к OCSP:
http://qs.cryptopro.ru/ocspkc3/ocsp.srf

CRL МКС:
http://reestr-pki.ru/cdp/guc_gost12.crl


т.е. нужно, чтобы адреса (crl\ocsp), в используемых сертификатах были доступны.


Андрей, добрый день.
Настроили доступ к:
http://qs.cryptopro.ru/tsp/tsp.srf
и к http://reestr-pki.ru/cdp/guc_gost12.crl
Однако, ошибка: "(CAdESCOM.CadesSignedData.1): The revocation process could not continue - the certificate(s) could not be checked." не ушла.
Что еще нужно проверить?
Online Андрей *  
#44 Оставлено : 1 октября 2021 г. 14:40:54(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
включить и собрать лог через dbgview, приложить в zip
traceall_x64.zip (1kb) загружен 0 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline NAlexV  
#45 Оставлено : 5 октября 2021 г. 11:27:11(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
включить и собрать лог через dbgview, приложить в zip
traceall_x64.zip (1kb) загружен 0 раз(а).

Андрей, добрый день.
Разобрались с проблемой описанной выше. Оказалось, что сетевой доступ настроили но не полностью.
Теперь метод
Код:
ДанныеДляПодписи.SignCades(Крипто, ТипПодписи, ВидПодписиОтдельная, КодировкаПодписи);
возвращает строку подписи (в строке иероглифы), но система назначения, куда мы отправляем файл и подпись этого файла не принимает - выдает ошибку: "невозможно прочитать файл подписи".
Otzyv.txt.sgn (924kb) загружен 1 раз(а).
Собственно вопросы.
  • Надо ли как-то дополнительно преобразовывать сроку подписи, полученную методом SignCades?

  • Является ли файл подписи подписью в формате CADES-T?

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

Online Андрей *  
#46 Оставлено : 5 октября 2021 г. 11:37:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
1. Можно при подписании указывать, чтобы в ответе было закодировано в base64.
2. Правильно записали ответ, как бинарные данные? Сейчас это не ASN.1.
Техническую поддержку оказываем тут
Наша база знаний
Offline NAlexV  
#47 Оставлено : 6 октября 2021 г. 11:53:04(UTC)
NAlexV

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Андрей * Перейти к цитате
1. Можно при подписании указывать, чтобы в ответе было закодировано в base64.
2. Правильно записали ответ, как бинарные данные? Сейчас это не ASN.1.

Андрей, добрый день.
Получилось подписывать на платформе 1С:Предприятие файлы подписью с криптометкой времени в формате CADES-T.
Если кому интересно, то работающая функция выглядит так:
Код:

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

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

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


Появилась еще одна проблема, связанная с подписью файлов с криптометкой времени.
Для целевой системы, куда направляются подписанные файлы, требуется в сопроводительном XML документе к подписанному файлу указать дату и время подписи документа, совпадающие с реальной датой и временем подписи документа на криптосервере времени.
Вопрос.
Существуют ли какие либо методы извлечения реальных даты и времени подписи документа из открепленного файла с подписью или иным методом?
Online Андрей *  
#48 Оставлено : 6 октября 2021 г. 11:56:45(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Автор: NAlexV Перейти к цитате

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



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

Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#49 Оставлено : 6 октября 2021 г. 12:05:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
инициализировать объекты, заполнить, проверить подпись: cadessigneddata https://docs.cryptopro.r...om_class/cadessigneddata

Подписанты: Signers
Далее по каждому: Объект CPSigner

есть список - Свойства...

среди них, к примеру:
Цитата:

SignatureTimeStampTime Время подписи из штампа времени на значение подписи.


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

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

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

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

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



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



Какой COM объект позволяет прочитать атрибуты штампа подписи? Какие методы для этого нужно использовать? Может быть есть пример на С++.
Online Андрей *  
#51 Оставлено : 6 октября 2021 г. 12:50:23(UTC)
Андрей *

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

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

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

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



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



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


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

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

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

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

Сказал(а) «Спасибо»: 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)
Сообщений: 10,655
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Цитата:
На платформе 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)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 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) загружен 5 раз(а).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

Сказал(а) «Спасибо»: 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,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Автор: 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)
Сообщений: 18
Российская Федерация

Сказал(а) «Спасибо»: 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 Лента
Пользователи, просматривающие эту тему
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.