PGP-шифрование с PHP

#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 пытается создать новый файл..

Дайте мне знать, что выводит ваш код, и я смогу помочь. Я уже сталкивался с этим, это утомительно.