为 apache 创建 GnuPG 密钥环

为 apache 创建 GnuPG 密钥环

场景如下,我们使用 GnuPG 加密 2 个 Web 服务器之间的数据。 1 在 RHEL 上。 GnuPG会通过cgi脚本访问进行加密和解密。所以我需要一个 apache 用户可以访问的密钥环。事实证明,这对我来说在 Red Hat 上很困难,但我在 Ubuntu 上很容易完成这个设置。这是我尝试过的,也许有人有更好/更简单的方法来实现这一点。

我成为了apache用户

su -s /bin/bash apache

跑步时

gpg --gen-key

它无法在 /var/www 处创建 .gnupg 目录,因此我创建了该目录并将所有者设置为 apache.apache。现在生成密钥时,我得到

can't connect to `/var/www/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[26949]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.

所以我在阅读了一些手册页(以及一些谷歌搜索)后创建了该文件

mknod -m 700 S.gpg-agent p

现在我明白了

can't connect to `/var/www/.gnupg/S.gpg-agent': Connection refused
gpg-agent[26949]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.

此后我一直无法到达任何地方,因为我正在进入我不太了解的领域。我假设这与 apache 并不是真正的用户有关,因为有 bash 配置文件等。那么我该从哪里开始呢?

答案1

这可能是设备文件权限问题。pinentry不使用继承的文件描述符,而是尝试直接访问传递的 TTY,但这不起作用。

您可以tty在 shell 中运行,然后ls -l /dev/pts/1查看结果,您可能会注意到apache无法访问它。

你也可以运行

strace -o gpg.strace -f -e trace=open gpg --gen-key

并且可能会发现类似的东西

open("/dev/pts/1", O_RDONLY)      = -1 EACCES (Permission denied)

危险的解决方案是(暂时)授予apacheroot控制台的访问权限... ( chown apache /dev/pts/1)。更好的解决方案是进行真正的登录apache

这仅影响密钥生成。您还可以作为另一个用户创建密钥对,将其导出并导入到帐户中apache

答案2

您是否尝试过创建新用户并使用 sudo 调用命令?如果担心这可能是一些权限问题,更简单的方法是将代理节点从 /var/www 删除到我们知道 gpg 用户可以访问的某个地方,也许是 /tmp 目录。您可以通过更改环境变量 GPG_AGENT_INFO 手动指定代理节点位置。

答案3

我怀疑这是关于这个错误的回归https://rhn.redhat.com/errata/RHBA-2011-1096.html

来自勘误表:

此更新修复了以下错误:

  • 在此更新之前,使用 pinentry-curses 实用程序输入密码时存在问题;如果 pinentry-curses 在与拥有当前 tty 的用户不同的用户下运行,则显示错误消息而不是密码输入对话框。此错误已在此更新中修复,因此现在不会显示错误消息,并且 pinentry-curses 按预期要求输入密码。 (BZ#677665)

问题似乎是,当您 su 或 sudo 时,tty 仍然由 tty 的原始所有者拥有,这会破坏 pinentry。

我要指出的是,昨天我们无法以除 root 之外的任何用户身份在 Cent 6 系统上创建 gpg 密钥。要生成密钥,我们必须以 root 身份登录,创建密钥,将 .gpg 目录复制到用户的主目录并更改所有权。

相关内容