在 Windows 11 上配置 SSH KEY 和 GPG KEY

安装 Git

当然可以从 Git 的官方网站下载对应 Windows 版本进行安装,这里更推荐安装 Visual Studio Community 最新版本。 它自带了完整的 Git,不管开发 Rust 还是 NodeJS ,都需要一定的编译环境支持,索性一次到位比较好。 这个安装就不介绍了,如果这个都搞不定就用往下看了。

安装 Git LFS

现在 LFS 基本成了标配,在官方网站下载对应版本安装后,记得执行 git lfs install 初始化。

生成 SSH KEY 并加入到 SSH-AGENT

ssh-keygen -t ed25519-sk -C "your_email@example.com"

这一步是最简单的,一路回车就行,生成的 Key 会保存在 C:\Users\your_user_name\.ssh 目录下。把生成的 id_ed25519_sk.pub 内容添加到 GitHub 的 SSH KEY 中就可以。如何能把 SSH KEY 加入到 ssh-agnet 是比较麻烦的事儿。试了几个方法,最后还是 SSH-ADD / Windows / Could not open a connection to your authentication agent 提供的方法有效,

cd C:\Program Files\Git\bin
bash
exec ssh-agent bash
ssh-add ~/.ssh/id_ed25519

当然前提是你已经能够正常启动 ssh-agent 了, GitHub 官方给出的方案是创建一个 .profile.bashrc 文件,这一步是在 Git bash 中执行, 它的路径是 C:\Program Files\Git\bin 。为了方便我把它加到了 Terminal 的配置中。

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

如果这个启动脚本没有生效,可以尝试手动执行 ssh-agent 命令。

生成 GPG KEY

gpg --full-generate-key

在这一步根据提示输入你的姓名和邮箱,密码可以不输入,直接回车。生成的 Key 会保存在 C:\Users\your_user_name\.gnupg 目录下。 执行 gpg --list-secret-keys --keyid-format=long 查看生成的 Key ID,然后执行 gpg --armor --export your_key_id 导出 Key 内容,添加到 GitHub 的 GPG KEY 中。

git config --global user.signingkey <Key ID>
git config --global commit.gpgsign true

上面的这个操作需要在 Git bash 中执行,而后每次提交代码的时候都使用 git commit -s -S -m"commit message" 这个命令, -s -S 参数表示使用 GPG 签名并添加 Signed-off-by 。

有时候在执行 GPG KEY 的时候长时间没有反应,卡在生成随机 Byte 的地方。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

这个界面无论如何动鼠标和键盘都没有反应, 感觉应该不是凑不够随机数的问题,应该是哪里有个 Bug ,但是在网上也没有搜到类似的情况给予说明和解决。

第一个解决办法是采用 SSH Key 对 Commit 进行签名,在配置文件中对 gpg 签名的 format 进行设置,测试是可行的。

[user]
	name = Eli Ma
	email = eli@patch.sh
	signingkey = C:/Users/meagl/.ssh/id_ed25519.pub

[commit]
	gpgsign = true

[gpg]
	format = ssh

以上操作都是在 Git Bash 中操作的,所以使用的是 Git 安装目录下的 gpg 程序。 可以采用安装 Gpg4win 安装一个最新版本 gpg 程序尝试解决,但它生成的 Key 存储在 C:\Users\your_user_name\AppData\Roaming\gnupg ,这个 Key 无法被 Git 使用。 但是可以通过指定 git 的 gpg 程序路径的方式指定 Gpg4wingpg 方法解决,需要修改配置文件。

[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true

[user]
	name = Eli Ma
	email = eli@patch.sh
	signingkey = AAAAAAAAAA

[commit]
	gpgsign = true

[gpg]
	program = C:\\Program Files (x86)\\GnuPG\\bin\\gpg.exe