如何让GPG代理程序缓存我的密码?

我是一名开发人员,我通常使用我的GPG密钥签署Git提交。我已经成功在OSX上使得GPG Agent正常工作,只需要我每天输入密码一次,但是在Ubuntu 16.04上无法做到同样的效果。

这是我正在做的事情:

  • 我已经设置好了我的GPG密钥/等。
  • 我在一个Git目录中。
  • 我将一些文件添加到Git中。
  • 然后我去提交它们(git commit),并得到一个像这样的GPG密码请求:

    $ git ci
    
    您需要输入密码来解锁用户“Randall Degges <r@rdegges.com>”的秘密密钥
    4096位RSA密钥,ID为8F700DA2,创建于2016-04-05
    
    [master 1740961] blah
     1个文件已更改,插入了1行(+)
    
问题是:每次我提交代码时,都会再次要求输入我的GPG密码。
我想要做的是配置GPG代理程序,将我的密码缓存一整天,这样只需要输入一次。
我已经阅读了大量的文档和博客文章,目前为止,我尝试过以下方法...
首先,我修改了我的~/.zshrc文件(我使用zsh),设置了以下内容:
# GPG Agent
export GPG_TTY=$(tty)
export GPGKEY=8F700DA2

现在,根据我所阅读的内容,仅仅重新启动gpg-agent是不够的,它并不能解决问题。
因此,接下来我做的事情是按照《man gpg-agent》页面上的说明,定义了一个~/.gnupg/gpg-agent.conf文件。
# Set the default cache time to 1 day.
default-cache-ttl       86400
default-cache-ttl-ssh   86400

# Set the max cache time to 30 days.
max-cache-ttl           2592000
max-cache-ttl-ssh       2592000

这也没有任何效果。
我也尝试了各种博客方法等,但似乎都没有起作用。有人能给我一些建议,告诉我可能遗漏了什么吗?
2个回答

除了在“gpg-agent.conf”中设置缓存时间外,您还必须确保GnuPG实际上正在与“gpg-agent”进行接口。GnuPG 2及更高版本通常会这样做,但GnuPG 1分支不会。默认情况下,git使用的是“gpg”二进制文件,而(在回答本问题时)该文件仍然是GnuPG 1,而大多数系统上已安装GnuPG 2为“gpg2”。
最后,您有两种可能性:
  • 通过更改git配置,设置git使用gpg2

    git config --global gpg.program gpg2
    
  • 通过在gpg.conf中添加use-agent,设置gpg(GnuPG 1)使用gpg-agent

4在Ubuntu 20.04中,gpg --version的结果是gpg (GnuPG) 2.2.19 - Daniel Kmak
非常有用的信息,我在任何地方都找不到。发帖者也问了一个好问题。 - MaXi32

除了上面的答案之外,你还可以直接将系统中默认的gpg更改为gpg2,而不是gpg1
如果git config --global gpg.program gpg2对你有效,但你不想在git配置中保留这个设置(在我的情况下,因为我在macOS上使用相同的配置),那么你可以直接替换默认的gpg
我按照这里的指南here进行操作,内容如下:
$ sudo mv /usr/bin/gpg /usr/bin/gpg1
$ sudo update-alternatives --verbose --install /usr/bin/gpg gnupg /usr/bin/gpg2 50

这将使gpg1成为旧的gpg二进制文件,并创建符号链接/usr/bin/gpg -> /usr/bin/gpg2(名称为gnupg,优先级为50)。
理论上更改默认的gpg可能会破坏系统上的某些软件包,但Debian Stretch(Debian的当前稳定版本)以类似的方式gpg2设置为默认的gpg,所以您不应该遇到太多问题。