Статус: Участник
Группы: Участники
Зарегистрирован: 26.03.2020(UTC) Сообщений: 25
|
Автор: Андрей *  Передать в Hash(base64(данные)) Вот это нешуточно помогло. Спасибо!
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33  Сказал(а) «Спасибо»: 15 раз
|
Автор: Андрей *  Автор: Дмитрий (LV)  Я вижу по исходникам плагина, что есть метод set_Key() который вроде как принимает строку, но при вызове валится "The parameter is incorrect. (0x80070057)" т.е. если не вызывать set_KeyPin - то работает после указания пароля в диалоге? Приветствую. Хотел бы узнать поподробнее о set_KeyPin? В PHP коде пытаюсь создать RAW подпись. При выполнении запроса в браузере в момент вызова SignHash на объекте CPRawSignature вылетает ошибка (0x8009000D). При выполнении этого же скрипта в консоли вместо ошибки спрашивает пин для контейнера и корректно всё выполняет. В исходниках вижу что метод set_KeyPin есть только у объекта Signer, который не используется при создании RAW подписи. Есть ли возможность создать RAW подпись в PHP в неконсольном скрипте (при условии что ключ в неизвлекамом контейнере с пин кодом)? Отредактировано пользователем 5 июня 2020 г. 21:12:41(UTC)
| Причина: (при условии что ключ в неизвлекамом контейнере с пин кодом)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
Автор: sniker  Автор: Андрей *  Автор: Дмитрий (LV)  Я вижу по исходникам плагина, что есть метод set_Key() который вроде как принимает строку, но при вызове валится "The parameter is incorrect. (0x80070057)" т.е. если не вызывать set_KeyPin - то работает после указания пароля в диалоге? Приветствую. Хотел бы узнать поподробнее о set_KeyPin? В PHP коде пытаюсь создать RAW подпись. При выполнении запроса в браузере в момент вызова SignHash на объекте CPRawSignature вылетает ошибка (0x8009000D). При выполнении этого же скрипта в консоли вместо ошибки спрашивает пин для контейнера и корректно всё выполняет. В исходниках вижу что метод set_KeyPin есть только у объекта Signer, который не используется при создании RAW подписи. Есть ли возможность создать RAW подпись в PHP в неконсольном скрипте (при условии что ключ в неизвлекамом контейнере с пин кодом)? Здравствуйте. >При выполнении этого же скрипта в консоли О каком "скрипте" речь? Как инициализируете сертификат, которым выполняется подписание? >в момент вызова SignHash на объекте CPRawSignature вылетает ошибка (0x8009000D) Ошибка 0x8009000D (-2146893811) Ключ не существует. Обычная подпись (CMS) формируется успешно тем же сертификатом? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33  Сказал(а) «Спасибо»: 15 раз
|
Цитата:>При выполнении этого же скрипта в консоли О каком "скрипте" речь? Как инициализируете сертификат, которым выполняется подписание? Запускаю один и тот же скрипт в браузере и в консоли и сравниваю результат. Вот скрипт Код:
function SetupStore($location, $name, $mode)
{
$store = new \CPStore();
$store->Open($location, $name, $mode);
return $store;
}
function SetupCertificates($location, $name, $mode)
{
$store = SetupStore($location, $name, $mode);
return $store->get_Certificates();
}
function SetupCertificate($location, $name, $mode,
$find_type, $query, $valid_only,
$number)
{
$certs = SetupCertificates($location, $name, $mode);
if ($find_type !== NULL)
{
$certs = $certs->Find($find_type, $query, $valid_only);
if (is_string($certs))
return $certs;
else {
if (!$certs->Count()) { return null;}
return $certs->Item($number);
}
}
else
{
$cert = $certs->Item($number);
return $cert;
}
}
$signedInfo = 'Подписываемые xml данные';
$cert = SetupCertificate(CURRENT_USER_STORE, "My", STORE_OPEN_READ_ONLY, CERTIFICATE_FIND_SHA1_HASH, '7df8a66ceba7181c39704054d42b1d9f4d14c641', 0, 1);
$hashedData = new CPHashedData();
$hashedData->set_Algorithm(101); // 101 CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
$hashedData->set_DataEncoding(1); // 1 CADESCOM_BASE64_TO_BINARY
$hashedData->Hash(base64_encode($signedInfo));
$hashedData->SetHashValue($hashedData->get_Value());
$rawSignature = new CPRawSignature();
$signature = $rawSignature->SignHash($hashedData, $cert);
echo "signature:\n";
echo "$signature\n";
$signature = base64_encode(hex2bin($signature));
echo "$signature\n";
// Подпись по шаблону
$signer = new CPSigner();
$signer->set_Certificate($cert);
$signer->set_KeyPin('123');
$signer->set_Options(2); // 2 CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY
$sd = new \CPSignedXML();
$sd->set_Content($xml);
$sd->set_SignatureType(2); // 2 XML_SIGNATURE_TYPE_TEMPLATE
$sm = $sd->Sign($signer,"");
printf("Signature OLD is:\n");
printf(htmlspecialchars($sm));
Цитата:>в момент вызова SignHash на объекте CPRawSignature вылетает ошибка (0x8009000D)
Ошибка 0x8009000D (-2146893811) Ключ не существует. Обычная подпись (CMS) формируется успешно тем же сертификатом?
Вот из этой темы сделал вывод что дело в пин коде. Плюс тот факт что подпись с участием CPSigner формируется без проблем на том же ключе(с использованием set_KeyPin) Обычная CMS подпись тоже на этом ключе формировалась, .т.к. там CPSigner участвует.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
это php, как Вы его запускаете в браузере? код выполняется в php, с другими правами, не от пользователя в консоли. Верно?
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
Цитата:$sm = $sd->Sign($signer,""); успешно выдаёт подпись в браузере? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33  Сказал(а) «Спасибо»: 15 раз
|
Автор: Андрей *  Цитата:$sm = $sd->Sign($signer,""); успешно выдаёт подпись в браузере? Успешно Код:$signature = $rawSignature->SignHash($hashedData, $cert);
Эту строчку только комментирую чтобы не прерывался скрипт на ошибке
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
Автор: sniker  Есть ли возможность создать RAW подпись в PHP в неконсольном скрипте (при условии что ключ в неизвлекамом контейнере с пин кодом)? Вариант: запомнить пароль в конфигурационном файле. |
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
sniker оставлено 08.06.2020(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,686   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
sniker оставлено 08.06.2020(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33  Сказал(а) «Спасибо»: 15 раз
|
Автор: Андрей *  Спасибо. Сохранение паролей для контейнеров позволило решить вопрос. Цитата: p.s. SethashValue и SighHash - запрещенные методы, если используете - то необходимы тематические исследования
Код:$hashedData->SetHashValue($hashedData->get_Value());
Эту строчку с SetHashValue вообще выкинул. Как оказалось, она не нужна. Из "запрещённых" методов остался только SignHash (он, кстати есть в документации) Цитата:это php, как Вы его запускаете в браузере? код выполняется в php, с другими правами, не от пользователя в консоли. Верно? Код выполняется на сервере Apache. Сервер выполняет код от другого пользователя, не консольного. Если кто-то будет решать аналогичную задачу - надо не забыть проверить доступность контейнера с ключом для пользователя, от имени которого выполняется php скрипт на сервере (при обращении из браузера). Еще раз спасибо.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close