Cover

Git GnuPG 配置教程

· Technology

本文中代码样例为Windows Shell代码

什么是 GPG

来由

Q:我用 Git 提交了一个变更,可是 Git 只记录了我的姓名和邮箱,怎样才能确保不被坏人冒名顶替?

这是一个非常简单的问题

A:加签验证呗

所以,GPG就来了

介绍

GNU Privacy GuardGnuPGGPG )是一种加密软件,它是PGP加密软件的满足GPL的替代物。GnuPG依照由IETF订定的OpenPGP技术标准设计。GnuPG用于加密、数字签名及产生非对称钥匙对的软件

GnuPG是自由软件基金会的GNU计划的一部分,目前受德国政府资助。以GNU通用公共许可证第三版(GPLv3)许可

功能

GnuPG使用用户自行生成的非对称密钥对来加密信息,由此产生的公钥可以同其他用户以各种方式交换,如密钥服务器。他们必须小心交换密钥,以防止得到伪造的密钥

GnuPG还可以向信息添加一个加密的数字签名,这样,收件人可以验证信息完整性和发件人。 GnuPG不利用专利或其他方式限制软件或算法,就像IDEA算法一开始出现在PGP中一样(可以通过下载相关插件在GnuPG中使用IDEA算法,不过如果在一些IDEA算法为专利的国家中使用,可能需要一份许可)

GnuPG同样也使用各种其他非专利的算法:

  • 分组密码:CAST5、Camellia、Triple DES、AES、Blowfish、Twofish
  • 非对称加密密码:ElGamal、RSA
  • 加密哈希:RIPEMD-160、MD5、SHA-1、SHA-2、Tiger
  • 数字签名:DSA、RSA

GnuPG是一个混合加密软件程序,它使用常规对称密钥提高加密速度,使用公钥便于交换

通常使用一次性的收件人公钥用以加密会话。

在本文中,GPG会用于Git加密


配置

GPG 应用程序

Git会内置GPG,因此只要找到即可

获取Git路径

where git

C:\Program Files\Git\bin\git.exe #这只是我的路径,你的可能不同

在Git的母文件夹搜索 gpg.exe ,切记要包括子文件夹

我的GPG路径是 C:\Program Files\Git\usr\bin\gpg.exe

为了方便起见,我们可以将其目录加入Path环境变量

按win搜索path即可,你也可以百度搜索“如何添加Path环境变量”

Image

点击_环境变量_,在_系统变量_中选择path,点击_编辑_,添加 C:\Program Files\Git\usr\bin

Image

一路确定保存,重启cmd,测试GPG是否可以直接调用

gpg --version

