Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,162   Сказал «Спасибо»: 618 раз Поблагодарили: 2389 раз в 1880 постах
|
Автор: SirSudo 
UPD: при попытке decode BASE64 example.doc.p7s файла подпись проверяется, но содержимое все равно остается нечитабельным.
Во вложененном архиве подписанный файл с помощью плагина. получается:после проверки в КриптоАРМ, извлекается файл, декодируется из base64 и только тогда читается средствами MS Word.  test.docx.p7s.zip (15kb) загружен 9 раз(а). |
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.01.2017(UTC) Сообщений: 15  Откуда: Новосибирск Сказал(а) «Спасибо»: 10 раз
|
А что, этот вариант тоже нужно рассмотреть. Где можно найти пример для создания отсоединенной подписи файла? Правильно ли я понимаю, что это невозможно с помощью Browser Plugin создать присоединенную подпись так, чтобы подписанный файл был не в BASE64 кодировке? Я думал, что на определенном этапе в коде можно добавить decode_base64(), присоединить подпись и отправить на сохранения. Такой вариант невозможен? UPD: Возникает ошибка архива, странно. UPD2: Глуплю, 7zip архив же. Открыл. Содержимое: "Привет" Отредактировано пользователем 9 января 2017 г. 17:47:46(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,162   Сказал «Спасибо»: 618 раз Поблагодарили: 2389 раз в 1880 постах
|
Автор: SirSudo  А что, этот вариант тоже нужно рассмотреть. Где можно найти пример для создания отсоединенной подписи файла?
Правильно ли я понимаю, что это невозможно с помощью Browser Plugin создать присоединенную подпись так, чтобы подписанный файл был не в BASE64 кодировке? Я думал, что на определенном этапе в коде можно добавить decode_base64(), присоединить подпись и отправить на сохранения. Такой вариант невозможен?
UPD: Возникает ошибка архива, странно. Что мешает начать смотреть документацию, особенно по параметрам при подписании? Цитата: bDetached [in, optional] Вид подписи: отделенная (true) или совмещенная (false). По умолчанию совмещенная.
И потом внести правки в пример. |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.01.2017(UTC) Сообщений: 15  Откуда: Новосибирск Сказал(а) «Спасибо»: 10 раз
|
Стыдно, сейчас попробую. Прощу прощения, Андрей
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.11.2010(UTC) Сообщений: 1,164
Сказал(а) «Спасибо»: 8 раз Поблагодарили: 163 раз в 148 постах
|
Автор: SirSudo  Или я Вас не совсем правильно услышал?  Вы упёрлись в то, во что вообще не надо упираться. Электронная подпись решает, как минимум, две задачи: 1. Позволяет удостоверить отправителя подписанного "сообщения"; 2. Позволяет удостоверить целостность (отсутствие искажений) подписанного сообщения. Очевидно, что как только вы начинаете редактировать "сообщение", то его целостность будет нарушена, а значит можно будет утверждать, что "ничего такого" отправитель не отправлял. Соответственно, или забыли про редактирование или рассматриваем редактирование в рамках совершенно другой задачи, где ЭП участвовать не будет. Дальше возникает вопрос использования отсоединённой или присоединённой подписи. У обоих вариантов есть свои плюсы и минусы. Превратить присоединённую подпись в отсоединённую и наоборот - задача вполне тривиальная. Вот только непонятно - какую задачу вы решаете. Не какие примеры смотрите или сервисы используете. Цель, а не средства.
|
 1 пользователь поблагодарил basid за этот пост.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.01.2017(UTC) Сообщений: 15  Откуда: Новосибирск Сказал(а) «Спасибо»: 10 раз
|
Код:function SignCadesBES_Async_File(certListBoxId) {
cadesplugin.async_spawn(function*(arg) {
var e = document.getElementById(arg[0]);
var selectedCertID = e.selectedIndex;
if (selectedCertID == -1) {
alert("Select certificate");
return;
}
var thumbprint = e.options[selectedCertID].value.split(" ").reverse().join("").replace(/\s/g, "").toUpperCase();
try {
var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open();
} catch (err) {
alert('Failed to create CAdESCOM.Store: ' + err.number);
return;
}
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var all_certs = yield oStore.Certificates;
var oCerts = yield all_certs.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
if ((yield oCerts.Count) == 0) {
alert("Certificate not found");
return;
}
var certificate = yield oCerts.Item(1);
var SignatureFieldTitle = document.getElementsByName("SignatureTitle");
var Signature;
try
{
FillCertInfo_Async(certificate);
var errormes = "";
try {
var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
} catch (err) {
errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
throw errormes;
}
var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
yield oSigningTimeAttr.propset_Name(CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
var oTimeNow = new Date();
yield oSigningTimeAttr.propset_Value(oTimeNow);
var attr = yield oSigner.AuthenticatedAttributes2;
yield attr.Add(oSigningTimeAttr);
var oDocumentNameAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
var CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
yield oDocumentNameAttr.propset_Name(CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME);
yield oDocumentNameAttr.propset_Value("Document Name");
yield attr.Add(oDocumentNameAttr);
if (oSigner) {
yield oSigner.propset_Certificate(certificate);
}
else {
errormes = "Failed to create CAdESCOM.CPSigner";
throw errormes;
}
var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
var CADES_BES = 1;
var dataToSign = Base64.encode(fileContent); // fileContent - объявлен в Code.js
if (dataToSign) {
// Данные на подпись ввели
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_STRING_TO_UCS2LE); //CADESCOM_BASE64_TO_BINARY
yield oSignedData.propset_Content(dataToSign);
yield oSigner.propset_Options(1); //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
try {
var StartTime = Date.now();
Signature = yield oSignedData.SignCades(oSigner, CADES_BES, true);
var EndTime = Date.now();
document.getElementsByName('TimeTitle')[0].innerHTML = "Время выполнения: " + (EndTime - StartTime) + " мс";
}
catch (err) {
errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err);
throw errormes;
}
}
document.getElementById("SignatureTxtBox").innerHTML = Signature;
sendPostToPHP(Signature);
SignatureFieldTitle[0].innerHTML = "Подпись сформирована успешно:";
}
catch(err)
{
SignatureFieldTitle[0].innerHTML = "Возникла ошибка:";
document.getElementById("SignatureTxtBox").innerHTML = err;
}
}, certListBoxId); //cadesplugin.async_spawn
}
Цитата:Почему моя отделённая подпись из плагина не проверяется в КриптоАРМ/cryptcp При использовании КриптоПро ЭЦП browser plug-in данные, переданные при создании подписи, будут перекодированы в UCS-2 little endian и именно в таком виде данные будут подписаны. См. Особенности работы с бинарными данными. Это сделано для совместимости с теми ЭП, которые были созданы в Internet Explorer с использованием CAPICOM. В КриптоАРМ и в cryptcp никакое перекодирование данных при создании подписи не производится. отсоединенная подпись не проверяется в КриптоАРМ, прочитал то, что написано в документации. Попробовал следующее: CADESCOM_BASE64_TO_BINARY заменил на CADESCOM_STRING_TO_UCS2LE; И теперь уже очевидную замену в этой строке Signature = yield oSignedData.SignCades(oSigner, CADES_BES, true); Изменений никаких. Не могу разобраться.
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.01.2017(UTC) Сообщений: 15  Откуда: Новосибирск Сказал(а) «Спасибо»: 10 раз
|
Автор: basid  Вы упёрлись в то, во что вообще не надо упираться. Электронная подпись решает, как минимум, две задачи: 1. Позволяет удостоверить отправителя подписанного "сообщения"; 2. Позволяет удостоверить целостность (отсутствие искажений) подписанного сообщения. Очевидно, что как только вы начинаете редактировать "сообщение", то его целостность будет нарушена, а значит можно будет утверждать, что "ничего такого" отправитель не отправлял. Соответственно, или забыли про редактирование или рассматриваем редактирование в рамках совершенно другой задачи, где ЭП участвовать не будет.
Дальше возникает вопрос использования отсоединённой или присоединённой подписи. У обоих вариантов есть свои плюсы и минусы. Превратить присоединённую подпись в отсоединённую и наоборот - задача вполне тривиальная.
Вот только непонятно - какую задачу вы решаете. Не какие примеры смотрите или сервисы используете. Цель, а не средства. Я Вас понял, и правда, выглядит всё это несуразно. В этом и проблема, что задание было сформулировано именно так: "Добавить возможность подписывать документы ЭЦП на сайт." Всё, что мне остается - предоставить на рассмотрение оба варианта. Суть ЭЦП я более менее теперь понял. Спасибо и извините, если причинил Вам какие-то неудобства.
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 21.12.2021(UTC) Сообщений: 21
Сказал(а) «Спасибо»: 5 раз
|
Автор: SirSudo  Такс, сохранил файл - все прошло успешно. Принцип следующий: js код, вызов которого вставил перед SignatureFieldTitle[0].innerHTML = "Подпись сформирована успешно:";Код:
function sendPostToPHP(varName) {
/*Проба сохранения файла*/
var postArray = {
'SAVE_DATA': varName
};
$.ajax({
type: "POST",
data: postArray,
url: '/cryptopro/save-file.php',
success: function(data) {
alert(varName);
}
});
}
В php странице делаю следующее: Код:
<?
$handle = fopen("test.ext.p7s", "w");
fwrite($handle, $_REQUEST['SAVE_DATA']);
fclose($handle);
Пока с именем test, но это сейчас подправлю. Сейчас проверку проходит на этом сайте ЛИНК ГосУслуги, но я загружаю полученный файл формата .ext.p7sВопрос - у меня будет храниться на диске файл и отдельно подпись к нему? Только так? Кажется, что я что-то опять не знаю, но этот файл теперь недоступен для просмотра, скажем, в том же Word? Просто отдельный файл с подписью, да? И еще один вопрос: если я подписываю файл example.doc , то результат я должен сохранить как example.doc.ext.p7s или как example.ext.p7s? Такой ответ приходит от ГосУслуг, если я загружаю файл example.doc и example.ext.p7s ... Что-то делаю не так? Выбираю " — электронного документа. ЭП — отсоединенная, в формате PKCS#7" Цитата:Подлинность документа НЕ ПОДТВЕРЖДЕНА ЭП 1: НЕ ВЕРНА Статус сертификата подписи: Не проверялся Владелец : RU, Новосибирская область, Новосибирск, *******, ****, *** **** *****, sir.sudo@yandex.ruИздатель: CRYPTO-PRO Test Center 2, CRYPTO-PRO LLC, Moscow, RU, support@cryptopro.ruДействителен: с 2017.01.09 по 2017.04.09 Здравствуйте. Не подскажете как сохранять не с названием test, а таким же названием как и загружаемый файл для подписи. То есть, если загружаем "example.docx", то и подпись с названием "example.sig" ? Спасибо.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,162   Сказал «Спасибо»: 618 раз Поблагодарили: 2389 раз в 1880 постах
|
Автор: viarim  Здравствуйте. Не подскажете как сохранять не с названием test, а таким же названием как и загружаемый файл для подписи. То есть, если загружаем "example.docx", то и подпись с названием "example.sig" ? Спасибо.
Здравствуйте. Загружаем файл - куда? Выбор в форме для локального подписания? На клиенте из js или с сервера присылать имя? |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,162   Сказал «Спасибо»: 618 раз Поблагодарили: 2389 раз в 1880 постах
|
речь про php? $_FILES['file']['tmp_name'] - копировать с нужным именем к себе...
читать в память: $data = file_get_contents($_FILES['file']['tmp_name']); $sgn = file_get_contents($_FILES['filecms']['tmp_name']);
|
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close