gpg2中gpg-agent的用途

时间:2017-11-13 21:33:31

标签: security gnupg passphrase gpg-agent

我一直在使用gpg进行加密。有人建议我改用gpg2。当我去使用gpg2时,我什么也做不了;它会抱怨需要访问私钥,但我似乎无法使用没有gpg-agent运行的私钥。

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

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

首先,我将SSH连接到远程计算机和#34;代理"会打开一个弹出窗口,要求我解锁我的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
  • 假设代理是守护程序,它们能够回答查询,是什么阻止在本地计算机上运行的其他用户或服务能够访问我的缓存或存储凭据?

2 个答案:

答案 0 :(得分:6)

  

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

您的担忧肯定是有效的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

答案 1 :(得分:1)

根据https://wiki.archlinux.org/index.php/GnuPG#Unattended_passphrase,为了直接向gpg提供密码-在不运行gpg-agent的情况下-您需要运行以下选项:

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

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

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

stty -echo ; gpg ... ; stty echo

我使用GnuPG v.2.4.2进行了测试:杀死gpg-agent,切碎/ usr / bin / gpg-agent,然后按照上述说明运行。效果很好。