170 lines
7 KiB
Markdown
170 lines
7 KiB
Markdown
---
|
||
slug: macos-gpg-sign-git-commit
|
||
|
||
summary: 太好了,小氯,你可是解决了大问题啊。
|
||
tags:
|
||
- Git
|
||
- 折腾
|
||
- GPG
|
||
title: macOS配置GPG签名Git提交
|
||
date: 2024-07-23
|
||
description: 本文详细介绍了如何在macOS上使用GPG签名来验证提交者身份的过程。作者从GPG的历史和功能开始,讲述了其加密和签名的重要性,接着指导读者如何在Mac上安装和配置GPG,包括生成密钥对、在GitHub上设置GPG密钥,以及如何配置Git和VS Code以支持GPG签名。文章还提到了Obsidian Git的配置,并分享了一些解决常见问题的经验。通过这些步骤,用户可以确保他们的Git提交是经过验证的,增强了提交的安全性和可信度。
|
||
categories: ["图灵机"]
|
||
featuredImage: https://img.viento.cc/cover/macos-gpg-sign-git-commit-cover.webp
|
||
draft: false
|
||
---
|
||
|
||
各位老友们好,我是 Chlorine。
|
||
|
||
闲来无事水篇文章,记录一下我刚刚解决的一个心头大患。
|
||
|
||
## 前言
|
||
|
||
在咱们看 GitHub 上的 commit 的时候,往往会看到这样的情景:
|
||
|
||

