在签名提交期间防止git要求GnuPG密码

时间:2016-07-14 22:01:30

标签: git github gnupg

Git总是要求我在使用时签署提交时输入密码以解锁我的密钥。

2

如何在缓存中存储密码,以便我不必在签署提交时每次都输入密码

4 个答案:

答案 0 :(得分:13)

Git永远不会掌握GnuPG密码。您必须依赖GnuPG的缓存密码的功能,这些功能通过gpg-agent进行,可以通过编辑~/.gnupg/gpg-agent.conf轻松设置(隐藏在Windows中AppData文件夹中的某个位置)。< / p>

default-cache-ttl设置为每次调用GnuPG后缓存密码的秒数。 maximum-cache-ttl设置最初输入密码短语后擦除缓存的时间。确保未设置ignore-cache-for-signing - 否则GnuPG将忽略用于签名操作的缓存。

如果您想在没有任何用户互动的情况下对提交进行签名,则可以通过gpg-preset-passphrase预填充缓存,通常隐藏在/usr/lib/gnupg2/gpg-preset-passphrase之类的位置;或者通过运行任意解密或签名操作。您也可以将git配置为使用--passphrase [your passphrase]之类的选项传递给gpg,但请阅读此方法的限制和安全含义(它涉及您的密码以明文存储在某处)。 / p>

选项的完整列表是here

答案 1 :(得分:2)

在更新到Ubuntu 18.04之后,我以前的所有解决方案都不再起作用,因为gnome-keyring不再实现GPG代理,并且我无法获得gpg-agent来缓存任何密码短语。

这是最终对我有用的解决方案:

创建脚本gpg-without-tty

#!/bin/bash
echo $(secret-tool lookup gpgpassphrase $GPGKEY) | /usr/bin/gpg --batch \
    --no-tty --pinentry-mode loopback --passphrase-fd 0 "$@"

在gnome-keyring中为$ GPGKEY设置密码短语:

secret-tool store --label='Passphrase for GPG Key' gpgpassphrase $GPGKEY

告诉git使用gpg-without-tty脚本:

git config --global gpg.program /path/to/gpg-without-tty

您可能还必须将allow-loopback-pinentry设置添加到~/.gnupg/gpg-agent.conf

更新:在本地工作时,结果却以某种方式弄乱了签名:它使用完整的40个字符的指纹对提交进行签名。 GitHub无法识别这些签名为有效签名。而且,当我查看在更新为18.04(git log --show-signature)之前签署的较早的提交时,它们不再显示为有效。我最终在git config中删除了gpg.program设置。事实证明,我遇到的问题可能与首先设置该设置有关(我过去使用该设置来解决另一个问题)。

因此,简而言之,运行git config --global --unset gpg.program是更新后我遇到的问题的答案。

答案 2 :(得分:0)

要存储您的 GPG 密钥密码,以便您不必在每次签署提交时都输入它,请使用以下工具:

  • 对于 Mac 用户,GPG Suite 允许您将 GPG 密钥密码存储在 Mac OS 钥匙串中。
  • 对于 Windows 用户,Gpg4win 与其他 Windows 工具集成。

您也可以手动配置 gpg-agent 来保存您的 GPG 密钥密码,但这不会像 ssh-agent 那样与 Mac OS Keychain 集成,并且需要更多设置。

答案 3 :(得分:-14)

如果您不想或不需要签署每次提交,您可以通过运行默认情况下关闭签名:

git config --global commit.gpgsign false

如果您想签署提交,可以使用-S标志。像这样......

git commit -S -m your commit message

让我的生活更简单!