目录

为 Github 仓库的代码提交添加 Verified?用 GnuPG !

目录
  1. 安装
brew search GnuPG

gpg  --version
# 输出
gpg (GnuPG) 2.3.4
libgcrypt 1.10.0
Copyright (C) 2021 Free Software Foundation, Inc.
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: /Users/yuhanliu/.gnupg
支持的算法:
公钥: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
密文: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
    CAMELLIA128, CAMELLIA192, CAMELLIA256
AEAD: EAX, OCB
散列: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:  不压缩, ZIP, ZLIB, BZIP2
  1. 生成秘钥
gpg --full-generate-key
# 交互
gpg (GnuPG) 2.3.4; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥类型:
   (1) RSA 和 RSA
   (2) DSA 和 Elgamal
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (9) ECC(签名和加密) *默认*
  (10) ECC(仅用于签名)
 (14)卡中现有密钥
您的选择是? 1
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 4096
请求的密钥长度是 4096请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
这些内容正确吗? (y/N) y

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: dfface
电子邮件地址: dfface@sina.com
注释: www.yuhan.tech
您选定了此用户标识:
    “dfface (www.yuhan.tech) <dfface@sina.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? C
注释: yuhan
您选定了此用户标识:
    “dfface (yuhan) <dfface@sina.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵。
gpg: /Users/yuhanliu/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 目录‘/Users/yuhanliu/.gnupg/openpgp-revocs.d’已创建
gpg: 吊销证书已被存储为‘/Users/yuhanliu/.gnupg/openpgp-revocs.d/CB4ECE2F86B5642C2C41E5339988D3E2BC9121DF.rev’
公钥和私钥已经生成并被签名。
  1. 导出秘钥
gpg --list-secret-keys --keyid-format=long
# 输出
gpg: 正在检查信任度数据库
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深度:0  有效性:  1  已签名:  0  信任度:0-,0q,0n,0m,0f,1u
/Users/yuhanliu/.gnupg/pubring.kbx
----------------------------------
sec   rsa4096/9988D3E2BC9121DF 2022-03-25 [SC]
      CB4ECE2F86B5642C2C41E5339988D3E2BC9121DF
uid                   [ 绝对 ] dfface (yuhan) <dfface@sina.com>
ssb   rsa4096/745C57B0FC093FCC 2022-03-25 [E]

# 导出秘钥,使用刚才查询出来的 GPG 密钥 ID ,这里使用的是简短形式,长的那个uid是完整的
gpg --armor --export  9988D3E2BC9121DF
  1. 复制公钥到 GitHub

Settings(设置) -> Access -> SSH and GPG keys -> New GPG key(新 GPG 密钥)

  1. 对 Commit 进行签名
git config --global user.signingkey 9988D3E2BC9121DF

# 每次 Commit 可以如此使用,以创建 signed commit
git commit -S -m "..."
# 每次 Tag 可以如此使用,以创建 signed tag
git tag -s mytag
git tag -v [tag-name]  # 用于验证

# 在计算机上的任何本地仓库中默认对所有提交签名,提供的便利是 :不需要每次都手动加上-S
git config --global commit.gpgsign true

还可以安装 GPG 的相关工具,GitHub 的推荐。 要存储 GPG 密钥密码,以便无需在每次对提交签名时输入该密码,我们建议使用以下工具: 对于 Mac 用户,GPG Suite 允许您在 Mac OS 密钥链中存储 GPG 密钥密码。 对于 Windows 用户,Gpg4win 将与其他 Windows 工具集成。

我安装了这个,可以用来导出私钥,还可以把自己的公钥上传到某个公钥服务器(hkps://keys.openpgp.org):

brew install --cask gpg-suite-no-mail

  1. 信任Github的GPG公钥

GitHub will automatically use GPG to sign commits you make using the GitHub web interface. Commits signed by GitHub will have a verified status on GitHub. You can verify the signature locally using the public key available at https://github.com/web-flow.gpg. The full fingerprint of the key is 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23. You can optionally choose to have GitHub sign commits you make in Codespaces. For more information about enabling GPG verification for your codespaces, see “Managing GPG verification for Codespaces.”

# 先导入公钥
curl https://github.com/web-flow.gpg | gpg --import
# 输出
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   919  100   919    0     0    300      0  0:00:03  0:00:03 --:--:--   300
gpg: 密钥 4AEE18F83AFDEB23:公钥 “GitHub (web-flow commit signing) <noreply@github.com>” 已导入
gpg: 处理的总数:1
gpg:               已导入:1

# 再信任公钥(用自己的密钥为其签名验证,需要输入密码)
gpg --sign-key 4AEE18F83AFDEB23
# 输出
pub  rsa2048/4AEE18F83AFDEB23
     创建于:2017-08-16  有效至:永不       可用于:SC
     信任度:未知        有效性:未知
[ 未知 ] (1). GitHub (web-flow commit signing) <noreply@github.com>


pub  rsa2048/4AEE18F83AFDEB23
     创建于:2017-08-16  有效至:永不       可用于:SC
     信任度:未知        有效性:未知
 主密钥指纹: 5DE3 E050 9C47 EA3C F04A  42D3 4AEE 18F8 3AFD EB23

     GitHub (web-flow commit signing) <noreply@github.com>

您真的确定要签名这个密钥,使用您的密钥
“dfface (yuhan) <dfface@sina.com>” (9988D3E2BC9121DF)

真的要签名吗?(y/N) y

# 然后可以去仓库看看,会发现GitHub签名都被验证了
git log --show-signature
# 输出

commit 1872a94eef67a104e56598b0fa54fbc2e6871fe1 (HEAD -> main, origin/main, origin/HEAD)
gpg: 签名建立于 四  3/24 22:31:40 2022 CST
gpg:               使用 RSA 密钥 4AEE18F83AFDEB23
gpg: 正在检查信任度数据库
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深度:0  有效性:  1  已签名:  1  信任度:0-,0q,0n,0m,0f,1u
gpg: 深度:1  有效性:  1  已签名:  0  信任度:1-,0q,0n,0m,0f,0u
gpg: 完好的签名,来自于 “GitHub (web-flow commit signing) <noreply@github.com>” [完全]
Author: dfface <49226204+dfface@users.noreply.github.com>
Date:   Thu Mar 24 22:31:40 2022 +0800

    Initial commit