mac 用 gpg key 签名 git 提交
环境准备
首先使用 Homebrew 安装 gnupg 和 pinentry-mac,执行以下命令:
brew install gnupg pinentry-mac
一点配置
为 gpg 和 gpg-agent 创建配置文件。
mkdir ~/.gnupg
touch ~/.gnupg/gpg-agent.conf
配置Shell
正确设置 GPG_TTY
环境变量
You should always add the following lines to your .bashrc or whatever initialization file is used for all shell invocations:
(https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html#Invoking-GPG_002dAGENT)
echo "export GPG_TTY=$(tty)" >> ~/.zshrc
source ~/.zshrc
提高使用密码时的用户体验
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
生成一个 GPG key
运行以下命令以生成一个 GPG key
gpg --full-generate-key
这个过程中需要回答一些问题:
密钥类型
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 10
选择 (10) ECC (sign only)
ECC 加密用的算法
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection? 1
使用默认的 Curve 25519
即可。
key 的有效期
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
为了易于使用,这里我们选择永不过期。
用户ID信息
GnuPG needs to construct a user ID to identify your key.
Real name: FengYin Xu
Email address: withfengyinxu@gmail.com
Comment:
You selected this USER-ID:
"FengYin Xu <withfengyinxu@gmail.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Comment 可以不用输入,如果是用于 Github,这里的用户名和邮件设置应该与 Github 账户的设置相同。
密码保护key
在经过上面一系列配置后,会出现一个让我们输入密码保护 key 的提示,可以输入自己想好的密码也可以不输入直接 OK。
然后我们就生成了一个新的 GPG key。
配置 Git 以使用 GPG key 签名
使用正确的 GPG 程序
git config --global gpg.program $(which gpg)
使用指定的 GPG key 签名
运行以下命令查看刚刚生成的 GPG key id,
gpg --list-secret-keys --keyid-format=long
上面👆命令的结果类似下面这个样子:
/Users/username/.gnupg/pubring.kbx
------------------------------
sec ed25519/xxxxxxxxx 2022-12-02 [SC]
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
uid [ultimate] FengYin Xu <withfengyinxu@gmail.com>
ed25519/
后面紧跟的那串 xxxxxxxxx
字符就是要使用的 key id,运行以下命令,让 Git 使用它。
git config --global user.signingkey xxxxxxxxx
使 Git 签名所有提交和标签
git config --global commit.gpgsign true
git config --global tag.gpgSign true
实际使用
现在我们新建一个 Git 仓库并创建一个 README 文件来 commit 试一下:
mkdir git-sign-commits-with-gpg-key
cd git-sign-commits-with-gpg-key
git init
touch README
git add .
git commit -S -m "README"
当最后一行命令回车时,会出现让我们输入密码的提示:
输入密码提交成功后,我们可以使用 git verify-commit
来检查签名的 commit。
VSCode 配套设置
用户配置json文件中增加一行
"git.enableCommitSigning": true,
更多
如果想让 Github 使用生成的 GPG key,请参见 Github 官方文档 Generating a new GPG key 的第 12~ 14 步。