2014-04-01 3 views
3

Я пытаюсь расшифровать файл gpg с помощью закрытого ключа, используя функции php GnuPG. Но, пытаясь расшифровать его, похоже, что php просто висит или навсегда заканчивается. Я пытаюсь расшифровать простой тестовый файл с одним предложением.php GnuPG decrypt times out

Я могу дешифровать файл в автономном режиме (например, с помощью GNU Privacy Assistant).

Я думаю, что я настроил разрешение okay-

-bash-4,1 $ gpgconf --list-каталоги

/home/jdoe/.gnupg/gpg.conf, завивка : 0770
/home/jdoe/.gnupg/pubring.gpg, перманент: 0770
/home/jdoe/.gnupg/secring.gpg, завивка: 0660
/home/jdoe/.gnupg/private-keys -v1.d, perms: 0700
/home/jdoe/.gnupg/ra ndom_seed, перманент: 0600
/home/jdoe/.gnupg/pubring.gpg, завивка: 0770
/home/jdoe/.gnupg/trustdb.gpg, завивка: 0770

Но, если Я пишу новый файл в «/home/jdoe/.gnupg/», он имеет 644 разрешения (не уверен, если это имеет значение).

/home/jdoe/.gnupg/xxxtest.txt.gpg, перманент: 0644

Я (думаю) я успешно импортировал закрытого ключа. Ниже приведена KeyInfo. Соответствующий ключ имеет отпечаток пальца и идентификатор ключа с 888 (я заменил их фактические значения на 888). Я включаю все ключи в случае, если это релевантно (я заменил не относящуюся к делу отпечаток пальца/ключевую информацию с помощью 777).

$ info = $ gpg-> keyinfo (''); echo 'Ключевые данные:'. print_r ($ info, true);

Array ([0] => Array ([отключено] => [с истекшим сроком] => [отозвана] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [UIDs] => Array ([0] => Array ([name] => ApacheTest [комментарий] => Тестирование [email] => apache @ localhost [uid] => ApacheTest (Тестирование) [отменено] => [недействительно] =>)) [subkeys] => Array ([0] => Array ([fingerprint] => 777 [keyid] => 777 [timestamp] => 1203433839 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => [can_sign] => 1 [disabled] => [expired] => [revoked] =>) [1] => Array ([fingerprint] => 777 [keyid] => 777 [timestamp] = > 1203433840 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => 1 [can_sign] => [disabled] => [expired] => [revoked] =>))) [1] => Array ([disabled] => [expired] => [revoked] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [uids] => Array ([0] => Массив ([name] => John Doe [комментарий] => [email] => [email protected] [uid] => John Doe [отменено] => [invalid] =>)) [subkeys] => Array ([0] => Array ([fingerprint] => 888 [keyid] => 888 [timestamp] = > 1224013510 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => [can_sign] => 1 [disabled] => [expired] => [revoked] =>) [1] => Массив ([отпечаток пальца] => 777 [keyid] => 777 [timestamp] => 1224013510 [expires] => 0 [is_secret] => [недействительный] => [can_encrypt] => 1 [can_sign] => [disabled] => [истекло] => [отозвана] =>))))

Моя проблема, при попытке расшифровать с кодом ниже, он выглядит как PHP просто висит или принимая навсегда, чтобы закончить (превышение чем max_execution_time в реальности, но не показывает сообщение об ошибке).

$gpg = new gnupg(); 
$gpg->seterrormode(gnupg::ERROR_EXCEPTION); 
putenv("GNUPGHOME=/home/jdoe/.gnupg"); 

$encryptedContent = file_get_contents($filePathAndName); 

$pw = []; 
$fingerprint = []; 
if($gpg->adddecryptkey($recipient, $pw)) { 
    echo "Add decrypt key returned true."; 
} else { 
    echo "Could not add decrypt key. GPG error: " . $gpg -> geterror(); 
} 

//I know we get to this spot 
try { 
    $plaintext = $gpg->decrypt($encryptedContent); 
    echo '<pre>' . $plaintext . '</pre>'; 
} catch (Exception $e) { 
    die('ERROR: ' . $e->getMessage()); 
} 

Любые идеи о том, почему это не работает? Спасибо.

============== Выход из Ls -LA /home/jdoe/.gnupg


drwxrwx --- 3 JDoe апаша 4096 31 Mar 23: 45.
drwxr-хт-х 19 JDoe корень 12288 1 апреля 9:39 ..
-rwxrwx --- 1 JDoe апаша 9188 28 марта 15:36 gpg.conf
drwx ------ 2 апач апач 4096 Mar 31 21:26 private-keys-v1.d
-rwxrwx --- 1 apache apache 2479 Mar 31 21:26 pubring.gpg
-rwxrwx --- 1 apache apache 913 31 марта 20:28 pubring.gpg ~
-rw ------- 1 апач апач 600 31 марта 20:32 RANDOM_SEED
-rw-RW ---- 1 JDoe апаша 1978 28 марта 21:05 secring.gpg
-rwxrwx-- - 1 apache apache 10 Mar 31 20:28 test.txt
-rwxrwx --- 1 j Самка апач 1200 31 марта 20:28 trustdb.gpg
-rw-р - r-- 1 апач апач 347 31 марта 23:30 xxxtest.txt.gpg

