为什么我必须杀死gpg-agent来签署我的提交?

时间:2016-04-08 17:57:23

标签: git gnupg

GitHub recently announced verified commits,所以我借此机会实施GPG并开始使用密钥。当我想开始提交时,我得到以下内容:

$ git commit

You need a passphrase to unlock the secret key for
user: "John Doe <johndoe@email.com>"
4096-bit RSA key, ID ABCD1234, created 2016-04-08

gpg: problem with the agent - disabling agent use
error: gpg failed to sign the data
fatal: failed to write commit object

我上网搜索了一个解决方案,一个网站(针对邮件提供商)建议killall gpg-agent,并且它有效。现在,我可以输入我的密码来签署提交。

gpg-agent是否必要?当我安装它时似乎带有GPG,但是如果我必须杀死它以签署我的提交,那么似乎我有一些我不理解的东西。我该如何解决这个问题,以便我可以gpg-agent运行并能够签署我的提交?

1 个答案:

答案 0 :(得分:19)

我今天刚刚想出如何在我的Mac上使用gpg-agent。在遇到与您相同的错误后我被阻止了:

gpg: problem with the agent - disabling agent use

tldr;我是如何修理的

对于我的设置,我可以通过安装pinentry-mac并指向gpg-agent来使用它来解决此问题,从而根据需要弹出GUI提示符。

1. install pinentry-mac
% brew install pinentry-mac
2. update gpg-agent conf
# manually change ~/.gnupg/gpg-agent.conf's pinentry-program to /usr/local/bin/pinentry-mac
3. update shell's view of PATH contents
% hash -r
4. restart gpg-agent
# however you normally do it (see below for how I run it manually)

有关调试的详细信息

我通过手动重启gpg-agent来调试此操作。我首先评论了~/.gnupg/gpg-agent.conf中的配置,然后运行此命令以--verbose重新启动gpg-agent:

% killall gpg-agent && \
  eval $(gpg-agent --pinentry-program /usr/local/bin/pinentry --default-cache-ttl 60 --daemon --verbose)

然后我运行了一个测试命令,看到了我们上面列出的错误,以及一个新错误:

# update the MY_GPG_KEY_ID as appropriate
% echo hi | gpg -e -r $(MY_GPG_KEY_ID) | gpg -d --use-agent
...
gpg-agent[60604]: command get_passphrase failed: Device not configured
gpg: problem with the agent - disabling agent use
...

我最终意识到(在阅读this articlethis GPG page之后)GPG_TTY

}。所以,一旦我设置了变量,一切都“起作用”:

gpg-agent

在本练习中,我尝试了很多不同的选项,并发现% killall gpg-agent && \ eval $(gpg-agent --pinentry-program /usr/local/bin/pinentry --default-cache-ttl 60 --daemon --verbose) % export GPG_TTY=`tty` # Now the below command succeeds % echo hi | gpg -e -r $(MY_GPG_KEY_ID) | gpg -d --use-agent GUI提示符“刚刚起作用”。

避免使用GUI密码短语提示符

如果您不想弹出GUI提示符,那么我认为确保在每个终端中设置以下env变量就足够了:

  • pinentry-mac
    • 例如,您可以将此行放入.bashrc:
    • GPG_TTY
  • export GPG_TTY=$(tty)