Статус: Новичок
Группы: Участники
Зарегистрирован: 12.08.2019(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 4 раз
|
День добрый. Стоит задача подписания запросов к АПИ банка. Была скомпилирована либа для PHP, установлен КриптоПро CSP 4, вроде удалось заставить работать, правда с трудом.. пример из документации срабатывает, подпись создается и верификация проходит успешно. Из доков от банка: Цитата: Алгоритм формирования подписи для запроса: 1. В зависимости от типа запроса, формируется своя уникальная строка, которая будет подписана. 2. Вычисляется хэш строки по алгоритму sha-256. 3. При помощи утилиты cryptcp из пакета cryptopro, создается отделенная (detached) подпись для хэша строки (см. создание подписи в КриптоПро). 4. Данные файла подписи добавляются к запросу в заголовок Digital-Sign.
Создание подписи в КриптоПро: С помощью КриптоПро можно создать только подпись файла. Поэтому полученный в п.2 хэш нужно записать в файл на файловой системе, и создавать подпись этого файла. Команда для создания отделенной подписи (MacOS, Linux):
cryptcp -sign $FILE_PATH $FILE_PATH.sgn -cert -detached -nochain -thumbprint $PLATFORM_THUMBPRINT -pin $CONTAINER_PASSWORD
Содержимое файла уже будет base64-encoded - его нужно добавить к запросу в заголовок Digital_Sign.
Как мне из указанной выше консольной команды сделать запрос к КриптоПро на PHP? Сейчас за это отвечает эта часть из примера: Цитата: $sd = new CPSignedData(); $sd->set_Content($content);
$sm = $sd->Sign($signer, 0, STRING_TO_UCS2LE);
set_Content - сюда передаем контент, по идее можно никакой файл не создавать а сразу передать сюда полученный хэш..? Или все таки нужно будет создать файл записать туда полученный хэш, а затем подписывать его? Sign - на выходе получаем base64-encoded строку, и я сразу могу ее использовать, правильно? Или тут еще нужно передать нужные параметры? Например STRING_TO_UCS2LE - как я понимаю это преобразование в нижний регистр.. из названия. Надеюсь на помощь. Спасибо.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Добрый день. Алгоритм какой-то мутный, так что точно посоветовать наверно не смогу. Судя по командной строке хэш действительно передается как контент и файл можно не писать. Если получается результат Base64, то конечно можно попробовать использовать "как есть". К слову, похоже что Base64 должен быть без переводов строки иначе заголовок нарушится. Однако не забывайте что подформатов Cades множество и результат возвращенным расширением может быть немного другого формата чем результат командной строки и не подходить. В этом случае придется все же записать в файл и выполнить как описано, потом подбирать параметры чтобы результат был такой же по формату. Автор: alexusmai  Например STRING_TO_UCS2LE - как я понимаю это преобразование в нижний регистр.. из названия. Это конечно неправильное понимание, так как в UCS2LE часть UCS2 это другое название Юникода, а часть LE уточняет что многобайтные символы идут в порядке little_endian (стандарт для Intel x86 совместимых платформ). Другими словами это преобразование кодировки строки в Юникод, а не в нижний регистр. Отредактировано пользователем 13 августа 2019 г. 6:12:17(UTC)
| Причина: Не указана
|
 1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 12.08.2019(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 4 раз
|
Подпись запроса сделать получилось, проверку моя подпись на другой стороне проходит. Код получился такой: Цитата: $methods = new \CPStore(); $methods->Open(CURRENT_USER_STORE, 'my', STORE_OPEN_READ_ONLY);
/** @var CPCertificates $certificates */ $certificates = $methods->get_Certificates();
/** @var CPCertificates $certs */ $certs = $certificates->Find(CERTIFICATE_FIND_SUBJECT_NAME, 'test', 0); if (is_string($certs)) { $cert = $certs; } else { $cert = $certs->Item(1); }
/** @var CPSigner $signer */ $signer = new \CPSigner(); $signer->set_TSAAddress('http://testca.cryptopro.ru/tsp/tsp.srf'); $signer->set_Certificate($cert);
/** @var CPSignedData $sd */ $sd = new \CPSignedData();
$content = base64_encode($hash); $sd->set_ContentEncoding(BASE64_TO_BINARY); $sd->set_Content($content);
$sm = $sd->SignCades($signer, CADES_BES, true, 0);
return preg_replace('/[[:^print:]]/', '', $sm);
Теперь появилась проблема в проверке подписи (ко мне также приходят подписанные запросы). Проверить подпись получается только с помощью консольной команды, для этого я создаю два файла - один файл с данными(test.txt), а второй с подписью (test.txt.sgn) Цитата: exec("/opt/cprocsp/bin/amd64/cryptcp -vsignf /some-path/test.txt -dir /some-path -detached -nochain", $data);
// В результате получаю что-то типа ... 8 => "Signature's verified." 9 => "[ErrorCode: 0x00000000]"
А вот на PHP подпись проверить никак не получается, уже наверное все варианты что нашел на форуме перепробовал.. получаю только ошибки. Цитата: $data = 'e131c42bdaaa8acfeb2f9a45050eec2f337da1fa6d53d26ab8636d374ef45125'; $sgn ='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';
/** @var CPSignedData $sd */ $sd = new \CPSignedData();
$content = base64_encode(preg_replace('/[[:^print:]]/', '', $data)); $sd->set_ContentEncoding(BASE64_TO_BINARY); $sd->set_Content($content);
$sd->VerifyCades(preg_replace('/[[:^print:]]/', '', $sgn), CADES_BES, 1);
// Получаю ошибку - Internal error. (0x800B010A)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,734   Сказал «Спасибо»: 574 раз Поблагодарили: 2304 раз в 1805 постах
|
Здравствуйте.
Утилита работает от другого пользователя?
0x800B010A: Не удается построить цепочку сертификатов для доверенного корневого центра
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,734   Сказал «Спасибо»: 574 раз Поблагодарили: 2304 раз в 1805 постах
|
Установите на сервере в доверенные корневые - этот сертификат УЦ, который выдал сертификат для CN = stage-***. |
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 12.08.2019(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 4 раз
|
Цитата: Утилита работает от другого пользователя?
Нет, пользователь один. Цитата: Установите на сервере в доверенные корневые - этот сертификат УЦ, который выдал сертификат для CN = stage-***.
Да, это помогло, спасибо! А в дальнейшем, когда будем использовать реальные сертификаты - мне нужно будет у подписчика узнавать и просить сертификат их УЦ? И еще вопрос - для выполнения выше озвученных действий (подписание и проверка подписи) - нам нужно будет приобрести только КриптоПро CSP 4.0(серверная версия под линукс) и сам сертификат, больше ничего не требуется, правильно ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,734   Сказал «Спасибо»: 574 раз Поблагодарили: 2304 раз в 1805 постах
|
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close