Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день. Мне требуется подписывать данные по гост 34.10 -2012. libphpcades поставил по инструкции http://cpdn.cryptopro.ru...tent/cades/phpcades.htmlИмеется сертификат на сервере. он успешно устанавливается по команде sudo /opt/cprocsp/bin/amd64/certmgr -inst -store uMy -file cert.cer по команде sudo /opt/cprocsp/bin/amd64/certmgr -list -store uMy он есть но вот так ничего не находит Цитата:$store = new CPStore(); $store->Open(CURRENT_USER_STORE, "My", STORE_OPEN_READ_ONLY);
$certs = $store->get_Certificates(); var_dump($certs); Цитата:object(CPCertificates)#2 (0) { } Не помогает и пример использования, с поиском моего сертификата http://cpdn.cryptopro.ru...tent/cades/phpcades.html через CERTIFICATE_FIND_SHA1_HASH Цитата:<?php //Вспомогательные функции предварительной инициализации 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); $certs = $store->get_Certificates(); return $certs;
}
function SetupCertificate($location, $name, $mode, $find_type, $query, $valid_only, $number) { $certs = SetupCertificates($location, $name, $mode); if(!is_null($find_type)) { $certs = $certs->Find($find_type, $query, $valid_only); return $certs->Item($number); } else { $cert = $certs->Item($number); return $cert; } }
$content = "test content"; $tsp_addres = "http://testca.cryptopro.ru/tsp/tsp.srf"; $cert = SetupCertificate(CURRENT_USER_STORE, "My", STORE_OPEN_READ_ONLY, CERTIFICATE_FIND_SHA1_HASH, "42ee7ec1137ecd4468daa7caff0e345f86da346a", 0, 1);
if (!$cert) { printf("Certificate not found\n"); return; }
$signer = new CPSigner(); $signer->set_TSAAddress($tsp_addres); $signer->set_Certificate($cert);
$sd = new CPSignedData(); $sd->set_Content($content);
$sm = $sd->Sign($signer, 0, STRING_TO_UCS2LE); printf("Signature is:\n"); printf($sm); printf("\n"); $sd->Verify($sm, 0, VERIFY_SIGNATURE_ONLY); printf("Verify OK\n");
?> Ответ Цитата:PHP Fatal error: Uncaught exception 'Exception' with message 'Internal error. (0x8009200B)' in /var/www/html/info.php:56 Stack trace: #0 /var/www/html/info.php(56): CPSignedData->Sign(Object(CPSigner), 0, 0) #1 {main} thrown in /var/www/html/info.php on line 56
|
 1 пользователь поблагодарил eisy за этот пост.
|
ndv27 оставлено 24.11.2023(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,470   Сказал «Спасибо»: 53 раз Поблагодарили: 798 раз в 737 постах
|
Здравствуйте. 1) Для возможности создания подписи необходимо устанавливать сертификат с привязкой к соответствующему ключевому контейнеру. Если сертификат есть в ключевом контейнере, то сделать это можно, например, следующей командой: Код:/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov
Если сертификата нет внутри ключевого контейнера, то сначала нужно вывести имя нужного ключевого контейнера командой: Код:/opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn
А затем уже установить сертификат, указав файл сертификата и ключевой контейнер в команде: Код:/opt/cprocsp/bin/amd64/certmgr -inst -cont 'contname' -file cert.cer
где contname - имя нужного ключевого контейнера из вывода предыдущей команды (в команде нужно взять в одинарные кавычки). Все команды требуется запускать от нужного пользователя. 2) Установка сертификата должна выполняться от того пользователя, под которым запускается скрипт. 3) Какая у Вас конечная цель? Какую именно подпись нужно создать? Возможно, phphcades вообще такое не умеет или можно сделать это проще (через вызов из PHP-кода консольных утилиты). |
|
 1 пользователь поблагодарил Александр Лавник за этот пост.
|
eisy оставлено 09.07.2020(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Александр Лавник  1-2. Спасибо, контейнер и хранилище (store) это одно и то же? в коде ведь мы указываем хранилище, а не контейнер. SetupCertificate(CURRENT_USER_STORE, "My") ? вот что вернуло /opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn не очень понял где здесь контейнер? Цитата: CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX. AcquireContext: OK. HCRYPTPROV: 9140867 OK. Total: SYS: 0.010 sec USR: 0.030 sec UTC: 0.210 sec [ErrorCode: 0x00000000]
3. Мне необходимо подписывать набор данных в base64 для работы с сервисом приема. Сервиса приема с ИС ООВО Цитата:Verify signarure представляет закодированную в Base64 ЭЦП по ГОСТ 34.10-2012
Signarure представляет собой подписанный хэш данных, кодированный в base64. Расчёт хеш-суммы, 256 бит - ГОСТ Р 34.11-2012. Расчет подписи, 256 бит - ГОСТ Р 34.10-2012. Подпись передается без контейнера. Подписываемая последовательность представляет собой конкатенацию части Header в Base64 и Payload в Base64 разделенных символом точка. Разделитель "." входит в последовательность. Для JWT отправляемых в метод "/api/token/info" "HeaderBase64..signatureBase64" "." входит в последовательность пример : "HeaderBase64." . Также, следуют учитывать особенность работы ГОСТ алгоритмов: При использовании API КриптоПро, для формирования хеша используется функция CryptHashData, после формирования подписи функцией CryptSignHash, полученный набор байт следует инвертировать перед кодированием в base64. Т.е. в base64 кодируется массив байт "задом-наперед" от полученного функцией CryptSignHash. насколько я вижу из описания COM обьектов, нужный мне алгоритм есть? https://cpdn.cryptopro.r...33fe4815d569f2ca026.htmlCADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC Отредактировано пользователем 9 июля 2020 г. 17:09:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,470   Сказал «Спасибо»: 53 раз Поблагодарили: 798 раз в 737 постах
|
Нет, хранилище сертификатов и ключевой контейнер - это разные сущности. Упрощенно говоря, хранилище сертификатов содержит сертификаты и информацию о привязке к ключевым контейнерам этих сертификатов. Ключевой контейнер - сущность, содержащая закрытый ключ, и хранящаяся на ключевом носителе (на Linux это: жесткий диск, флеш-накопитель, USB-токен, смарт-карта). По созданию нужной Вам подписи (сырая raw подпись 64 байта) Вы можете или использовать вызов утилиты csptest (исходные данные и подпись во внешних файлах) или при использовании phpcades сделать по аналогии с примером по ссылке. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Александр Лавник  Нет, хранилище сертификатов и ключевой контейнер - это разные сущности. Упрощенно говоря, хранилище сертификатов содержит сертификаты и информацию о привязке к ключевым контейнерам этих сертификатов. Ключевой контейнер - сущность, содержащая закрытый ключ, и хранящаяся на ключевом носителе (на Linux это: жесткий диск, флеш-накопитель, USB-токен, смарт-карта). По созданию нужной Вам подписи (сырая raw подпись 64 байта) Вы можете или использовать вызов утилиты csptest (исходные данные и подпись во внешних файлах) или при использовании phpcades сделать по аналогии с примером по ссылке. Не очень понял, как создать ключевой контейнер на сервере команда /opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn возвращает Цитата: CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX. AcquireContext: OK. HCRYPTPROV: 9140867 OK. Total: SYS: 0.010 sec USR: 0.030 sec UTC: 0.210 sec [ErrorCode: 0x00000000]
я так понимаю контейнеров у меня нет UPD: Нашел данную проблему для Мак https://www.cryptopro.ru...&m=112348#post112348так понимаю тоже переносить в /var/opt/cprocsp/keys ? у меня там сейчас две папки с пользователями Отредактировано пользователем 9 июля 2020 г. 21:35:30(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,470   Сказал «Спасибо»: 53 раз Поблагодарили: 798 раз в 737 постах
|
Автор: eisy  Автор: Александр Лавник  Нет, хранилище сертификатов и ключевой контейнер - это разные сущности. Упрощенно говоря, хранилище сертификатов содержит сертификаты и информацию о привязке к ключевым контейнерам этих сертификатов. Ключевой контейнер - сущность, содержащая закрытый ключ, и хранящаяся на ключевом носителе (на Linux это: жесткий диск, флеш-накопитель, USB-токен, смарт-карта). По созданию нужной Вам подписи (сырая raw подпись 64 байта) Вы можете или использовать вызов утилиты csptest (исходные данные и подпись во внешних файлах) или при использовании phpcades сделать по аналогии с примером по ссылке. Не очень понял, как создать ключевой контейнер на сервере команда /opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn возвращает Цитата: CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX. AcquireContext: OK. HCRYPTPROV: 9140867 OK. Total: SYS: 0.010 sec USR: 0.030 sec UTC: 0.210 sec [ErrorCode: 0x00000000]
я так понимаю контейнеров у меня нет UPD: Нашел данную проблему для Мак https://www.cryptopro.ru...&m=112348#post112348так понимаю тоже переносить в /var/opt/cprocsp/keys ? у меня там сейчас две папки с пользователями Да, на Linux ключевые контейнеры на жестком диске должны находиться в той же директории, что и на macOS (как и на всех *nix). Если у Вас есть ключевой контейнер для Вашего личного сертификата, то Вы можете перенести его в соответствующую директорию на жестком диске для нужного пользователя. Затем установить сертификата с привязкой к ключевому контейнеру, как описано ранее. |
|
 1 пользователь поблагодарил Александр Лавник за этот пост.
|
eisy оставлено 11.07.2020(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Для истории может кому то пригодится Успешно установил сертификат в ключевой контейнер (перенеся папку с 6 файлами .key в /var/opt/cprocsp/keys/ваш_пользователь) далее команда Цитата:/opt/cprocsp/bin/amd64/csptest -absorb -certs -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" Смотрим полное название нашего контейнера Цитата: /opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn P.S. оно в виде Цитата:\\.\HDIMAGE\te-85627756-e110-4860-ac2c-4afc5e22a2cf Устанавливаем наш сертификат в него Потребуется пароль от контейнера Цитата:/opt/cprocsp/bin/amd64/certmgr -inst -store uMy -cont '\\.\HDIMAGE\te-85627756-e110-4860-ac2c-4afc5e22a2cf' -file certificate.cer
Затем при попытке тестовой подписи может появиться Цитата:PHP Fatal error: Uncaught exception 'Exception' with message 'A certificate chain processed correctly, but terminated in a root certificate which is not trusted by the trust provider (0x800B0109)' in /var/www/html/info.php:56 Stack trace: #0 /var/www/html/info.php(56): CPSignedData->Sign(Object(CPSigner), 0, 0) #1 {main} thrown in /var/www/html/info.php on line 56 поставил отсюда сертификаты для хранилища root успешно http://testca2012.cryptopro.ru/ui/Цитата:/opt/cprocsp/bin/amd64/certmgr -inst -store uroot -file rootca.cer /opt/cprocsp/bin/amd64/certmgr -inst -store uroot -file subca.cer и соответственно проверяем чтоб запрос шел на нужный нам путь Цитата:http://testca2012.cryptopro.ru/tsp/tsp.srf сейчас буду разбираться как использовать нужный мне алгоритм Расчёт хеш-суммы, 256 бит - ГОСТ Р 34.11-2012. Расчет подписи, 256 бит - ГОСТ Р 34.10-2012. PS. Прописываем чтоб не требовался ключ Цитата:/opt/cprocsp/sbin/amd64/cpconfig -ini "\\LOCAL\\KeyDevices\\passwords\\HDIMAGE\\te-85627.000" -add string passwd ЦИФРЫ_КЛЮЧА Отредактировано пользователем 13 июля 2020 г. 16:29:06(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Всё вроде победил, Цитата:<?php
//Вспомогательные функции предварительной инициализации 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); $certs = $store->get_Certificates(); return $certs;
}
function SetupCertificate($location, $name, $mode, $find_type, $query, $valid_only, $number) { $certs = SetupCertificates($location, $name, $mode);
if(!is_null($find_type)) { $certs = $certs->Find($find_type, $query, $valid_only); return $certs->Item($number); } else { $cert = $certs->Item($number); return $cert; } }
function CreateSignature($oCertificate, $oHashedData) {
$signer = new CPRawSignature(); $sRawSignature = $signer->SignHash($oHashedData, $oCertificate);
return $sRawSignature; }
$content = "test content"; $tsp_addres = "http://testca2012.cryptopro.ru/tsp/tsp.srf"; $cert = SetupCertificate(2, "My", STORE_OPEN_READ_ONLY, CERTIFICATE_FIND_SHA1_HASH, "5ff6a0ad2a3431c4a72007d68e2bac5dc4c2c7b9", 0, 1);
if (!$cert) { printf("Certificate not found\n"); return; }
$hd = new CPHashedData();
$hd->set_Algorithm(CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);
$hd->Hash($content);
$hash_val = CreateSignature($cert,$hd); var_dump($hash_val); die(); Так возвращает подпись, просьба знатоков подсказать правильно ли я интерпретировал Цитата:Расчёт хеш-суммы, 256 бит - ГОСТ Р 34.11-2012. Расчет подписи, 256 бит - ГОСТ Р 34.10-2012. Сам сертификат вот Цитата:Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит PublicKey Algorithm : ГОСТ Р 34.10-2012 (512 bits) Not valid before : 10/07/2020 09:29:40 UTC Not valid after : 10/10/2020 09:39:40 UTC PrivateKey Link : Yes Container : HDIMAGE\\te-85627.000\7800 Provider Name : Crypto-Pro GOST R 34.10-2012 KC1 CSP Отредактировано пользователем 13 июля 2020 г. 16:36:09(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close