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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline thereisnosun  
#1 Оставлено : 9 июня 2016 г. 16:18:36(UTC)
thereisnosun

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

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

Добрый день.

Имеется сценарий в котором необходимо добавить к подписи свой подписываемый атрибут. Значение атрибута предсавляет из себя экземпляр некоторого java класса ASN1 сериализованный в байтовый массив. OID атрибута - dotted string. Подписываемые данные и атрибуты формируются на сервере и передаются на клиент закодированные в base64 строку.

На странице Особенности работы с данными в КриптоПро ЭЦП Browser plug-in указано:
"При подписании произвольных данных рекомендуется предварительно закодировать их в Base64 и использовать свойство ContentEncoding."
"Это касается следующих методов: .... CPAttribute.ValueEncoding .... "

Учитывая это написали следующий код

Код:
function signDataAsync(fingerprint, data, signAttributes) {
	return new Promise(function(resolve, reject){
		cadesplugin.async_spawn(function *(args) {
			console.log("=========== Sign ===========");

			console.log("1. Try to find certificate.");

			var oStore = yield cadesplugin.CreateObjectAsync("CAPICOM.Store");
			yield oStore.Open(cadesplugin.CAPICOM_CURRENT_USER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

			var all_certs = yield oStore.Certificates;

			var oCertificates = yield all_certs.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, fingerprint);
			if (oCertificates.Count == 0) {
				console.error("Certificate not found: " + fingerprint);
				return;
			}
			var oCertificate = yield oCertificates.Item(1);

			console.log("Certificate with fingerprint ["+fingerprint+"] found.");

			console.log("2. Signing.");

			var signedMessage = "";
			try {
				var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");

				yield oSigner.propset_Certificate(oCertificate);
				yield oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN);

				var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
				yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
				yield oSignedData.propset_Content(data);

				var signAttrList = yield oSigner.AuthenticatedAttributes2;
				var signAttrMap = yield new Map(signAttributes);
				for (var attrOID of signAttrMap.keys()) {
                    var attrValue = yield signAttrMap.get(attrOID);

                    var oSigningAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
                    var oSigningAttrOID = yield oSigningAttr.OID;
                    yield oSigningAttrOID.propset_Value(attrOID)
                    yield oSigningAttr.propset_ValueEncoding(cadesplugin.CADESCOM_ENCODE_BASE64);
                    yield oSigningAttr.propset_Value(attrValue);

                    yield signAttrList.Add(oSigningAttr);
                }

				signedMessage = yield oSignedData.SignCades(oSigner, cadesplugin.CADESCOM_CADES_BES);
				console.log("Sign: ["+signedMessage+"]");
				args[0](signedMessage);
			} catch (e) {
				console.error("Error: Can't create sign. Error code: " + GetErrorMessage(e));
				args[1]("Error: Can't create sign. Error code: " + GetErrorMessage(e));
			}
			yield oStore.Close();
		}, resolve, reject);
	});
}


в качестве signAttributes передается массив следующего вида

Код:
[['1.2.643.3.61.1.1.6.502710.3.4.3.18', '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']]


При формировании подписи получаем ошибку "В ASN1 встречен неожиданный конец данных. (0x80093102)"

Сняли лог при помощи DebugView, как рекомендуется тут
В логе ошибки:
Код:
00000143	1746.86437988	[16672] cades.dll: {17152} /CadesMsgOpenToEncodeImpl/ cades.cpp(513) : Calling CryptMsgOpenToEncode()	
00000144	1746.86450195	[16672] cades.dll: {17152} /CadesMsgOpenToEncode/ cades.cpp(556) : (hMsg=0x01DD16D8, GetLastError=0x00000000)	
00000145	1746.87219238	[16672] cades.dll: {17152} /CadesMsgEnhanceSignature/ cades.cpp(1277) : (hCryptMsg=0x01DD16D8, dwSignatureIndex=0, pCadesSignPara=0x0012F5AC)	
00000146	1746.87219238	[16672] cades.dll: {17152} /CadesMsgEnhanceSignatureImpl/ cades.cpp(1068) : Input parameters checked	
00000147	1746.87243652	[16672] cades.dll: {17152} /CadesMsgEnhanceSignature/ cades.cpp(1294) : COleException, m_sc=0x80093102	
00000148	1746.87243652	[16672] cades.dll: {17152} /CadesMsgEnhanceSignature/ cades.cpp(1306) : (res=0, GetLastError=0x80093102	
00000149	1746.87243652	[16672] cades.dll: {17152} /CadesSignMessageImpl/ cades.cpp(2333) : Expression FAILED: ::CadesMsgEnhanceSignature(msgDecode.GetHandle(), 0, &cadesSignPara)	
00000150	1746.87268066	[16672] cades.dll: {17152} /CadesSignMessageImpl/ cades.cpp(2333) : Last win32 error thrown as exception	
00000151	1746.87268066	[16672] cades.dll: {17152} /CadesSignMessage/ cades.cpp(2380) : COleException, m_sc=0x80093102	
00000152	1746.87524414	[16672] cades.dll: {17152} /CadesSignMessage/ cades.cpp(2392) : (res=0, GetLastError=0x80093102


При создании подписи без подписываемых атрибутов или с указанием кодировки cadesplugin.CADESCOM_ENCODE_ANY подпись формируется без ошибок. Вероятно КриптоПро не нравится наш ASN1 объект, но не понятно чем именно. Если base64 строку конвертировать в файл и просмотреть например через ASN1 Editor, то получается читаемая информация о содержимом нашего java класса.

Прошу помочь разобраться с проблемой.
Приложил исходный код (для синхронного и асинхронного режима) и полный лог DebugView.
cades-debugview.LOG (21kb) загружен 3 раз(а). crypto.js.zip (3kb) загружен 3 раз(а).
Offline thereisnosun  
#2 Оставлено : 20 июня 2016 г. 16:46:03(UTC)
thereisnosun

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

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

Самостоятельно с проблемой не удалось разобраться. Пока что параллельно реализовал функцию подписания на базе плагина с добавлением подписываемых атрибутов в виде строк, все работает.
Возможно есть какие-то примеры формирования подписи с атрибутами в бинарном виде?
Offline cross  
#3 Оставлено : 22 июня 2016 г. 11:22:54(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
А такой проблемой не сталкивались. Скорее всего беда именно в том что это ASN1 кодированные. Так как подпись сама по себе ASN1 структура. Проверим у себя. А зачем вам ASN1 представление вашего класса? Почему просто не закодировать бинарное представление в base64 и не вложить его в бинарном виде?
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline thereisnosun  
#4 Оставлено : 27 июня 2016 г. 13:26:32(UTC)
thereisnosun

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

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

Благодарю за ответ!

Автор: cross Перейти к цитате
А зачем вам ASN1 представление вашего класса? Почему просто не закодировать бинарное представление в base64 и не вложить его в бинарном виде?


В общем то мы так и делаем. ASN1 используется для сериализации экземпляра класса в байтовый массив. Т.е. никакого дополнительного ASN1 представления нет - из объекта получаем массив, из массива base64 строку и передаем ее в javascript для добавления к подписываемым атрибутам.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.