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。
image

然后我们就生成了一个新的 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"

当最后一行命令回车时,会出现让我们输入密码的提示:
image
输入密码提交成功后,我们可以使用 git verify-commit 来检查签名的 commit。
image

VSCode 配套设置

用户配置json文件中增加一行

"git.enableCommitSigning": true,

更多

如果想让 Github 使用生成的 GPG key,请参见 Github 官方文档 Generating a new GPG key 的第 12~ 14 步。


image

posted @ 2022-12-03 12:46  复读机§  阅读(786)  评论(0编辑  收藏  举报