Статус: Новичок
Группы: Участники
Зарегистрирован: 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 раз(а).
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.06.2016(UTC) Сообщений: 4  Откуда: Ростов-на-Дону
|
Самостоятельно с проблемой не удалось разобраться. Пока что параллельно реализовал функцию подписания на базе плагина с добавлением подписываемых атрибутов в виде строк, все работает. Возможно есть какие-то примеры формирования подписи с атрибутами в бинарном виде?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
А такой проблемой не сталкивались. Скорее всего беда именно в том что это ASN1 кодированные. Так как подпись сама по себе ASN1 структура. Проверим у себя. А зачем вам ASN1 представление вашего класса? Почему просто не закодировать бинарное представление в base64 и не вложить его в бинарном виде? |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.06.2016(UTC) Сообщений: 4  Откуда: Ростов-на-Дону
|
Благодарю за ответ! Автор: cross  А зачем вам ASN1 представление вашего класса? Почему просто не закодировать бинарное представление в base64 и не вложить его в бинарном виде? В общем то мы так и делаем. ASN1 используется для сериализации экземпляра класса в байтовый массив. Т.е. никакого дополнительного ASN1 представления нет - из объекта получаем массив, из массива base64 строку и передаем ее в javascript для добавления к подписываемым атрибутам.
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close