В командной строке Windows работает без ошибок Код (Text): cryptcp.exe -sign -der -dn "E=box@mail.ru" myfile.xml Теперь надо заставить это работать из PHP. Пытался так (и через shell_exec тоже) PHP: $cmd = 'cryptcp.exe -sign -der -dn "E=box@mail.ru" myfile.xml'; exec($cmd); Выдает [ErrorCode: 0x2000012d] Ошибка: Сертификаты не найдены. Ругается на "E=box@mail.ru" Самое интересное, что если вывести команду на экран через PHP: print_r($cmd); и скопировать в буфер, то из командной строки Windows всё отработает как надо. В сети нашел только одно решение, и то для Java. Цитирую: вот так следует передавать параметры для вызова cryptcp что бы работало Код (Text): 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? Буду признателен за любую помощь. з.ы. Также строку cryptcp.exe -sign -der -dn "E=box@mail.ru" myfile.xml засунул в .bat-файл, успешно отрабатывает. Но вызов этого бат-файла из PHP вываливается с ошибкой, что я привел выше. Здесь только английские буквы, а батник сохранял и в OEM866 и в windows-1251, всё равно не работает.
@SQLPowerUser, не пробовали воспользоваться своим советом про экранирование кавычек для запуска в shell_exec под windows?
Решил. Действительно, 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 я сделал для контроля, мало ли что