Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2018, 10:53   #1
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Вопрос PHP. Передать параметры в cryptcp

В командной строке Windows работает без ошибок
Код:
cryptcp.exe -sign -der -dn "CN=Иванов Петр, E=box@mail.ru" myfile.xml
Теперь надо заставить это работать из PHP. Пытался так (и через shell_exec тоже)
PHP код:
$cmd 'cryptcp.exe -sign -der -dn "CN=Иванов Петр, E=box@mail.ru" myfile.xml';
exec($cmd); 
Выдает
[ErrorCode: 0x2000012d]
Ошибка: Сертификаты не найдены.
Ругается на "CN=Иванов Петр, E=box@mail.ru"

Самое интересное, что вывести команду на экран через
PHP код:
print_r($cmd); 
и скопировать в буфер, то из командной строки Windows всё отработает как надо.

В сети нашел только одно решение, и то для Java. Цитирую:
вот так следует передавать параметры для вызова cryptcp что бы работало
Код:
String[] cmd = {"/opt/cprocsp/bin/amd64/cryptcp", "-decr", "-dn", "CN=CadesTest Gost User", "-nochain", "/tmp/out", "/tmp/out1"};
Process proc = rt.exec(cmd);
Осталось перевести этот блок на язык PHP... Передача массива параметров в shell_exec?
Буду признателен за любую помощь.
SQLPowerUser вне форума Ответить с цитированием
Старый 12.07.2018, 15:40   #2
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
По умолчанию

Вот такую строку
Код:
cryptcp.exe -sign -der -dn "E=box@mail.ru" myfile.xml
засунул в файл, который назвал кратко:
s.cmd, он успешно отрабатывает.

Но вызов этого бат-файла из PHP
PHP код:
$cmd 's.cmd';
shell_exec($cmd); 
вываливается с ошибкой, что я привел выше. Везде только английские буквы, а батник сохранял и в OEM866 и в windows-1251, всё равно не работает.
SQLPowerUser вне форума Ответить с цитированием
Старый 12.07.2018, 16:27   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я абсолютный ноль в этих сертификатах и электронном подписывании документов.

очевидно, что возникает ошибка - "Сертификат не найден"

посмотрите, на ответ Вам на форуме http://www.sql.ru/forum/1298439/php-...etry-v-cryptcp

Т.о. тому пользователю под которым Вы выполняете батник (запускаете cryptcp ) установленные сертификат виден, а тому пользователю - под которым запускается php - не виден.
Возможно, нужно установить сертификат для этого пользователя и всё наладится.

а возможно, что можно обойти проблему и по другому.

дальше я, возможно, скажу большую глупость, поэтому отнеситесь к моим словам очень настороженно!
1) почитайте доки. например, тут
http://pushorigin.ru/cryptopro/cryptcp
да, там линукс. но суть от этого не меняется.

вот так можно получить список установленных сертификатов
certmgr -list

а ключ
nochain - отменяет проверку цепочки сертификатов:
Код:
Цитата:
Подписание документа ЭЦП cryptcp -sign (КПС1) -nochain -pin pincode src.txt dest.txt.sig nochain - отменяет проверку цепочки сертификатов pin - пин-код КПС1 - критерий поиска сертификата Пример создания ЭЦП (по SHA1 Hash): cryptcp -sign -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -nochain -pin test test.txt test.txt.sig [ReturnCode: x] Описание Возвращаемый код завершения в баше $? 0 успешно 0 0x8010006b Введен неправильный PIN 107 0x2000012d Сертификат не найден 45 0x20000065 Не удалось открыть файл 101
так что, попробуйте посмотреть параметры сертификата и потом задать его напрямую в вашем скрипте на PHP.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2018, 12:24   #4
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Хорошо

Решил.
Действительно, PHP у тебя работает из-под пользователя, который твой сертификат не видит, так как сертификат установлен в твое личное пользовательское хранилище.
При установке сертификата, надо указать "Локальный компьютер", далее поместить сертификат в "Личное хранилище".
Если появится окно "Вставьте и выберите носитель для хранения контейнера закрытого ключа", то выбираем "Реестр".
А в диалоге "Задайте пароль для создаваемого контейнера" - оставить пустой пароль.

Всё. Теперь из PHP можно запускать хоть батник, или саму команду напрямую:
PHP код:
$cmd 'd:/crypto/cryptcp.5.0.x64.exe" -sign -der -mMy -dn "CN=Иванов Петр, E=email@mail.ru" file.xml > file.log';
shell_exec($cmd); 
Здесь -mMy как раз и означает "Локальная машина -> Личное хранилище", т.е. куда установлен сертификат.
-dn "CN=Иванов Петр, E=email@mail.ru" можно и упростить. Если адрес почты уникальный, и нигде в сертификатах не повторяется, то можно просто -dn "email@mail.ru"
Необязательный вывод результата команды в файл > file.log я сделал для контроля, мало ли что
SQLPowerUser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать параметры в функцию Sterben Помощь студентам 5 09.12.2015 02:14
Передать параметры R71MT Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 21.09.2015 12:21
Передать параметры в main Colobok Общие вопросы C/C++ 8 15.10.2014 14:58
PHP: как передать параметры через консоль? three_cats PHP 5 04.04.2013 20:10
Как передать в поток параметры? И как из потока параметры достать? Anekdot Общие вопросы Delphi 2 19.02.2010 22:40