【问题标题】:Why do I have to kill gpg-agent to sign my commits?为什么我必须杀死 gpg-agent 才能签署我的提交?
【发布时间】:2016-04-08 17:57:23
【问题描述】:

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-agentrunning 并能够签署我的提交?

【问题讨论】:

    标签: git gnupg


    【解决方案1】:

    我今天才知道如何在我的 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
    

    在这个练习中,我尝试了很多不同的选项,发现pinentry-mac GUI 提示器“正常工作”。

    避免使用 GUI 密码提示器

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

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

    【讨论】:

    • 我忘了说我使用的是 Ubuntu。 :sweat_smile: 让我看看能不能把你的研究应用到我的问题上。
    • 我的问题的解决方案显然更简单。根据this manual,我必须向 GPG 指定我正在使用的 TTY,一旦完成,一切都很好。如果您修改答案以反映这一点,我可以接受您的答案。
    • @cj-duncan 我把设置GPT_TTY 的详细信息放在你的.bashrc 中(我不知道如何用用户名中的空格“@”你:))
    • 在我的 Mac 上非常适合我,我正要输入密码无数次才能发布。谢谢!
    • @funkybro:很高兴它帮助了你!
    猜你喜欢
    • 2022-01-11
    • 2014-02-15
    • 2015-07-02
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多