Git GnuPG 配置教程
本文中代码样例为Windows Shell代码
什么是 GPG
来由
Q:我用 Git 提交了一个变更,可是 Git 只记录了我的姓名和邮箱,怎样才能确保不被坏人冒名顶替?
这是一个非常简单的问题
A:加签验证呗
所以,GPG就来了
介绍
GNU Privacy Guard(GnuPG或GPG )是一种加密软件,它是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环境变量”
点击_环境变量_,在_系统变量_中选择path
,点击_编辑_,添加 C:\Program Files\Git\usr\bin
一路确定保存,重启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(设置)
- 在用户设置侧边栏中,单击 SSH and GPG keys(SSH 和 GPG 密钥)
- 单击 New GPG key(新 GPG 密钥)
- 在 "Key"(密钥)字段中,粘贴在生成 GPG 密钥时复制的 GPG 密钥
- 单击 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 密钥密码,以便无需在每次对提交签名时输入该密码,我们建议使用以下工具:
您也可以手动配置 gpg-agent 以保存 GPG 密钥密码,但这不会与 Mac OS 密钥链(如 ssh 代理)集成,并且需要更多设置。
- 当本地分支中的提交更改时,请将 S 标志添加到 git commit 命令
git commit -S -m your commit message
- 如果您使用 GPG,则创建提交后,需要输入您生成 GPG 密钥时设置的密码
- 在本地完成创建提交后,将其推送到 GitHub 上的远程仓库
git push
- 在 GitHub 上,导航到您的拉取请求
- 在拉取请求中,单击 Commits(提交)
- 要查看关于已验证签名的更多详细信息,请单击 Verified(已验证)
对 Tag 签名
您可以使用 GPG 或 S/MIME 在本地对标记进行签名
- 要对标记签名,请将
-s
添加到您的git tag
命令
git tag -s mytag
- 通过运行
git tag -v [tag-name]
验证您签名的标记
git tag -v mytag