`git -S -m commit`没有要求输入密码 - 从GPG mac转移到GPG shell后签名

时间:2016-09-23 21:30:49

标签: git macos github gnupg pgp

我正在为Web开发设置新机器(macOS Sierra),我已完成brew install gpg已安装gpg2gpg-agent。我已将~.gnupg上的密钥复制到我的旧Mac上。我安装我在旧机器上的mac接口GPG Suite,因为我真的更喜欢使用命令行。

我已使用适当的设置设置我的git全局变量。

    git config --global user.name "Christopher Allen"
    git config --global user.email "ChristopherA@LifeWithAlacrity.com"
    git config --global user.mail "ChristopherA@LifeWithAlacrity.com"
    git config --global user.signingKey F8D36C91357405ED

当我尝试将更改提交到需要git config commit.gpgsign=true的git存储库时,在我的旧GPG Suite上,我会看到一个弹出窗口,要求输入我的密码。但是,仅使用GPG,它可以正确找到我的公钥,但它不会提示我输入密码进行签名。

    $ git commit -S -m "changed code"

    You need a passphrase to unlock the secret key for
    user: "Christopher Allen <ChristopherA@LifeWithAlacrity.com>"
    4096-bit RSA key, ID 357405ED, created 2015-04-16

    error: gpg failed to sign the data
    fatal: failed to write commit object
    $ 

在这里研究,我唯一提到的是“I can’t get `git tag -s` to ask for my GPG password”,它表明问题在于gpg-agent的环境变量(没有建议的解决方案),或者使用gpg-preset-密码短语功能(我不喜欢)。

进一步检查,似乎gpg-agent未运行:

    $ gpg-agent
    gpg-agent: no gpg-agent running in this session

我发现此页面https://blog.chendry.org/2015/03/13/starting-gpg-agent-in-osx.html建议将此脚本添加到.bash_profile:

    [ -f ~/.gpg-agent-info ] && source ~/.gpg-agent-info
    if [ -S "${GPG_AGENT_INFO%%:*}" ]; then
        export GPG_AGENT_INFO
    else
      eval $( gpg-agent --daemon --write-env-file ~/.gpg-agent-info )
    fi 

在采购此脚本后,gpg-agent说:

    $ gpg-agent
    gpg-agent: gpg-agent running and available

但是,我仍有同样的问题。

有关如何解决此问题的任何想法?我不想使用旧的GPG套件,还原为GPG 1.0,或使用gpg-preset-passphrase。

谢谢!

- 克里斯托弗艾伦

4 个答案:

答案 0 :(得分:4)

事实证明问题是我复制了~.gnupg中的所有文件,这些文件覆盖了brew install gpg创建的文件(可能是.conf个文件中的一个。

我卸载了gpg和所有相关的子包(其中有很多),仅将pubring.gpgsecring.gpgtrustdb.gpg复制到~.gnupg 首先,然后brew install gpg。新的gpg.confgpg-agent.conf已创建。

- 克里斯托弗艾伦

答案 1 :(得分:4)

我实际采取的措施是:

安装pinentry

brew install pinentry

如果那不能胜任,那么:

告诉GPG在要求输入密码时使用哪个tty

export GPG_TTY=$(tty)

这实际上是为我修好的。

您还可以将此导出添加到~/.bashrc,以便自动导出 不要忘记重新加载文件或启动新会话。

一种简单的方法:echo "export GPG_TTY=$(tty)" >> ~/.bashrc

如果您收到此错误:

gpg-agent: no gpg-agent running in this session

将问题中提到的脚本添加到~/.bashrc文件中。

[ -f ~/.gpg-agent-info ] && source ~/.gpg-agent-info
if [ -S "${GPG_AGENT_INFO%%:*}" ]; then
    export GPG_AGENT_INFO
else
    eval $( gpg-agent --daemon --write-env-file ~/.gpg-agent-info )
fi 

测试gpg是否正常工作

echo "Hello" | gpg -s

随机地它仍然没有要求密码短语

当git不想问我密码时,有时候我会使用上面的测试命令来获取它,这将被缓存然后,我尝试提交我的更改。

增加密码短语缓存时间

如果您想要将密码缓存更长时间,可以将以下行添加到配置文件中:~/.gnupg/gpg-agent.conf

default-cache-ttl       86400

答案 2 :(得分:0)

我能够通过在守护进程模式下启动gpg-agent然后应用它所呈现的GPG_AGENT_INFO环境变量来解决这个问题。

gpg-agent --daemon
GPG_AGENT_INFO=/Users/.../.gnupg/S.gpg-agent:58895:1; export GPG_AGENT_INFO;

在同一个会话中,我做了一个git tag -s(注意小写&#39; s&#39;)并且我被正确地提示输入我的GPG密码。

答案 3 :(得分:0)

没有一个答案对我有用。

我不得不杀死代理,然后用 -S 调用 commit:

gpgconf --kill gpg-agent

git commit -S -am "some message"