如何像 ssh-agent+ssh-add 一样使用 gpg-agent?

如何像 ssh-agent+ssh-add 一样使用 gpg-agent?

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

我如何才能获得相同的行为gpg-agent?我找到的最接近的程序是gpg-preset-passphrase.但看看手册页gpg-agent,看上去好像是创建了一个目录,用于存放私钥。

我可能错了,所以我想知道如何设置gpg-agent不创建任何文件/目录?如果不可能,其他gpg-agentssh-agent+这样的建议ssh-add也欢迎。我不是在寻找像 Seahorse 这样的 GUI 解决方案。

答案1

我决定再看看这个,并找出它的工作原理。GPG 使用术语“缓存”来存储密码。可以对最大存储时间施加两个限制:

  • 自最初添加密钥以来保留密码的时间。
  • 自上次访问以来保留密码的时间。

此外,这两个约束都存在两种变体,一种用于 GPG 密钥,一种用于 SSH 密钥(如果启用了支持)。

相关手册页条目来自gpg-agent(1)

   --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).

密码始终会被缓存(在内存中,而不是在磁盘上!已使用 git repo 验证$HOME),因此无需明确使用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

我曾尝试通过指定 来启用 SSH 代理支持enable-ssh-support,但这会使 gpg-agent 要求您提供另一个密钥来加密密钥,然后将您的私钥存储在 中~/.gnupg/private-keys.d/。对我来说不行,那么我将坚持使用双 ssh-agent / gpg-agent 方法。

一些额外提示:

  • max-cache-ttl-ssh在添加密钥时可以指定SSH 代理的等效项,例如:ssh-add -t 600 ~/.ssh/id_rsa
  • 要防止将 GPG 密码存储在代理中,请禁用代理。在较新的 GPG 版本中,此选项--no-use-agent将被忽略,但您可以通过清除相关环境变量来阻止使用该代理。以下是一些方法:

    echo | GPG_AGENT_INFO= gpg -s         # temporary
    export GPG_AGENT_INFO=; echo | gpg -s # until the current shell is closed
    

相关内容