Статус: Участник
  Группы: Участники
 Зарегистрирован: 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,492   Сказал «Спасибо»: 53 раз Поблагодарили: 803 раз в 742 постах
  
	 
	
     | 
    
        
            
		      
                Здравствуйте. 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,492   Сказал «Спасибо»: 53 раз Поблагодарили: 803 раз в 742 постах
  
	 
	
     | 
    
        
            
		      
                Нет, хранилище сертификатов и ключевой контейнер - это разные сущности. Упрощенно говоря, хранилище сертификатов содержит сертификаты и информацию о привязке к ключевым контейнерам этих сертификатов. Ключевой контейнер - сущность, содержащая закрытый ключ, и хранящаяся на ключевом носителе (на 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,492   Сказал «Спасибо»: 53 раз Поблагодарили: 803 раз в 742 постах
  
	 
	
     | 
    
        
            
		      
                Автор: 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