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

pok*_*mon 14 git github gnupg

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

git commit -S -m 'message'
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*rat 14

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

设置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,但请阅读此方法的限制和安全含义(它涉及您的密码以明文存储在某处).

完整的选项列表在这里.

  • 我没有`~/.gnupg/gpg-agent.conf`,而是有`~/.gnupg/gpg.conf`,可以在其中设置`default-cache-ttl`吗? (2认同)

dec*_*ijo 6

更新到 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 "$@"
Run Code Online (Sandbox Code Playgroud)

在 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它们不再显示为有效。我最终删除了gpg.programgit 配置中的设置。事实证明,我遇到的问题可能与最初的设置有关(我过去用它来解决另一个问题)。

所以,简而言之,跑步git config --global --unset gpg.program是我更新后问题的答案。


小智 6

来自 GitHub 网站

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

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

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