За последние 24 часа нас посетили 22505 программистов и 1534 робота. Сейчас ищут 1198 программистов ...

Передать параметры в cryptcp

Тема в разделе "PHP для профи", создана пользователем SQLPowerUser, 12 июл 2018.

  1. SQLPowerUser

    SQLPowerUser Активный пользователь

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

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

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

    з.ы. Также строку cryptcp.exe -sign -der -dn "E=box@mail.ru" myfile.xml засунул в .bat-файл, успешно отрабатывает. Но вызов этого бат-файла из PHP вываливается с ошибкой, что я привел выше. Здесь только английские буквы, а батник сохранял и в OEM866 и в windows-1251, всё равно не работает.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @SQLPowerUser, не пробовали воспользоваться своим советом про экранирование кавычек для запуска в shell_exec под windows?
     
  3. SQLPowerUser

    SQLPowerUser Активный пользователь

    С нами с:
    11 дек 2017
    Сообщения:
    5
    Симпатии:
    1
  4. SQLPowerUser

    SQLPowerUser Активный пользователь

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

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