为什么我必须杀死 gpg-agent 才能签署我的提交?
Why do I have to kill gpg-agent to sign my commits?
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
运行 并能够签署我的提交?
我今天刚刚弄清楚如何在 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 article and this GPG page 之后)GPG_TTY
而不是 我在启动 gpg-agent
时所遵循的步骤.所以一旦我设置了那个变量一切 "worked":
% 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
在这个练习中,我尝试了很多不同的选项,发现 pinentry-mac
GUI 提示符 "just worked".
避免 GUI 密码提示
如果您不想弹出 GUI 提示符,那么我认为确保在每个终端中设置以下环境变量就足够了:
GPG_TTY
- 例如,您可以将此行放入您的 .bashrc:
export GPG_TTY=$(tty)
GPG_AGENT_INFO
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
运行 并能够签署我的提交?
我今天刚刚弄清楚如何在 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
:
% 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 article and this GPG page 之后)GPG_TTY
而不是 我在启动 gpg-agent
时所遵循的步骤.所以一旦我设置了那个变量一切 "worked":
% 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
在这个练习中,我尝试了很多不同的选项,发现 pinentry-mac
GUI 提示符 "just worked".
避免 GUI 密码提示
如果您不想弹出 GUI 提示符,那么我认为确保在每个终端中设置以下环境变量就足够了:
GPG_TTY
- 例如,您可以将此行放入您的 .bashrc:
export GPG_TTY=$(tty)
GPG_AGENT_INFO