Php gpg加密失败:文件打开错误

Php gpg加密失败:文件打开错误,php,gnupg,Php,Gnupg,我一直在为这件事发疯 我在CentOS服务器上安装了gnupg,我尝试加密上传的文件(通过PHP页面上传)。在服务器上,通过命令行,它可以完美地工作。但通过php脚本,它会失败,并出现以下错误: gpg: /path-to-my-file/my-file: encryption failed: file open error 用户apache(我认为是用来运行exec命令的)在文件的目录中进行了读/写操作 文件上传得很好(我可以在代码中删除未加密的文件后看到),并且可以通过php站点正确删除

我一直在为这件事发疯

我在CentOS服务器上安装了gnupg,我尝试加密上传的文件(通过PHP页面上传)。在服务器上,通过命令行,它可以完美地工作。但通过php脚本,它会失败,并出现以下错误:

gpg: /path-to-my-file/my-file: encryption failed: file open error
用户apache(我认为是用来运行exec命令的)在文件的目录中进行了读/写操作

文件上传得很好(我可以在代码中删除未加密的文件后看到),并且可以通过php站点正确删除

我运行的命令如下

/path-to-gpg/gpg --homedir=/path-to-my-home-gnupg/.gnupg -e -r therecipient@email the-unencrypted-file
你知道我该怎么解决这个问题吗? 谢谢

有几件事需要检查:

  • 运行
    系统(“ls”.escapeshellarg($file))
    并检查结果-是否未找到该文件?拒绝许可?这将帮助您调试
  • 运行
    system(“whoami”)
    以确保PHP按照您认为的方式运行
  • 运行
    echo“ls”。escapeshellarg($file)。“”
    然后复制并粘贴该命令,并从shell中运行该命令,以确保文件的路径符合您的预期
  • su apache -c /path-to-gpg/gpg -vv ...
    
此外,我相信CentOS默认情况下运行SELinux……如果您已经安装了它,请检查日志(在
/var/log/
)以查看SELinux是否阻止Apache执行GPG。

需要检查的几件事:

  • 运行
    系统(“ls”.escapeshellarg($file))
    并检查结果-是否未找到该文件?拒绝许可?这将帮助您调试
  • 运行
    system(“whoami”)
    以确保PHP按照您认为的方式运行
  • 运行
    echo“ls”。escapeshellarg($file)。“”
    然后复制并粘贴该命令,并从shell中运行该命令,以确保文件的路径符合您的预期
  • su apache -c /path-to-gpg/gpg -vv ...
    

另外,我相信CentOS默认情况下运行SELinux…如果您已经安装了它,请检查日志(在
/var/log/
)以查看SELinux是否阻止Apache执行GPG。

尝试在详细模式下以实际Apache用户权限运行该命令:


尝试在详细模式下以实际apache用户权限运行该命令:


让我检查所有这些,然后带着结果回来文件就在那里。我以apache的身份运行。。但是错误日志实际上非常有用,所以感谢您指出它。我发现我的pubring和secring实际上归root所有,而不是apache所有。因此,apache无法读取它们,也无法加密文件。将所有权更改为apache解决了这个问题。谢谢吊柱,让我检查所有这些,然后带着结果回来文件就在那里。我以apache的身份运行。。但是错误日志实际上非常有用,所以感谢您指出它。我发现我的pubring和secring实际上归root所有,而不是apache所有。因此,apache无法读取它们,也无法加密文件。将所有权更改为apache解决了这个问题。谢谢大卫