起因
无意间阅读到一篇文章 《震惊!竟然有人在 GitHub 上冒充我的身份!》, 大致看了下 Github 网站对于 Commit 的归属的判断规则。
只需要 Commit 的邮箱在某人的账号设置的邮箱列表内。那么就会将此次提交显示为是某人的归属。这就意味着,任何一个人都可以使用 git config user.email "YOUR_EMAIL"
这一命令设置成别人的邮箱,伪装成他人进行提交。
Git Commit 签名
如果只需要设置邮箱就可以伪装成用户进行提交,那不是乱套了?因此大多数软件维护者都会要求 Commit 签名。Github 其实支持多种方式签名,这里大致记录一下自己设置 GPG 签名的方案。
Windows 安装 GPG
Windows 系统下,我使用的 scoop 包管理器,通过 scoop install gpg
就可以安装好了。 使用 gpg --version
看一下版本信息。
D:\wsdjeg>gpg --version
gpg (GnuPG) 2.4.7
libgcrypt 1.11.0
Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: D:\Scoop\apps\gpg\current\home
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
生成 GPG 密钥
参考 Github 的文档生成并上传 GPG 密钥, 上传完成后使用 https:/github.com/{username}.gpg
格式链接就可以访问你的公钥。
例如我的:wsdjeg.gpg
设置 Git 签名程序
使用 where gpg
查看 gpg 命令的绝对路径:
d:\wsdjeg>where gpg
D:\Scoop\apps\gpg\current\bin\gpg.exe
清除之前的设置:
git config --global --unset gpg.format
之前导入已备份的私钥后,使用 git commit -S
一直提示没有私钥,找了很久原因才知道,原来需要设置 Git 的签名方式及程序,可能是原来设置过。
git config --global gpg.program "D:\Scoop\apps\gpg\current\bin\gpg.exe"
使用 gpg --list-secret-keys --keyid-format=long
列出 GPG 密钥:
d:\wsdjeg\my-blog>gpg --list-secret-keys --keyid-format=long
D:\Scoop\apps\gpg\current\home\pubring.kbx
------------------------------------------
sec rsa2048/41BB7053E835C848 2021-09-21 [SC]
9C957B574786F570AC69625041BB7053E835C848
uid [ unknown] Shidong Wang (Shidong's GPG key) <[email protected]>
ssb rsa2048/D3E3902EF4E8074C 2021-09-21 [E]
设置 Git 签名的 ID:
git config --global user.signingkey 41BB7053E835C848
设置 Git 默认启用 Commit 签名:
git config --global commit.gpgsign true