Вы можете расшифровать файл с помощью команды и сколько времени это займет?

вернусь к вам с этой информацией (работа с SA на это, у меня есть только FTP доступа к машине).

Попробуйте увеличить отчетность об ошибках PHP?

Уже сделано ... это просто раскручивает (который я предполагаю, что означает, что он раз вне, из exit_on_timeout выключен). Я пробовал это с 10-минутным и 30-секундным таймаутом. Результат тот же. Дешифрование тестового файла составляет менее 100 символов.

Вы можете попробовать не устанавливать домашний каталог, но импортировать ключ с помощью импорта ($ keydata)

Тот же результат

Пробовал установив другой домашний каталог?

Я создал /home/jdoe/.gnupg/temp, CHMOD права доступа 777. Я установить это в качестве домашнего каталога для GPG. Я попытался импортировать закрытый ключ. Но $ gpg-> keyinfo ('') ничего не возвращает. На этот раз при попытке $ gpg-> adddecryptkey он не справляется с этой ошибкой - «Исключить исключение« Исключение »с сообщением« get_key failed ».

Благодаря

+0

Пожалуйста, добавьте вывод 'ls -la/home/jdoe/.gnupg'. Можете ли вы расшифровать файл из командной строки и сколько времени потребуется? Вы пытались увеличить отчетность об ошибках PHP? –

+0

Я добавил эту информацию выше. Очень признателен. –

+0

GnuPG _might_ не нравится права на запись группы. Возможно, вы захотите попробовать не устанавливать домашний каталог, а импортировать ключ, используя ['import ($ keydata)'] (http://www.php.net/manual/en/function.gnupg-import.php) для каталог веб-сервера GnuPG, или создать тот, который у него есть, и имеет только права доступа для этого пользователя. Что является результатом $ gpg-> adddecryptkey ($ fingerprint, $ pw); '? Я не думаю, что эта функция выдает сообщение об ошибке, но возвращает ошибки «false». –

ответ

0

У меня была такая же проблема при переходе на новый сервер. Проблема для меня заключалась в том, что новый сервер использует gpg2, а текущая стабильная версия (1.3.2) Crypt_GPG не поддерживает это. Для меня это решило проблему для обновления новой бета-версии (1.4.0b4) Crypt_GPG.

0

Я столкнулся с той же проблемой, что и вы сегодня. Бесконечное устранение неполадок при расшифровке простого файла. PHP зависает бесконечно, хотя я расшифровывал файл размером 568 байт. Решение состоит в том, чтобы не использовать встроенные в PHP функций, и вместо того, чтобы использовать библиотеку PEAR Crypt_GPG

Start, установив библиотеку (1.4.0b4, как это предлагается в другой ответ здесь):

pear install Crypt_GPG-1.4.0b4 

После того, как это сделано, перейдите в файл PHP и использовать следующий код в качестве примера:

set_include_path("/usr/share/pear"); //ADD PEAR FOLDER TO INCLUDE PATH 
require_once 'Crypt/GPG.php'; //INCLUDE PEAR LIBRARY 
$options = array('homedir' => '/tmp'); //KEYRING DIRECTORY 
$gpg = new Crypt_GPG($options); //MAKE NEW GPG OBJECT 

Теперь, ознакомиться с классом Crypt_GPG: http://pear.php.net/package/Crypt_GPG/docs/latest/Crypt_GPG/Crypt_GPG.html

Не забудьте добавить свой открытый ключ (только должен быть запущен один раз):

$gpg->importKey(file_get_contents("/path/to/public-key.key")); 

Список ключей:

$keys = $gpg->getKeys(); 
print_r($keys); 

Добавить ключ дешифрования к объекту GPG

$gpg->addDecryptKey($keys[0],"key passphrase"); 

Теперь расшифруйте файл:

file_put_contents($unencrypted_file,$gpg->decrypt(file_get_contents($encrypted_file))); 

Надеюсь, это помогает людям, потому что ничего себе ... Я буквально весь день тратил на то, чтобы выяснить, как расшифровать файл на PHP. Что-то, что я могу сделать на C# примерно через 5 минут.

1

В случае, если кто-прежнему сталкивается этот вопрос (так же, как я), пожалуйста, прочитайте это:

По GnuPG версии 2, не представляется возможным передать простой пароль больше. Параметр просто игнорируется. Вместо этого приложение pententry будет запущено в случае запуска php в режиме cli. В режиме cgi или apache открытие ключа завершится неудачно. Простейшим решением является использование ключей без паролей.

от: http://php.net/manual/en/function.gnupg-decrypt.php

Мой PHP скрипт работает через хрон всегда потерпит неудачу, чтобы расшифровать, пока я не снял ключевую фразу. Я попытался использовать ключ без кодовой фразы, и он отлично работал для меня.

Cheers!