场景如下,我们使用 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)
危险的解决方案是(暂时)授予apache
对root
控制台的访问权限... ( 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 目录复制到用户的主目录并更改所有权。