Статус: Участник
Группы: Участники
Зарегистрирован: 28.01.2021(UTC) Сообщений: 19 Откуда: Новосибирск Сказал(а) «Спасибо»: 2 раз Поблагодарили: 3 раз в 3 постах
|
Автор: error0x003e
по последнему сообщению приведите полный код.
Санчир, я уже писал про это, но еще раз повторюсь... Я полный ноль в понимании всего цикла работы систем криптозащиты и сертификатов. Я веб-программист (бэкэндер), которому выпала задача реализовать механизм шифрации между площадкой и банком. Вот, пытаюсь вникнуть и разобраться. Для меня это вообще полный тёмный лес: Удостоверяющий центр, Корневой сертификат, Промежуточный, Штампы времени, хранилища, ключи, подписи, Кадэс, не Кадэс - это просто буквы...Вы пишите - дело в CDP. Честно? Я в усы не ... что это такое и что мне нужно скачать/установить и куда установить, чтобы попытаться исправить ситуацию. У вас вообще есть какая-то платная услуга по тех. поддержке тет-а-тет вне форума? Если есть, сообщите, без проблем оплатим, спишемся, решим и закроем вопрос. Вы просите код, вот, пожалуйста: Код:
$hash = 'hello world';
try {
$methods = new \CPStore();
$methods->Open(CURRENT_USER_STORE, 'My', STORE_OPEN_READ_ONLY);
$certificates = $methods->get_Certificates();
$certs = $certificates->Find(CERTIFICATE_FIND_SUBJECT_NAME, 'jokertest', 0);
if (is_string($certs)) {
$cert = $certs;
} else {
$cert = $certs->Item(1);
}
$signer = new \CPSigner();
$signer->set_TSAAddress('http://testgost2012.cryptopro.ru/ocsp2012gst/ocsp.srf');
$signer->set_KeyPin('12345');
$signer->set_Certificate($cert);
$sd = new \CPSignedData();
$sd->set_ContentEncoding(BASE64_TO_BINARY);
$sd->set_Content(base64_encode($hash));
$sm = $sd->SignCades($signer, CADES_BES, true, 0);
echo $sm; // Тут я реально вижу SignedMessage в окне браузера
} catch (\Exception $e) {
echo $e->getCode();
}
// Теперь пытаюсь проверить
try{
$sign = preg_replace('/[[:^print:]]/','', $sm );
$sd = new \CPSignedData();
$sd->set_ContentEncoding(BASE64_TO_BINARY);
$sd->set_Content(base64_encode($hash));
$sd->VerifyCades($sign, CADES_BES, 1); // Вот это не срабатывает!
} catch (\Exception $e) {
echo $e->getMessage(); // А вот тут я получаю текст Invalid signature!
}
Причем еще раз повторюсь, что в консоле от пользователя www-data всё успешно поверяется. Привожу полный список команд: Код:
# Создали пустой файл
sudo -u www-data touch file.txt
# Подписываю
sudo -u www-data cryptcp -signf -dn CN=jokertest ./file.txt
# Получаю результат
Certificate chains are checked.
Folder './':
./file.txt... Crypto-Pro GOST R 34.10-2012 KC1 CSP requests container password
Type password:
Signing the data...
Signed message is created.
[ErrorCode: 0x00000000]
# Проверяю
sudo -u www-data cryptcp -verify -detached -cadesbes ./file.txt
# Получаю в ответ
The following certificate will be used:
RDN:joker@joker.ru, jokertest
Valid from 01.02.2021 08:03:45 to 01.05.2021 08:13:45
Certificate chains are checked.
Folder './':
./file.txt... Signature verifying...
Signer: joker@joker.ru, jokertest
Signature's verified.
[ErrorCode: 0x00000000]
Единственная разница между консолью и браузером в том, что в консоли я создаю и проверяю подписанный ФАЙЛ, а в браузере просто строку текста. Может в этом проблема какая-то? Отредактировано пользователем 2 февраля 2021 г. 15:09:46(UTC)
| Причина: Не указана
|