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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Стрелков Сергей  
#1 Оставлено : 21 июня 2022 г. 7:14:14(UTC)
Стрелков Сергей

Статус: Новичок

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

Сказал(а) «Спасибо»: 3 раз
Добрый день.
Уточните пожалуйста, как проверить оборачивающую ЭП методом `VERIFY` объекта `CAdESCOM.SignedXML` ?
Исходные данные, Криптпо Про CSP 4/ cadesplugin.
Подпись формируется следующим образом :
Код:
const { cadesplugin } = window;

	const oSigner = await cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
	await oSigner.propset_Certificate(oCertificate);
	await oSigner.propset_CheckCertificate(true);

	// Создаем объект CAdESCOM.SignedXML
	const oSignedXML = await cadesplugin.CreateObjectAsync("CAdESCOM.SignedXML");
	await oSignedXML.propset_Content(sContent); // sContent=base64

	// Указываем тип подписи - в данном случае вложенная
	await oSignedXML.propset_SignatureType(
		CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING
	);

	// Указываем алгоритм подписи
	await oSignedXML.propset_SignatureMethod(XmlDsigGost3410Url2012256);

	// Указываем алгоритм хэширования
	await oSignedXML.propset_DigestMethod(XmlDsigGost3411Url2012256);

	let sSignedMessage = "";

	try {
		sSignedMessage = await oSignedXML.Sign(oSigner);
	} catch (err) {
		throw err;
	}


Подписываемое сообщение предварительно переводится в base64.
Далее осуществляю проверку подписанного сообщения методом `VERIFY`,предварительно конвертируя в base64(делается для того ,что подписываемые данные имеют кодировку отличную от UTF-8) перед подачей на вход методу.

Код:
try {
		const oSignedXML = await cadesplugin.CreateObjectAsync("CAdESCOM.SignedXML");

		await oSignedXML.Verify(sSignedMessage);//sSignedMessage=base64
	} catch (err) {
		console.error(err);
		throw err;
        }


После описанных манипуляций метод `VERIFY` возвращает `undefined`,тоесть не выбрасывает исключения или возвращает HRESULT.
Подскажите в какую сторону копать или что я делаю не так?
Offline two_oceans  
#2 Оставлено : 21 июня 2022 г. 10:08:51(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Добрый день.
На первый взгляд проблема в кодировках.
Если подписываемое сообщение переведено в BASE64, то обязательно перед передачей Content установить свойство ContentEncoding в 1. В коде я этого не вижу, поэтому подписаны будут не исходные данные, а их BASE64 представление (без раскодировки). Это не вызывает исключения, так как технически XMLDSIG допускает подпись не только XML, но и произвольных двоичных данных.

Не помешает проверить, что именно возвращается после подписания, некоторые интерфейсы/функции подписания требуют раскодирования результата из HEX, можно уточнить по справке.

Как подписанное передать на проверку мне сказать сложно, так как TYPE_ENVELOPING не использую, но полагаю процедура такая же как и у других типов подписи.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Стрелков Сергей оставлено 21.06.2022(UTC)
Offline Стрелков Сергей  
#3 Оставлено : 21 июня 2022 г. 17:50:40(UTC)
Стрелков Сергей

Статус: Новичок

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

Сказал(а) «Спасибо»: 3 раз
Спасибо ,что обратили внимание на пост. В интерфейсе `ISignedXML` отсутствует свойство ContentEncoding , это свойство доступно в интерфейсе ICPSignedData.
В целом метод VERIFY интерфейса `ISignedXML` отрабатывает при проверке `битых подписей` в документе.
Осталось разобраться как правильно прокинуть xPath в VERIFY для получения исключения при проверке XML не содержащих подпись.
Offline Новожилова Елена  
#4 Оставлено : 21 июня 2022 г. 20:07:29(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 926
Женщина
Откуда: Крипто-Про

Поблагодарили: 101 раз в 96 постах
Добрый день!

В ISignedXML кодировка BASE64 распознаётся автоматически.

Если вы создаёте подпись вида CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING, то это нужно указать при проверке, так же, как вы указывали это при создании.

Информацию о действительности каждой найденной подписи в документе можно получить при помощи свойства Signers. Коллекция Signers заполняется в порядке следования элементов, найденных XPath-запросом. По умолчанию используется следующий запрос: "//*[local-name()='Signature' and namespace-uri()='http://www.w3.org/2000/09/xmldsig\#']"

http://cpdn.cryptopro.ru...16e78246e74f5817683.html
thanks 2 пользователей поблагодарили Новожилова Елена за этот пост.
Стрелков Сергей оставлено 22.06.2022(UTC), two_oceans оставлено 22.06.2022(UTC)
Offline Стрелков Сергей  
#5 Оставлено : 22 июня 2022 г. 9:58:07(UTC)
Стрелков Сергей

Статус: Новичок

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

Сказал(а) «Спасибо»: 3 раз
Доброго дня!
Елена ,спасибо огромное!
Буду реализовывать, хорошего Вам дня!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.