12

我已经使用gpg加密一段时间了。有人建议我应该gpg2改用。当我去使用gpg2时,我几乎什么都做不了;它会抱怨需要访问私钥,但我似乎无法让它在不gpg-agent运行的情况下使用私钥。

事实证明,我故意禁用gpg-agent(通过使用chmod -x /usr/bin/gpg-agent);这导致gpg2功能非常有限,并向 stderr 抱怨。

我禁用的原因gpg-agent是遵循一系列事件。

首先,我将 SSH 连接到远程机器,“代理”会打开一个弹出窗口,要求我解锁我的 SSH 密钥。我不喜欢这个,因为:

  • 屏幕上的弹出窗口中断了我的工作流程
  • 我的屏幕上的弹出窗口不太可能被注意到,因此它会显示连接停止而不是查询以解锁加密密钥
  • 当我绝对不​​希望我的密码被缓存时,代理似乎缓存了我的密码(很像密码缓存sudo的烦人使用,我可以在其配置中禁用它);每当我的加密密钥用于任何使用它们的程序时,我总是想输入密码短语。
  • 弹出窗口似乎由一个单独的进程拥有,而我希望特定进程使用密钥来查询密码(即使它是一个执行实际查询的库);由于我的大部分活动都使用命令行工具,这意味着GUI 应用程序并不理想,因为并非我所做的一切都可以访问 X11
  • 在后台自动启动一个单独的进程消除了“一个命令,一个进程”的概念,特别是如果该后台进程在原始命令退出后仍然存在

原来是 GNOME 的关键代理,如果不卸载 GNOME,我就无法卸载代理。所以我只是简单地禁用了它chmod -x /usr/bin/gnome-keyring*。然后我发现 SSH 会退回到另一个代理,所以我也使用相同的方法禁用了它chmod -x /usr/bin/ssh-agent*

当我开始使用gpg时,我发现它有一个类似的代理,就是我要问的那个。出于同样的原因,我立即禁用了它;我希望软件总是要求我输入密码才能使用私钥。我不希望出于任何原因缓存密码。

所以gpg2看起来需要 gpg-agent,我想问:

  • 我是否对密码缓存的使用过于偏执?我很想看到或被指出对此的讨论。
  • 是否有最佳实践可以更好地避免意外启用缓存密码?
  • 有没有一种gpg2不用gpg-agent跑就可以使用的方法?
  • 鉴于代理是能够回答查询的守护进程,是什么阻止了在本地计算机上运行的其他用户或服务能够访问我缓存或存储的凭据?
4

2 回答 2

8

我是否对密码缓存的使用过于偏执?我很想看到或被指出对此的讨论。

您的担忧当然是有效的 IMO。好消息是有一些方法可以自定义 gpg-agent 行为以满足您的需求。例如,使用基于终端的密码提示(PIN 输入)而不是 GUI 提示,并且不要缓存密码。

是否有最佳实践可以更好地避免意外启用缓存密码?

一个快速的解决方案(可能不是最佳实践)是使用以下选项自定义您的 ~/.gnupg/gpg-agent.conf:

# Expire cached PINs (passphrases) after zero seconds
default-cache-ttl 0
max-cache-ttl 0

# If you use your GPG keys for SSH auth...
default-cache-ttl-ssh 0
max-cache-ttl-ssh 0
enable-ssh-support

# Use TTY-based PIN entry program (I see pinentry, 
# pinentry-curses, pinentry-gnome3, pinentry-tty and 
# pinentry-x11 on my system)
pinentry-program /usr/bin/pinentry-tty

我发现以下有关 GPG 关键最佳实践的指南(更多关于密钥管理的一般指南,不完全是您所要求的)信息丰富且易于遵循:

有没有办法在没有运行 gpg-agent 的情况下使用 gpg2?

据我所知,不是 gpg 2.x。手册页指出以下内容:

   --use-agent
   --no-use-agent
          This is dummy option. gpg always requires the agent.

我有 gpg 2.1.15。

鉴于代理是能够回答查询的守护进程,是什么阻止了在本地计算机上运行的其他用户或服务能够访问我缓存或存储的凭据?

好问题...默认情况下,gpg-agent 使用套接字,因此从技术上讲,以您的用户身份运行的任何进程理论上都可以劫持您的密钥。不过,不要引用我的话。以下是 gpg-agent 如何工作的概述,希望能帮助您开始寻找真正的答案: https ://unix.stackexchange.com/questions/188668/how-does-gpg-agent-work

于 2017-11-28T08:11:31.777 回答
2

根据https://wiki.archlinux.org/index.php/GnuPG#Unattended_pa ​​ssphrase 为了直接向 gpg 提供密码 - 不运行 gpg-agent - 您需要使用以下选项运行:

gpg --passphrase-fd 0 --pinentry-mode loopback ...

运行此命令后,您需要立即在控制台中提供密码。输入过程中不会出现密码提示,但您会看到输入的密码。

要在键入时隐藏密码,您可以将命令包装在 stty 中:

stty -echo ; gpg ... ; stty echo

我使用 GnuPG v. 2.2.4 对此进行了测试:杀死 gpg-agent,粉碎 /usr/bin/gpg-agent,然后按上述方式运行。工作得很好。

于 2018-06-25T18:34:50.513 回答