为什么要数字签名
如果你不数字签名,任意一个人都可以伪造你的 Commit ,只需要在他的电脑上改一下自己的 Email 就完事儿了。非常危险。
了解 GPG 签名
需要使用 GPG 对 Git Commit 进行数字签名。
GPG签名是一种数字签名,用于证明某个电子文档或文件的真实性和完整性。GPG是GNU Privacy Guard的缩写,是一种开源的加密软件,可以用来创建和验证数字签名。GPG签名是通过将文件的哈希值与发送者的私钥进行加密来生成的,接收者可以使用发送者的公钥来验证签名,以确保文件未被篡改并确实由发送者发送。GPG签名通常用于保护敏感信息和确保电子文档的完整性。
下载并安装 GPG
如果使用的是 Linux 或 macOS,可以使用您的包管理器来安装。
如果您使用的是 Windows,则可以从 Gpg4win 官网下载安装程序;或安装 Git + GitBash 来安装。
生成一个 Key
开启GPG Sign非常简单。
首先生成一个Key:
gpg --gen-key
在上面的过程中,gpg 会询问你姓名和 Email,同时要求你设置一个密码。
获取我的 Key ID
完成后,您可以使用以下命令列出您的 GPG 密钥:
gpg --list-secret-keys --keyid-format LONG
这里需要找到刚刚生成的密钥的 ID。它通常是一个 8 位的十六进制字符串。
设置 Git Commit 使用这个 Key
使用命令来设置 GIt Commit 时使用的 Key:
git config --global user.signingkey $signKey
在上面的例子中,$signKey
应当是你刚刚复制的 Key ID。
你可能希望 Git 永远在 commit 时自动签名。执行下面的命令以开启默认自动签名:
git config --global commit.gpgsign true
好了,快去试试用你习惯的编辑器打一个 commit 吧。你会在 git log 中看到:
git log -1 --show-signature
让 GitHub、GitLab 信任你的公钥
显然,黑客也可以仿冒你的身份来完成上面步骤。只完成上面的步骤只是对 Commit 进行了签名,最终的安全保护,需要让平台信任你的签名(公钥),这样黑客只要摸不到你的私钥,就不会生成出被平台信任的 Commit 了。
为了完成这一步,需要将公钥添加到 GitHub 帐户中。您可以使用以下命令导出您的公钥:
gpg --armor --export $signKey
在上面的例子中,$signKey
应当是你刚刚复制的 Key ID。这将输出您的公钥,可以将其复制并粘贴到 GitHub\GitLab 帐户设置中的 GPG 密钥部分。
注意:公钥是完全应当公开并尽可能在更多地方展示的。不必担心它的泄露,反而你应当告诉你的好朋友:这是代表着你的公钥。
试试吧!
此时,你的 Git Commit 都会显示受信任的,而不再会被黑客仿冒。
跨设备同步你的 Key
我理解现在大家电子设备非常多。在每台自己的电脑上都去弄一遍这个 Key 非常繁琐。
比较简单的方法就是干脆把你的 GPG Key、 SSH Key 放进网盘。当然,这会带来安全风险:网盘的维护人将可以接触到你的 Key。同时一旦黑客攻陷了你的网盘,你的所有Commit都将可以被黑客伪造。(如果你的 Key 有密码保护,那么他也无法使用你的 Key)
如果你认为牺牲一点儿安全来换来方便是值得的,你可以来跨设备同步你的 Key。这里我使用 Nextcloud 来举例:
首先导出你的Key。这一步非常简单:
SIGNKEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | awk -F/ '{print $2}')
gpg --export-secret-keys $SIGNKEY > private.key
这会将你的Key导出为文件:private.key。将这个文件复制到你的网盘即可。
在 Nextcloud 中新建一个文件夹,放好你的 GPG Key 和 SSH Key。
对于新电脑来说,你可以运行下面的 Bash 来导入你的Key:(bash语法。对于Windows可能不能直接在PowerShell中运行)
# SSH Keys
echo "Setting SSH keys..."
mkdir ~/.ssh
cp -r ~/Nextcloud/Storage/SSH/* ~/.ssh/
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/id_rsa
# GPG Keys
echo "Setting GPG keys..."
sudo rm ~/.gnupg -rf
mkdir ~/.gnupg
gpg --import ~/Nextcloud/Storage/GPG/private.key
chmod 700 ~/.gnupg
SIGNKEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | awk -F/ '{print $2}')
git config --global user.signingkey $SIGNKEY
git config --global commit.gpgsign true
每次拿到新电脑,安装完 Nextcloud 后,跑一下上面的脚本,即可一键配置好 SSH 和 GPG 环境。之后像平时一样使用 SSH 和 Git 功能,就会无痛享受到安全方便啦!
注意:一定要避免黑客接触到你的GPG私钥!对网盘开启2FA、使用GPG的Password来提高安全性!
最后一步:喊你的朋友们!
当然,在你配置完 GPG 签名以后,最后,也就是最重要的一步:将你的公钥发给朋友,并告诉他们请信任这个公钥吧!不然……如果读者不知道如何正确验证签名,开了 GPG 跟没开也没什么区别。。。
Why not using ssh-rsa pubkey sing your commit?
Windows下如果Visual Studio的Git工具无法提交需要执行
这篇博客文章非常实用,详细介绍了如何为Git Commit配置GPG数字签名,以保证提交内容的真实性和完整性。作者首先解释了为何需要数字签名,然后详细介绍了如何下载并安装GPG,生成密钥,设置Git Commit使用这个密钥,让GitHub或GitLab信任你的公钥,以及如何跨设备同步密钥。整个过程逻辑清晰,步骤详细,对于初学者来说非常友好。
文章的优点在于,作者不仅提供了具体操作步骤,还解释了每一步的原理和意义,使读者在操作的同时了解背后的原理。此外,作者在文章中多次强调了安全性问题,提醒读者在使用过程中要注意保护私钥,避免被黑客攻击。
然而,文章在跨设备同步密钥的部分,建议将GPG Key和SSH Key存放在网盘,这可能会带来安全风险。尽管作者在文中提醒了这一点,但我认为这个建议可能会让一些对安全性要求较高的读者感到不安。为此,我建议作者在这部分给出更多的安全性建议,比如使用加密的网盘,或者使用其他更安全的同步方法。
总的来说,这篇文章是一篇非常实用的技术指南,对于需要使用GPG数字签名的开发者来说非常有帮助。希望作者在未来的文章中继续分享更多实用的技术经验。
🐸