在Github上使用GPG密钥
本文最后更新于 786 天前,其中的信息可能已经有所发展或是发生改变。

在使用Github提交时,发现通过Github页面提交的都有一个绿色的Verified,而通过本地SSH提交的没有这样的标识,当在启用了Github的警戒模式后,会出现黄色的Unverified,对于这个绿色的Verified,觉得又美观又舒心,满足强迫症(?),故发现了提交签名验证(commit signature verification)

commit signature verification

提交签名验证与GPG

提交签名验证: 使用 GPG、SSH 或 S/MIME,你可以在本地签署标签和提交,并且可以通过加密方式验证,这些标签或提交在GitHub上被标记为已验证,这样其他人就可以确信这些变化来自一个可信赖的来源。
对于大多数个人用户来说,GPG或SSH将是签署提交文件的最佳选择。S/MIME 签名通常需要在更大的组织范围内使用。SSH 签名的生成是最简单的。你甚至可以把你现有的认证密钥上传到GitHub,也可以作为签名密钥使用。生成 GPG 签名密钥比生成 SSH 密钥更复杂,但 GPG 具有 SSH 所没有的功能。当不再使用时,GPG 密钥可以过期或被撤销。GitHub将用这种密钥签名的提交显示为 "已验证",除非该密钥被标记为被破坏。SSH 密钥不具备这种能力。
提交和标签的验证状态如下,取决于你是否启用了警戒模式。默认情况下,警戒模式处于关闭状态。

默认情况

状态 说明
Verified 该提交已被签名,签名被成功验证。
Unverified 该提交有签名,但签名无法被验证。
No verification status 提交没有签名。

警戒模式开启

状态 说明
Verified 该提交有签名,签名被成功验证,而且提交者是唯一启用了警戒模式的作者。
Partially verified 提交有签名,签名也被成功验证,但提交的作者:a)不是提交者,b)启用了警戒模式。在这种情况下,提交的签名并不能保证作者的同意,所以提交只得到了部分验证。
Unverified 以下任何一种情况都是真的。
- 提交是有签名的,但签名无法被验证。
- 该提交没有签名,提交者启用了警戒模式。
- 该提交没有签名,而作者启用了警戒模式。

注意:只有当你签署了所有的提交和标签,并使用在GitHub上经过验证的电子邮件地址作为你的提交人电子邮件地址时,你才应该启用警戒模式。启用该模式后,你在本地生成并推送到 GitHub 的任何未签名的提交或标签都会被标记为 "未验证"。
(以上信息来源于github docs)

GPG: 也被称为GNU Privacy Guard (GnuPG),是对RFC 4880所定义的Open PGP标准的不同改编,是一个开源标准,它由Werner Koch开发,并在1999年发布。GnuPG允许你对你的数据和通信进行加密和签名;它有一个多功能的密钥管理系统,同时还有各种公钥目录的访问模块。GnuPG,也被称为GPG,是一个命令行工具,具有易于与其他应用程序集成的功能。有大量的前端应用程序和库可用。GnuPG还提供对S/MIME和Secure Shell(ssh)的支持。
(以上部分信息来源于GnuPG Website)

好了,枯燥乏味的概念介绍就到此为止,这次我们通过Windows下Git的commit来说明GPG Key是如何生成与使用的。

第一步、安装GPG

本篇主要是在Git中使用GPG,而Windows下Git发行版已经包含GPG,我们可以直接安装Git使用。打开Git Bash,输入gpg --version,可以看到gpg的版本信息,类似于

gpg (GnuPG) 2.2.29-unknown
libgcrypt 1.9.3-unknown
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /c/Users/.../.gnupg
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

尽量使用最新版本Git,避免使用出现问题。

第二步、生成GPG Key

