首页 > 解决方案 > 我可以用 keybase.io 签署 git 提交吗?

问题描述

我正在设置一台新机器,并且希望将密钥库用于各种 pgp 活动,例如签署提交。我可以运行类似的命令

$ keybase pgp sign -m foo > x
$ gpg --verify x 2>&1 | grep -oF 'Good signature'
Good signature

我可以直接用 gpg 签名,但让 keybase 管理它很方便。那么我能以某种方式让 git 使用 keybase 吗?

Git 配置似乎没有办法自定义它用来签署提交的 gpg 命令。您所能做的就是提供密钥。有什么办法吗?

标签: gitgnupgkeybase

解决方案


感谢Xavier 回答中的链接,我了解到我可以使用 gpg.program 配置覆盖 gpg 程序:

git config --global gpg.program /path/to/something

所以我可以用它来围绕keybase编写一个包装器。

但事实证明,git 对它的含义非常挑剔somethingGit 期望部分解析--fd-status标志产生的输出,这会导致在备用文件句柄处gpg输出特殊状态代码。

幸运的是,至少在我第一次通过时,git 不会解析gpg 生成的所有内容,因此我能够模拟它。这是一个带有功能包装的要点,这是它的主要内容:

# Copy the commit message from stdin to a file. 
d=$(mktmp -d "${TMPDIR:-/tmp}/gitsig.XXXXXXXXX")
cat > "$d/commit.msg"

# Have Keybase write the signature to another file.
keybase pgp sign --detached \
                 --key "$1" \
                 --infile "$d/commit.msg" \
                 --outfile "$d/commit.sig"

# Have gpg verify the signature right away.
# Capture its status in a file.
gpg --verify --status-fd=2 \
    "$d/commit.sig" "$d/commit.msg" \
    > /dev/null 2> "$d/gpgstatus.txt"

# Copy the KEY_CONSIDERED lines to stderr. Git wants that.
grep '^\[GNUPG:\] KEY_CONSIDERED' "$d/gpgstatus.txt" >&2

# Produce a minimal SIG_CREATED line to stderr. Git also wants that.
printf '[GNUPG:] SIG_CREATED ' >&2

推荐阅读