GnuPG не работает в PHP с nginx

Я думаю, что, возможно, я что-то упускаю, но я не вижу этого прямо сейчас. Я хочу создать простую форму, в которой пользователи могут автоматически шифровать сообщения между собой (формировать сообщение для пользователя2 -> зашифровать (сообщение) -> пользователь2 получить его и расшифровать). Я использую nginx, я установил gnupg, следуя их инструкциям, и добавил его в свой php.ini (теперь он показывает, что GnuPG включен с версией GPGME 1.4.3 и версией расширения 1.3.6). Я хочу использовать определенную связку ключей, расположенную по адресу /usr/share/nginx/.gnupg. Я попробовал следующий код:

$iterator = new gnupg_keylistiterator("developer");
foreach($iterator as $fingerprint => $userid) {
    echo $fingerprint." -> " . $userid . "\n";
}
var_dump($iterator);

И я просто получаю следующий ответ от var_dump:

объект(gnupg_keylistiterator)#1 (0) { }

Может быть, мой вопрос идиотский, но я никогда не использовал gnupg в php, и я хочу учиться, но я воняю со вчерашнего дня и не понимаю, почему это не работает... Спасибо за ваше время


person John McKellen    schedule 31.12.2015    source источник
comment
nginx предполагает, что вы используете php-fpm (эквивалент fcgi в php). Среда выполнения php сохраняется между запросами, поэтому, если вы измените настройки (файлы ini), вам придется перезапустить сервер (sudo service php-fpm restart и sudo service nginx restart), чтобы загрузить новые настройки.   -  person Elias Van Ootegem    schedule 31.12.2015
comment
Да, я знаю, что выполнил перезапуск службы sudo php5-fpm и перезапуск службы sudo nginx, я сделал эхо phpinfo (), и это показывает, что у меня включен gnupg, но он еще не работает для меня ... я не знаю, нужно ли мне указать связку ключей или что-то еще... @EllasVanOotegem   -  person John McKellen    schedule 31.12.2015
comment
Какие ini-файлы вы редактировали? Файлы, которые использует PHP-CLI, или все файлы сервера тоже? проверьте файлы ini, перечисленные на странице phpinfo();, проверьте разрешения (владение и т. д.) для файла gnupg. Также проверьте свои журналы. Если итерация экземпляра не привела к сообщению об ошибке Invalid or unitialized gnupg object, проблема кроется в другом. Глядя на исходник, это будет мой первый порт захода   -  person Elias Van Ootegem    schedule 31.12.2015
comment
Где вы применяли домашний каталог/папку для ключей GnuPG? Вы действительно импортировали ключ в этот брелок? GnuPG имеет наборы ключей для каждого (системного) пользователя и не делится содержимым между ними. Убедитесь, что права доступа к домашнему каталогу GnuPG установлены правильно для пользователя, работающего с PHP (правильно пользователя веб-сервера), GnuPG очень разборчив в вопросах разрешений.   -  person Jens Erat    schedule 31.12.2015
comment
Если я не ошибаюсь, я отредактировал все файлы сервера, в phpinfo() он показывает мне один путь к загруженному php.ini /etc/php5/fpm/php.ini, и этому файлу добавлено расширение. Я проверил свои журналы ошибок nginx, и там нет никаких ошибок @EllasVanOotegem   -  person John McKellen    schedule 31.12.2015
comment
Я не применял папку набора ключей GnuPG... как я могу это сделать? Я установил права доступа к моей текущей связке ключей, расположенной в /usr/share/nginx/.gnupg, для www-data и основной папки ~/.gnupg, но это не работает. Я полагаю, что это проблема. Не могли бы вы дать мне совет, чтобы исправить это? Спасибо @JensErat   -  person John McKellen    schedule 31.12.2015


Ответы (1)


Наиболее распространенная проблема заключается в том, что вы импортировали ключи в другую связку ключей, а затем искали ключи. GnuPG использует «домашнюю директорию GnuPG» для каждого (системного) пользователя, каждая из которых содержит отдельные наборы ключей. Если вы импортируете ключ как администратор или разработчик, вы импортируете ключ в свою собственную связку ключей, в то время как обычно веб-сервер, на котором выполняется приложение PHP, выполняется в другом пользовательском контексте и не находит этот ключ, в результате в пустом результате при перечислении ключей из PHP.

Вы можете установить это, настроив переменную среды перед инициализацией привязки GnuPG.

putenv("GNUPGHOME=/tmp");  // Set GnuPG home directory to the temp folder
$res = gnupg_init();       // Initialize GnuPG

Очевидно, что /tmp на самом деле не является разумным каталогом, в любом случае выберите что-нибудь, где ваше приложение хранит данные приложения. Это не должен быть каталог, доступный через HTTP.

В качестве альтернативы, gnupg_import($res, $pubkey) ключ перед его использованием (но это приведет к снижению производительности при импорте ключа).

person Jens Erat    schedule 31.12.2015
comment
Спасибо за ваш ответ. Я добавил в свой файл следующие строки: putenv("GNUPGHOME=/root/.gnup/pubring.gpg"); $res = gnupg_init(); И я изменил разрешение для своего открытого ключа, я снова запустил файл, но получаю тот же результат @JensErat - person John McKellen; 31.12.2015
comment
Никогда не предоставляйте другим пользователям доступ к корневому каталогу, даже на компьютерах для тестирования/разработки. Используйте другую папку, ограничьте разрешения (только пользователь веб-сервера должен иметь возможность читать и писать) и, наконец, обязательно импортируйте ключ (sudo -u www-data GNUPGHOME=/some/folder gpg --import key.pgp или аналогичный; или используйте импорт PHP, как описано выше). - person Jens Erat; 31.12.2015