Github目前支持的GPG key算法为: RSA、ElGamal、DSA、ECDH、ECDSA、EdDSA,可以随时到Github支持的GPG key密钥查看。
好了,现在我们打开Git Bash,由于GPG版本较多,如果下面什么命令或显示不一致,可到GnuPG Website或者其他权威网站查阅适配的说明。

  1. 生成GPG密钥对
    • 如果你使用的是2.1.17或更高版本的GPG,使用以下命令
      gpg --full-generate-key
    • 如果你使用的是低于2.1.17版本的GPG,那么需要使用以下命令,并跳转到步骤4
      gpg --default-new-key-algo rsa4096 --gen-key
  2. 选择你想使用的密钥类型,或直接按Enter接受默认值
  3. 输入你想生成的密钥长度,Github所能接收的密钥长度至少为4096,这里要注意,不要直接就接受了默认值
  4. 输入密钥过期时间,如果非必要,可以直接按Enter接受默认值,即永不过期
  5. 询问以上是否正确,如正确,请输入y确认
  6. 输入你的用户名
  7. 输入已在Github已验证的邮箱地址,如启用了不公开邮箱地址,请使用Github提供的邮箱地址
  8. 输入注释,即对这个密钥的标签,防止后续生成过多密钥而忘记密钥用途,不影响密钥的生成
  9. 输入安全密码,请保存好该密码,以后提交时,需输入该密码验证
  10. 询问是否更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?确认无误后输入O确认生成
  11. 列出你同时拥有公钥和私钥的 GPG 密钥的长格式
    gpg --list-secret-keys --keyid-format=long

    输出类似于

    /Users/hubot/.gnupg/secring.gpg
    ------------------------------------
    sec   rsa4096/3AA5C34371567BD2 2022-11-02 [SC]
          863542651SDB9B965F9C4JN8E34F061SDF752630
    uid                 [ultimate] Hubot (github) 
    ssb   rsa4096/4BB6D45482678BE3 2022-11-02 [E]
  12. 使用以下命令输出GPG密钥,本示例中,密钥ID为3AA5C34371567BD2
    gpg --armor --export 密钥ID

    输出由-----BEGIN PGP PUBLIC KEY BLOCK-----开头,-----END PGP PUBLIC KEY BLOCK-----结尾的密钥,复制密钥,接下来我们将密钥添加到Github账户中,注意,复制请包含-----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----

第三步、添加GPG Key到Github

  1. 进入Github账户的设置页面
  2. 在侧边栏的Access部分,点击SSH and GPG keys
  3. 在GPG keys部分,点击New GPG key
  4. Title请按照你的习惯填写,将上一步生成复制的密钥粘贴到Key部分
  5. 点击Add GPG key
  6. 输入Github密码,确认操作

第四步、对commit签名

  1. 在Git Bash中设置主要的GPG签名密钥,使用以下命令,本示例中,密钥ID为3AA5C34371567BD2
    git config --global user.signingkey 密钥ID

    或者你可以使用子项来设置,需要在结尾包含!,本示例中,子项密钥ID为4BB6D45482678BE3

    git config --global user.signingkey 子密钥ID!
  2. 在提交时添加-S参数
    git commit -S -m "..."
  3. 弹出对话框,输入之前设置的安全密码验证身份
  4. (可选)如果每次默认对所有提交都签名,使用以下命令设置
    git config --global commit.gpgsign true

第五步、(可选)信任Github的GPG密钥

完成以上步骤后,其实就可以正常使用了,但是如果我们使用git log --show-signature命令查看本地仓库的信息时,可能会看到类似以下的信息

commit 2f2v3bpgiwkhw2kzbdidmwzwaroemkd37vxdoc4u
gpg: Signature made Thu Sep  1 21:58:20 2022
gpg:                using RSA key 4AEE18F83AFDEB23
gpg: Can't check signature: No public key
Author: Hubot <25420368+hubot@users.noreply.github.com>
Date:   Thu Sep 1 21:58:20 2022 +0800

    Initial commit

因为我们可能有一部分使用的是Github网页端进行的操作,是由Github进行的签名,本地没有Github的签名密钥,故无法验证,不影响正常使用,但如果觉得这样看着很不舒心,可以进行下面的操作。

  1. 打开git bash
  2. 导入Github的GPG Key,使用以下命令
    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   1251      0 --:--:-- --:--:-- --:--:--  1252
    gpg: key 4AEE18F83AFDEB23: "GitHub (web-flow commit signing) " not changed
    gpg: Total number processed: 1
    gpg:              unchanged: 1
  3. 信任Github的GPG Key,使用以下命令,4AEE18F83AFDEB23即我们在输出中看到的密钥ID
    gpg --sign-key 4AEE18F83AFDEB23
  4. 确认信任签名后,输入y

完成后我们重新使用git log --show-signature命令查看,就会发现从Github网页端进行的操作,都可以正常查验了。

写在最后

至此,我们完成了所有的操作,也应拿到了绿色的Verified标识,但是我们要知道,GPG的功能不只这一点,比如邮件加密、文件加密,都需要我们去研究学习。
感谢看到这里的你,如有任何需要交流的问题,都可在下方留言,我会及时回复。

*在2022年8月23日GitHub支持SSH提交验证,但要注意SSH签名验证在Git 2.34或更高版本中可用,如需使用,请先检查你的Git版本。

评论

  1. 上杉夏相
    Windows Edge 108.0.1462.76
    2 年前
    2023-1-08 16:24:01

    觉得又美观又舒心,满足强迫症 (?)
    博主不来张图片展示一下嘛?

    • 博主
      上杉夏相
      Windows Edge 108.0.1462.76
      2 年前
      2023-1-08 18:01:55

      好呢

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