Статус: Участник
Группы: Участники
Зарегистрирован: 07.08.2020(UTC) Сообщений: 23
Сказал(а) «Спасибо»: 7 раз
|
Здравствуйте. У меня получилось повторить пример, где создается параллельная подпись. Задача в том, что извне поступает документ, который мне надо параллельно подписать с помощью файла .sig (пришедший извне) и своей подписью. Возможно ли добавить эту подпись из .sig с помощью signCades и coSignCades?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,390 Сказал «Спасибо»: 53 раз Поблагодарили: 778 раз в 720 постах
|
Автор: KuzyXD Здравствуйте. У меня получилось повторить пример, где создается параллельная подпись. Задача в том, что извне поступает документ, который мне надо параллельно подписать с помощью файла .sig (пришедший извне) и своей подписью. Возможно ли добавить эту подпись из .sig с помощью signCades и coSignCades? Здравствуйте. Для этой цели используйте метод CoSignCades. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 07.08.2020(UTC) Сообщений: 23
Сказал(а) «Спасибо»: 7 раз
|
Автор: Александр Лавник Автор: KuzyXD Здравствуйте. У меня получилось повторить пример, где создается параллельная подпись. Задача в том, что извне поступает документ, который мне надо параллельно подписать с помощью файла .sig (пришедший извне) и своей подписью. Возможно ли добавить эту подпись из .sig с помощью signCades и coSignCades? Здравствуйте. Для этой цели используйте метод CoSignCades. Да, я так и делаю. Но как я могу скормить этому методу подпись из .sig, если Signer работает только с сертификатом, а не файлом?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Как я понимаю, надо сначала загрузить .sig в одну из функций Verify* затем использовать coSign* с Signer со своим сертификатом. То есть непроверенную подпись соподписать не сможете. Именно это сделано в примере, просто не прокомментировано зачем так сделано: VerifyHash потом coSignHash.
Также есть ограничение на алгоритмы хэша - если в список хэшей не добавлен алгоритм хэша Вашего сертификата (например, подпись по гост-2001, а у вас сертификат гост-2012), то подписать простым методом также не получится, придется делать более сложные манипуляции.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.09.2020(UTC) Сообщений: 7
|
Здравствуйте! подскажите, как пройти верификацию файла *.sig? Изначально подписываю файл одной подписью, сохраняю его с расширением .sig, пытаюсь подписать второй подписью coSign, предварительно проверив функцией verifyCades, выдает ошибку: Не найден автор исходной подписи. (0x8009100E) Пытаюсь: var CADES_BES = 1; yield oSignedData.VerifyCades(dataToSign, CADES_BES, false);
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 07.08.2020(UTC) Сообщений: 23
Сказал(а) «Спасибо»: 7 раз
|
Автор: Дмитрий-Р Здравствуйте! подскажите, как пройти верификацию файла *.sig? Изначально подписываю файл одной подписью, сохраняю его с расширением .sig, пытаюсь подписать второй подписью coSign, предварительно проверив функцией verifyCades, выдает ошибку: Не найден автор исходной подписи. (0x8009100E) Пытаюсь: var CADES_BES = 1; yield oSignedData.VerifyCades(dataToSign, CADES_BES, false); Подписываю первой подписью вот так: Код:export function signFileByThumbprint(certificateThumbprint, dataToSign) {
return new Promise(((resolve, reject) => {
window.cadesplugin.async_spawn(function *(args) {
var oStore = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
var CertFinder = yield oStore.Certificates;
var oCertificates = yield CertFinder.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certificateThumbprint);
if (yield oCertificates.Count === 0) {
alert("Сертификат не найден " + certificateCN);
return;
}
oStore.Close();
var oCertificate = yield oCertificates.Item(1);
var oSigner = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
var oSignedData = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataToSign);
var sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
resolve(sSignedMessage);
});
}));
}
Потом с помощью этого кода для двойной: Код:
export function coSignCreate(certificateThumbprint, dataToSign, sig){
return new Promise(((resolve, reject) => {
window.cadesplugin.async_spawn(function *(args) {
var oStore = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
var CertFinder = yield oStore.Certificates;
var oCertificates = yield CertFinder.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certificateThumbprint);
if (yield oCertificates.Count === 0) {
alert("Сертификат не найден " + certificateThumbprint);
return;
}
oStore.Close();
var oCertificate = yield oCertificates.Item(1);
var oSigner = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
yield oSigner.propset_CheckCertificate(true);
var oSignedData = yield window.cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataToSign);
yield oSignedData.VerifyCades(sig, CADESCOM_CADES_BES, true);
var sSignedData = yield oSignedData.CoSignCades(oSigner, CADESCOM_CADES_BES);
resolve(sSignedData);
});
}));
}
Отредактировано пользователем 20 апреля 2022 г. 18:52:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.09.2020(UTC) Сообщений: 7
|
Спасибо за ответ! Не совсем понимаю, что передается в sig? Подпись должна быть отделенная?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.09.2020(UTC) Сообщений: 7
|
Правильно ли я понял: в dataToSign передаем оригинальный файл, в sig - подпись? Отредактировано пользователем 21 апреля 2022 г. 16:11:15(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.09.2020(UTC) Сообщений: 7
|
var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData"); var CADES_BES = 1; var CAPICOM_ENCODE_BASE64 = 0; var dataToSign = fileContent; var dataSign = SigContent;
if (dataToSign) { yield oSignedData.propset_ContentEncoding(CADES_BES); //CADESCOM_BASE64_TO_BINARY yield oSignedData.propset_Content(dataToSign); }
try { yield oSignedData.VerifyCades(dataSign, CADES_BES, true); alert("Signature verified"); } catch (err) { alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err)); errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err); throw errormes; }
Пытаюсь вот этим кодом проверить подпись, выдает ошибку: Не найден автор исходной подписи. (0x8009100E) Можете подсказать, что не так делаю?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Добрый день. Логика такая - если подпись отсоединенная, то устанавливаете ContentEncoding и в Content передаете подписанные данные, а в VerifyCades отсоединенную подпись. Если подпись присоединенная, то ContentEncoding + Content не устанавливаются, сразу в VerifyCades передается присоединенная подпись, так как она уже содержит подписанные данные. Другими словами, вроде бы все правильно по логике.
Ошибка похоже из-за того, что при проверке отсутствует сертификат подписавшего. Тут логика в том, что в подпись включается либо сам сертификат (+ необязательно сертификаты удостоверяющих центров) либо включается информация для поиска сертификата на компьютере проверяющего. В теории возможен вариант включения только открытого ключа, но на практике все работают с сертификатами. С сертификатом размер отсоединенной подписи будет ощутимо больше. В данной ситуации похоже включена только информация для поиска сертификата, но сертификата на компьютере проверяющего нет. Следовательно, проверить подпись невозможно, так как неоткуда извлечь открытый ключ подписавшего.
Для исправления нужно либо подписывать документ с включением хотя бы сертификата либо установить сертификат подписавшего в хранилище сертификатов на компьютере, где проводится проверка. Достаточно только сертификата, без привязки к ключу. Полагаю подойдет хранилище Addressbook (Другие пользователи), чтобы такие сертификаты не мешались в хранилище Личные.
Кроме того, сертификаты УЦ, выпустившего сертификат подписавшего должны быть либо в подписи либо в хранилищах корневых и промежуточных сертификатов удостоверяющих центров.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close