Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 12.07.2018, 11:53   #1
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 140
Репутация: 182
Вопрос 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, 16:40   #2
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 140
Репутация: 182
По умолчанию

Вот такую строку
Код:

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, 17:27   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 23,886
Репутация: 5228
По умолчанию

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

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

посмотрите, на ответ Вам на форуме 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, 13:24   #4
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 140
Репутация: 182
Хорошо

Решил.
Действительно, 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать параметры в функцию Sterben Помощь студентам 5 09.12.2015 03:14
Передать параметры R71MT Assembler 10 21.09.2015 13: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 23:40


13:27.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru