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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline alexusmai  
#1 Оставлено : 12 августа 2019 г. 17:55:39(UTC)
alexusmai

Статус: Новичок

Группы: Участники
Зарегистрирован: 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 - как я понимаю это преобразование в нижний регистр.. из названия.

Надеюсь на помощь.
Спасибо.
Offline two_oceans  
#2 Оставлено : 13 августа 2019 г. 6:03:16(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
alexusmai оставлено 13.08.2019(UTC)
Offline alexusmai  
#3 Оставлено : 25 сентября 2019 г. 10:01:20(UTC)
alexusmai

Статус: Новичок

Группы: Участники
Зарегистрирован: 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)
Offline Андрей Писарев  
#4 Оставлено : 25 сентября 2019 г. 10:29:30(UTC)
Андрей *

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

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

Сказал «Спасибо»: 574 раз
Поблагодарили: 2303 раз в 1804 постах
Здравствуйте.

Утилита работает от другого пользователя?

0x800B010A: Не удается построить цепочку сертификатов для доверенного корневого центра
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
alexusmai оставлено 25.09.2019(UTC)
Offline Андрей Писарев  
#5 Оставлено : 25 сентября 2019 г. 10:34:00(UTC)
Андрей *

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

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

Сказал «Спасибо»: 574 раз
Поблагодарили: 2303 раз в 1804 постах
Установите на сервере в доверенные корневые - этот сертификат УЦ, который выдал сертификат для CN = stage-***.


Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
alexusmai оставлено 25.09.2019(UTC)
Offline alexusmai  
#6 Оставлено : 25 сентября 2019 г. 10:53:25(UTC)
alexusmai

Статус: Новичок

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

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

Утилита работает от другого пользователя?


Нет, пользователь один.

Цитата:

Установите на сервере в доверенные корневые - этот сертификат УЦ, который выдал сертификат для CN = stage-***.


Да, это помогло, спасибо!

А в дальнейшем, когда будем использовать реальные сертификаты - мне нужно будет у подписчика узнавать и просить сертификат их УЦ?

И еще вопрос - для выполнения выше озвученных действий (подписание и проверка подписи) - нам нужно будет приобрести только КриптоПро CSP 4.0(серверная версия под линукс) и сам сертификат, больше ничего не требуется, правильно ?
Offline Андрей Писарев  
#7 Оставлено : 25 сентября 2019 г. 11:05:27(UTC)
Андрей *

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

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

Сказал «Спасибо»: 574 раз
Поблагодарили: 2303 раз в 1804 постах
Да
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
alexusmai оставлено 25.09.2019(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.