如何将gpg-agent与ssh-agent+ssh-add一起使用?

ssh-agent非常容易使用,我启动它并使用ssh-add keyfile添加密钥。在终止进程ssh-agent后,所有文件都会消失。

如何实现与gpg-agent相同的行为?我找到的最接近的程序是gpg-preset-passphrase。但是查看 gpg-agent的手册页后,似乎创建了一个用于存储私钥的目录。

也许我错了,所以我想知道如何设置gpg-agent以避免创建文件/目录?如果不可能,欢迎提供其他使gpg-agent能够像ssh-agent+ssh-add工作的建议。我不希望使用Seahorse等图形界面解决方案。


你有没有看过 gpg-connect-agent - Smithamax
@Smithamax 不是的,但它似乎使用了与 gpg-preset-passphrase 相同的功能。我运行了 gpg-connect-agent,获得了一个 shell,并执行了 setkey IDOFMYPRIVATEKEYHERE,然后是 preset_passphrase,结果显示为 "ERR 67108924 Unsupported <GPG-agent> - no --allow-preset-passphrase"。 - Lekensteyn
1个回答

我决定再次研究一下,并找出它的工作原理。GPG使用术语“缓存”来存储密码。可以对最大存储时间施加两个限制:
- 自密钥初始添加以来保留密码短语的时间。 - 自上次访问密码短语以来保留的时间。
此外,对于这两个限制,存在两种变体,一种用于GPG密钥,另一种用于SSH密钥(如果启用了支持)。
相关的手册页面条目来自:
   --default-cache-ttl n
          Set  the  time a cache entry is valid to n seconds.  The default
          is 600 seconds.

   --default-cache-ttl-ssh n
          Set the time a cache entry used for SSH keys is valid to n  sec‐
          onds.  The default is 1800 seconds.

   --max-cache-ttl n
          Set the maximum time a cache entry is valid to n seconds.  After
          this time a cache entry will be expired  even  if  it  has  been
          accessed recently.  The default is 2 hours (7200 seconds).

   --max-cache-ttl-ssh n
          Set the maximum time a cache entry used for SSH keys is valid to
          n seconds.  After this time a cache entry will be  expired  even
          if  it has been accessed recently.  The default is 2 hours (7200
          seconds).

口令短语始终被缓存(在内存中,而不是在磁盘上!通过$HOME的git仓库进行验证),因此没有明确需要使用ssh-add。例如,签署虚拟数据已经触发了缓存:
$ echo | gpg -s >/dev/null
(passphrase requested
$ echo | gpg -s >/dev/null
(signing proceeds without asking for passphrase)

要对 gpg-agent 的缓存设置进行永久更改,请编辑 ~/.gnupg/gpg-agent.conf 并添加类似以下内容的内容:
default-cache-ttl  60     # Expire GPG keys when unused for 1 minute
max-cache-ttl     600     # Expire GPG keys after 10 minutes since addition

我尝试通过指定enable-ssh-support来启用SSH代理支持,但这会导致gpg-agent要求您使用另一个密钥来加密密钥,然后将您的私钥存储在~/.gnupg/private-keys.d/中。对我来说不行,我还是坚持使用双重ssh-agent / gpg-agent方法。
一些额外的提示:
  • 添加密钥时,可以指定SSH代理的max-cache-ttl-ssh等效项,例如:ssh-add -t 600 ~/.ssh/id_rsa
  • 为了防止将GPG密码存储在代理中,禁用代理。在较新的GPG版本中,选项--no-use-agent被忽略,但您可以通过清除相关环境变量来阻止代理的使用。有几种方法可以实现:

    echo | GPG_AGENT_INFO= gpg -s         # 临时
    export GPG_AGENT_INFO=; echo | gpg -s # 直到当前shell关闭
    

我的机器一直不停地要求输入密码 - don bright
@donbright 你确定只有一个 gpg-agent 在运行吗?(例如使用 ps u -C gpg-agent 命令检查进程列表)。缓存超时设置得合适吗?如果你用它来签名(而不是(SSH)身份验证),是否取消了 ignore-cache-for-signing 选项的设置? - Lekensteyn
谢谢。我的问题原来是我使用的是GPG 1.4而不是GPG 2,在Ubuntu上安装哪些软件包可能会让人感到困惑。 - don bright
可以在ssh-agent中使用gpg密钥吗?因为我不喜欢gpg-agent的行为(将私钥保存到磁盘)。 - luochen1990