|
||
|
||
那边那个好看的绿色 badge 是怎么来的捏?咱们可以猜一下。Verified,经过验证的,那验证的是什么?自然是提交者的身份,标明这个提交是由仓库的作者亲笔所为,而不是由路边的哪个路人甲或者是不怀好意有 bear 来的攻击者提交的。
|
||
|
||
那怎么做这种「我是我」的证明呢?方法就是通过咱们今天要讲的 GPG signing。
|
||
|
||
## What's GPG?
|
||
|
||
以下内容来自 [Wikipedia](https://zh.wikipedia.org/wiki/GnuPG):
|
||
|
||
> GNU Privacy Guard(GnuPG 或 GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。
|
||
|
||
嗯,好像懂了,又好像没懂,听君一席话,如听一席话。
|
||
|
||
简单来说吧。这个故事要从 1991 年开始讲起。那个时候有一个程序员大神,名叫Phil Zimmermann。PZ 这人呢,是个极其看重隐私的「偏执狂」(注:这个词没有贬义)。为了躲避烦人的监管,他自己写了一个名叫 PGP 的东西。PGP,全称是Pretty Good Privacy,是一个用来给 Email 和各种信息加密的东西。
|
||
|
||
这玩意有什么用呢?比方说,你给你的朋友写了一封邮件并且使用 PGP 进行了加密,内容是:
|
||
|
||
> 今天下午天气不错,要不要约个饭?听说酸菜鱼窗口出了新的番茄锅底!
|
||
|
||
有了加密,即使是你的邮件被截获了,截获者打开一看,由于没有「钥匙」,只能看到里面写的是:
|
||
|
||
> 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣! 玛卡, 巴卡,阿巴,雅卡,伊卡,阿卡,噢! 哈姆,达姆,阿卡嗙,咿呀呦~ 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣!
|
||
|
||
监管者:?(`黑人问号.webp`)
|
||
|
||
但是你拥有「钥匙」的朋友,却能完整地读到你的邮件。这样就保证了隐私的安全。
|
||
|
||
那这个功能难道不能破解吗?理论上当然可以,但是难度基本相当于让你一粒一粒捡完现在撒哈拉沙漠的沙子。
|
||
|
||
听起来是个好东西,对吧?很可惜,PGP 是个商业软件。
|
||
|
||
这就有点坑爹了。所幸,万能的开源社区早就帮我们搓出来了一个符合 OpenPGP 标准的完美替代品,那就是 GNU Privacy Guard,简称 GNUPG 或者 GPG。这中间还有很多困难,但是已经被我们伟大的前辈们一一克服了。咱们这群后辈只要坐享其成就可以了。
|
||
|
||
GPG 的应用极其广泛,包括但是不限于邮件加密、文件完整性验证等。当然了,今天我们只讲 Git commit signing。
|
||
|
||
## 安装 GPG
|
||
|
||
OK,废话讲完了,咱们正式开始配置 GPG。
|
||
|
||
首先我们需要安装 GPG,自然还是用万能的 Homebrew:
|
||
|
||
```bash
|
||
brew update
|
||
brew install gpg
|
||
brew install pinentry-mac
|
||
```
|
||
|
||
(如果您连 Homebrew 都没安装,或者都不知道是啥,我合理怀疑您是否真的是 Mac 的持有者以及用得到 GPG Git 的人。)
|
||
|
||
安装完成之后,检测一下安装是否成功:
|
||
|
||
```bash
|
||
gpg --version
|
||
# 别的命令也行
|
||
```
|
||
|
||
## 修改配置文件
|
||
|
||
下面的内容实际上就是写入文件,大家大可以各显神通。
|
||
|
||
```bash
|
||
echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
|
||
echo "use-agent" >> ~/.gnupg/gpg.conf
|
||
echo 'export GPG_TTY=$(tty)' >> ~/.zshrc # 如果你用的不是 Zsh,请根据你的终端修改
|
||
```
|
||
|
||
然后重启电脑。
|
||
|
||
## 生成 GPG 密钥对
|
||
|
||
GPG 的工作需要一对公私钥。重启之后,我们来生成我们所需的密钥。
|
||
|
||
键入命令:
|
||
|
||
```bash
|
||
gpg --full-generate-key
|
||
```
|
||
|
||
会出现一些交互式命令行选项,大部分按照默认即可。姓名、邮箱和备注按照自己的情况填写(邮箱推荐填写自己用于 Git 提交、且在相关平台——如 GitHub 上绑定过的邮箱)。
|
||
|
||
注意!关键来了!下一步应该是输入密码,但是你应该看见的是一个**类似这样的 GUI**:
|
||
|
||

|
||
|
||
而不是一个命令行 UI!
|
||
|
||
密码随便写,记得一定要勾选「存储在钥匙串中」的选项!
|
||
|
||
生成密码后,我们键入:
|
||
|
||
```bash
|
||
gpg --list-secret-keys --keyid-format LONG
|
||
```
|
||
|
||
然后应该会输出一串类似这样的东西:
|
||
|
||
```bash
|
||
/Users/chlorine/.gnupg/pubring.kbx
|
||
----------------------------------
|
||
sec ed25519/xxxxxxxxx 2024-07-23 [SC]
|
||
yyyyyyyyyyyyyyyyyyyyyyy
|
||
uid [ 绝对 ] (你的相关信息)
|
||
ssb cv25519/zzzzzzzzzzz 2024-07-23 [E]
|
||
```
|
||
|
||
把 `xxxxxxxxxx` 对应的那一串字符复制下来,这就是你的 Key。
|
||
|
||
然后键入:
|
||
|
||
```bash
|
||
gpg --armor --export <你的 Key,不带两边的尖角括号,下同>
|
||
```
|
||
|
||
把输出的东西复制一下,注意,`-----BEGIN PGP PUBLIC KEY BLOCK-----` 和 end 的也要复制。
|
||
|
||
在[这里](https://github.com/settings/keys)配置你的 GPG 密钥,名字随便起,把刚才那一堆粘进去就行。Gitee 和 Codeberg 同理。
|
||
|
||
## 配置 Git
|
||
|
||
生成密钥后,我们略略配置一下 Git:
|
||
|
||
```bash
|
||
git config --global commit.gpgsign true
|
||
git config --global user.signingkey <你的 Key>
|
||
git config --global gpg.program /opt/homebrew/bin/gpg
|
||
```
|
||
|
||
## 配置 VS Code
|
||
|
||
VS Code 内置了方便的 Git GUI,但是如果不合理配置,就无法对 Git commit 进行签名,从而出现各种奇奇怪怪的问题。
|
||
|
||
说来也简单,如果你严格地按照我们上面的步骤走的话,直接在设置中搜索 `git.enableCommitSigning` 并启用即可。
|
||
|
||
## Obsidian Git
|
||
|
||
不需要任何配置,直接用就行了。因为我们刚在 Git 里面配置了 GPG 程序的位置,应该不会出现找不到 GPG 的错误。
|
||
|
||
## 结语
|
||
|
||
GPG 这个事我配了不知道多少次,经常出现 GPG failed to sign the data。我知道应该是在图形界面没法配置密码输入,但是不知道怎么解决,心很累。所幸是搞好了。作文以记之,
|
||
|
||
## 参考资料
|
||
|
||
1. https://github.com/microsoft/vscode/wiki/Commit-Signing
|
||
2. https://github.com/Vinzent03/obsidian-git/issues/21
|