gpg (GnuPG) 2.2.27-unknown
libgcrypt 1.8.7
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later [https://gnu.org/licenses/gpl.html](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: /c/Users/ssnig/.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

如上即为成功

检查现有 GPG 密钥

在生成 GPG 密钥之前,你可以检查是否有任何现有的 GPG 密钥。

GitHub 支持多种 GPG 密钥算法。 如果您尝试添加使用不支持的算法生成的密钥,可能会发生错误。

  • RSA
  • ElGamal
  • DSA数字签名算法
  • ECDH
  • ECDSA
  • EdDSA

打开cmd

使用 gpg --list-secret-keys --keyid-format=long 命令列出您拥有其公钥和私钥的长形式 GPG 密钥(签名提交或标记需要私钥)

gpg --list-secret-keys --keyid-format=long

/c/Users/ssnig/.gnupg/pubring.kbx
---------------------------------
sec   rsa4096/B8D556F3BDA03950 2021-08-18 [SC]
      7A0E335EEB59E40792AD086FB8D556F3BDA03950
uid                 [ultimate] Haoran Qin (AHdark) <ahdark@outlook.com>
ssb   rsa4096/DCC682F3157E6B86 2021-08-18 [E]

Linux上的一些 GPG 安装可能需要使用 gpg2 --list-keyid-form LONG 查看您现有密钥的列表。 在这种情况下,您还需要运行 git config --global gpg.program gpg2 来配置 Git 使用 git gpg2

检查命令输出以查看是否有 GPG 密钥对

如果没有 GPG 密钥对,或者您不想使用任何可用于签名提交和标记的密钥对,则生成新的 GPG 密钥

如果存在现有的 GPG 密钥对并且您要将其用于签名提交和标记,则将 GPG 密钥添加到 GitHub 帐户

生成 GPG 密钥

上文你查看了gpg版本

  • 如果您使用的是 2.1.17 或更高版本,请粘贴以下文本以生成 GPG 密钥对。gpg --full-generate-key

  • 如果使用的不是 2.1.17 或更高版本,请粘贴以下文本 gpg --default-new-key-algo rsa4096 --gen-key

  • 在提示时,指定要生成的密钥类型,或按 Enter 键接受默认的 RSA and RSA

  • 输入所需的密钥长度,密钥必须至少是 4096

  • 输入密钥的有效时长,按 Enter 键将指定默认选择,表示该密钥不会过期

  • 验证您的选择是否正确,输入您的用户 ID 信息

要求输入电子邮件地址时,请确保输入你 GitHub 帐户的经验证电子邮件地址

要保持电子邮件地址私密,请使用 GitHub 提供的 no-reply 电子邮件地址

  • 输入安全密码
  • 使用 gpg --list-secret-keys --keyid-format=long 命令列出您拥有其公钥和私钥的长形式 GPG 密钥,签名提交或标记需要私钥
  • 从 GPG 密钥列表中复制您想要使用的 GPG 密钥 ID 的长形式。 在此例中,GPG 密钥 ID 是 3AA5C34371567BD2
gpg --list-secret-keys --keyid-format=long

/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot 
ssb   4096R/42B317FD4BA89E7A 2016-03-10
  • 粘贴下面的文本(替换为您要使用的 GPG 密钥 ID)。 在此例中,GPG 密钥 ID 是 3AA5C34371567BD2
gpg --armor --export 3AA5C34371567BD2

# Prints the GPG key ID, in ASCII armor format
  • 复制 GPG 密钥,从 -----BEGIN PGP PUBLIC KEY BLOCK----- 开始,到 -----END PGP PUBLIC KEY BLOCK----- 结束

将 GPG 秘钥添加至 GitHub 账户

  • 在任何页面的右上角,单击您的个人资料照片,然后单击 Settings(设置)
Image
  • 在用户设置侧边栏中,单击 SSH and GPG keys(SSH 和 GPG 密钥)
Image
  • 单击 New GPG key(新 GPG 密钥)
Image
Image
  • 单击 Add GPG key(添加 GPG 密钥)
  • 要确认操作,请输入您的 GitHub 密码

将 GPG 添加至 Git

  • 使用 gpg --list-secret-keys --keyid-format=long 命令列出您拥有其公钥和私钥的长形式 GPG 密钥
  • 从 GPG 密钥列表中复制您想要使用的 GPG 密钥 ID 的长形式。 在此例中,GPG 密钥 ID 是 3AA5C34371567BD2
gpg --list-secret-keys --keyid-format=long

/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot 
ssb   4096R/42B317FD4BA89E7A 2016-03-10
  • 要在 Git 中设置 GPG 签名密钥,请粘贴下面的文本,替换您想要使用的 GPG 密钥 ID。 在此例中,GPG 密钥 ID 是 3AA5C34371567BD2
git config --global user.signingkey 3AA5C34371567BD2
  • 你还需要设置Git提交时所需的电子邮件,需与GPG 签名秘钥的电子邮件相同
git config --global user.email octocat@github.com

应用

如果你使用VSCode、JetBrains系软件等,你可以直接在设置中选择使用GPG,无需额外设置

对 Commit 签名

GitHub Desktop 不支持提交签名

要将您的 Git 客户端配置为默认对本地仓库的提交签名,请在 Git 版本 2.0.0 及更高版本中,运行 git config commit.gpgsign true。 要在计算机上的任何本地仓库中默认对所有提交签名,请运行 git config --global commit.gpgsign true

要存储 GPG 密钥密码,以便无需在每次对提交签名时输入该密码,我们建议使用以下工具:

  • 对于 Mac 用户,GPG Suite 允许您在 Mac OS 密钥链中存储 GPG 密钥密码。
  • 对于 Windows 用户,Gpg4win 将与其他 Windows 工具集成。

您也可以手动配置 gpg-agent 以保存 GPG 密钥密码,但这不会与 Mac OS 密钥链(如 ssh 代理)集成,并且需要更多设置。

  • 当本地分支中的提交更改时,请将 S 标志添加到 git commit 命令
git commit -S -m your commit message
  • 如果您使用 GPG,则创建提交后,需要输入您生成 GPG 密钥时设置的密码
  • 在本地完成创建提交后,将其推送到 GitHub 上的远程仓库
git push
  • 在 GitHub 上,导航到您的拉取请求
  • 在拉取请求中,单击 Commits(提交)
  • 要查看关于已验证签名的更多详细信息,请单击 Verified(已验证)
Image

对 Tag 签名

您可以使用 GPG 或 S/MIME 在本地对标记进行签名

  • 要对标记签名,请将 -s 添加到您的 git tag 命令
git tag -s mytag
  • 通过运行 git tag -v [tag-name] 验证您签名的标记
git tag -v mytag

Comments

Send Comments

Markdown supported. Please keep comments clean.