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

Уведомление

Icon
Error

5 Страницы«<345
Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий (LV)  
#41 Оставлено : 3 апреля 2020 г. 19:15:54(UTC)
Дмитрий (LV)

Статус: Участник

Группы: Участники
Зарегистрирован: 26.03.2020(UTC)
Сообщений: 25

Автор: Андрей * Перейти к цитате
Передать в Hash(base64(данные))


Вот это нешуточно помогло. Спасибо!
Offline sniker  
#42 Оставлено : 5 июня 2020 г. 21:09:32(UTC)
sniker

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Автор: Андрей * Перейти к цитате
Автор: Дмитрий (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)  | Причина: (при условии что ключ в неизвлекамом контейнере с пин кодом)

Offline Андрей *  
#43 Оставлено : 5 июня 2020 г. 21:31:54(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: 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) формируется успешно тем же сертификатом?

Техническую поддержку оказываем тут
Наша база знаний
Offline sniker  
#44 Оставлено : 5 июня 2020 г. 22:18:05(UTC)
sniker

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Цитата:
>При выполнении этого же скрипта в консоли
О каком "скрипте" речь?
Как инициализируете сертификат, которым выполняется подписание?

Запускаю один и тот же скрипт в браузере и в консоли и сравниваю результат.
Вот скрипт
Код:

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 участвует.



Offline Андрей *  
#45 Оставлено : 5 июня 2020 г. 22:23:55(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
это php, как Вы его запускаете в браузере?
код выполняется в php, с другими правами, не от пользователя в консоли.
Верно?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#46 Оставлено : 5 июня 2020 г. 22:27:30(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Цитата:
$sm = $sd->Sign($signer,"");


успешно выдаёт подпись в браузере?
Техническую поддержку оказываем тут
Наша база знаний
Offline sniker  
#47 Оставлено : 5 июня 2020 г. 22:35:55(UTC)
sniker

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз
Автор: Андрей * Перейти к цитате
Цитата:
$sm = $sd->Sign($signer,"");


успешно выдаёт подпись в браузере?


Успешно

Код:
$signature = $rawSignature->SignHash($hashedData, $cert);

Эту строчку только комментирую чтобы не прерывался скрипт на ошибке
Offline Андрей *  
#48 Оставлено : 5 июня 2020 г. 22:40:04(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: sniker Перейти к цитате

Есть ли возможность создать RAW подпись в PHP в неконсольном скрипте (при условии что ключ в неизвлекамом контейнере с пин кодом)?


Вариант:
запомнить пароль в конфигурационном файле.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
sniker оставлено 08.06.2020(UTC)
Offline Андрей *  
#49 Оставлено : 5 июня 2020 г. 22:42:26(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Сохранение паролей для контейнеров на Linux/UNIX


p.s.
SethashValue и SighHash - запрещенные методы, если используете - то необходимы тематические исследования
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
sniker оставлено 08.06.2020(UTC)
Offline sniker  
#50 Оставлено : 8 июня 2020 г. 18:48:25(UTC)
sniker

Статус: Активный участник

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

Сказал(а) «Спасибо»: 14 раз


Спасибо. Сохранение паролей для контейнеров позволило решить вопрос.

Цитата:

p.s.
SethashValue и SighHash - запрещенные методы, если используете - то необходимы тематические исследования


Код:
$hashedData->SetHashValue($hashedData->get_Value());

Эту строчку с SetHashValue вообще выкинул. Как оказалось, она не нужна.
Из "запрещённых" методов остался только SignHash (он, кстати есть в документации)

Цитата:
это php, как Вы его запускаете в браузере?
код выполняется в php, с другими правами, не от пользователя в консоли.
Верно?


Код выполняется на сервере Apache. Сервер выполняет код от другого пользователя, не консольного.
Если кто-то будет решать аналогичную задачу - надо не забыть проверить доступность контейнера с ключом для пользователя, от имени которого выполняется php скрипт на сервере (при обращении из браузера).

Еще раз спасибо.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
5 Страницы«<345
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.