#php #pgp #public-key-encryption
#php #pgp #шифрование с открытым ключом
Вопрос:
Если я выполню команду
gpg -e -r john@doe.com my_secret_file.txt
из командной строки unix оно работает нормально. Но когда я пытаюсь использовать ту же команду, используя PHP, это не работает :
$gpg = '/usr/bin/gpg';
$recipient = 'john@doe.com';
$secret_file = 'secret_file.txt';
echo shell_exec("$gpg -e -r $recipient $secret_file");
Пожалуйста, подскажите мне решение.
Комментарии:
1. Что означает «не работает»? Вы получаете сообщение об ошибке? Неожиданный результат? На экране появляются изображения единорогов?
2. Спасибо за ответ. Он должен создать имя файла как «secret_file.txt.pgp» в том же каталоге. он не создает
3. Вы запускаете php-скрипт из командной строки или с веб-страницы? Появляются ли какие-либо сообщения об ошибках, если вы запускаете его непосредственно из командной строки?
4. почему
$
вshell_exec("$gpg ...)
?5. вместо $gpg мы также можем использовать /usr/bin/gpg
Ответ №1:
Помимо проблем с разрешениями, как предполагает Demento, также возможно, что пользователь, от имени которого запускается скрипт, отличается от пользователя, работающего в командной строке, и у этого пользователя нет открытого ключа john@doe.com , поэтому он не может зашифровать файл для него. Итак … какой пользователь запускает этот скрипт? Предполагая, что это www-data
, если вы сделаете
carlos@server:~$ su - www-data
(insert www-data's password or do sudo su - www-data if sudo it's available)
www-data@server:~$ gpg --list-keys
видите ли вы ключ для john@doe.com ?
Ответ №2:
Я попробовал ваш пример на своей машине, и он работает так, как ожидалось. Результатом является дополнительный файл в локальном каталоге с именем secret_file.txt.gpg
, зашифрованный для john@doe.com
. Это подтверждает, что ваш реальный скрипт работает нормально и могут присутствовать другие проблемы.
Вы не увидите никаких выходных данных из самого скрипта, зашифрованный файл генерируется в тишине. echo
В последней строке вашей программы ничего не делает, потому что gpg не генерирует никаких выходных данных, если нет проблем. Вам следует взглянуть на руководство по shell_exec.
Если файл не создан на вашем компьютере, это может быть проблема с разрешениями. Если вы вызываете скрипт не из командной строки, а из веб-приложения, пользователю веб-сервера требуются соответствующие разрешения в файловой системе для создания нового файла.
Комментарии:
1. Спасибо. Я изменил почти все права доступа к файлам на 777. все еще это не работает.
2. Не могли бы вы, пожалуйста, рассказать. Какое разрешение у вас есть для .gnupg и всех файлов внутри .gnupg.».gnupg» находится внутри корневого каталога
3. Все файлы в каталоге «.gnupg» имеют «-rw——-«. Они принадлежат пользователю, который запускает PHP-скрипт. Вы говорите, что просматриваете корневой каталог — вы запускаете php-скрипт от имени root? Если вы запускаете его от имени другого пользователя, вы должны работать с каталогом «.gnupg» из его «домашнего» каталога.
Ответ №3:
Вы можете увидеть ошибку, используя следующую команду:
$output = exec("$gpg -e -r $recipient $secret_file 2>amp;1", $out);
echo "<pre>$output</pre>";
это поможет вам.
возможная проблема, на которую нужно обратить внимание:
- файл, который вы пытаетесь зашифровать, находится не по правильному пути..
- GnuPG пытается выполнить запись в каталог /root /.gnupg с «apache» в качестве пользователя. Очевидно, что это невозможно, если вы не измените права доступа к этому каталогу (не рекомендуется).
- у вас нет правильного доступа к корневому каталогу GnuPG (где бы он ни находился)
- у вас нет записи в каталоге, apache пытается создать новый файл..
Дайте мне знать, что выводит ваш код, и я смогу помочь. Я уже сталкивался с этим, это утомительно.