概述
GPG 是一种加密算法,在 Git 中提交 Commit 时可以使用 GPG 进行加密,来保证提交的 Commit 没有被篡改,具体体现在 Github 提交的时候会有一个 verified 的标志。
这里我是在 Windows 下操作来生成 GPG 密钥的,其他系统环境下操作可能会有不同
准备工作
生成GPG密钥之前,可以检查当前电脑是否存在有 GPG 密钥
1 打开 Git Bash
2 使用 gpg --list-secret-keys --keyid-format LONG
命令列出同时具有公共密钥和私有密钥的GPG密钥。签名提交或标记需要私钥。
gpg --list-secret-keys --keyid-format LONG
3 检查命令输出以查看是否具有 GPG 密钥
如果没有GPG密钥对,则生成一个新的GPG密钥
生成一个新的GPG密钥
1 下载并安装适用于您的操作系统的 GPG 命令行工具,这里我安装的是 Windows 版
官方下载地址:https://www.gnupg.org/download/
下载完成后一路下一步安装即可
2 打开 Git Bash
3 生成一个GPG密钥
如果您使用的是2.1.17或更高版本,请粘贴以下文本以生成GPG密钥
$ gpg --full-generate-key
如果您未使用2.1.17或更高版本,则该gpg --full-generate-key
命令不起作用。粘贴下面的文本,然后跳到步骤6。
$ gpg --default-new-key-algo rsa4096 --gen-key
4 这里让选择加密算法,这里我使用的默认的RSA and RSA
5 这里让选择密钥长度,我选择 4096
6 这里让输入密钥有效的时间长度。这里我选择默认,表示该密钥没有过期时间,即永不过期
7 这里让再次确认一下
8 输入用户的ID信息
依次输入真实姓名、电子邮件地址和注释组合成用户标识,其中注释这一栏可以省略
确认输入的信息是否正确,输入O确认
9 这里让输入密码来保护秘钥
连续输入两次密码,一个 GPG 密钥就创建完毕了
10 这时可以使用 gpg --list-secret-keys --keyid-format LONG
命令来列出同时具有公共密钥和私有密钥的GPG密钥
11 从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
12 使用以下命令来打印出指定ID的GPG密钥,将命令中的ID替换为你的GPG密钥ID
$ gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format
13 复制您的GPG密钥,以-----BEGIN PGP PUBLIC KEY BLOCK-----开头和-----END PGP PUBLIC KEY BLOCK-----结尾
将GPG密钥添加到您的GitHub帐户
1 在Github的右上角,点击个人资料照片,然后点击设置
2 用户设置边栏中,点击SSH and GPG keys
3 点击新建 New GPG key
4 粘贴刚刚复制的 GPG key,可以将其备份起来,方便以后导入
5 输入Github密码,确认操作,GPG密钥就添加到Github中了
开启全局GPG签名
git config --global user.signingkey 3AA5C34371567BD
测试
$ git commit -a -S -m "add test.txt"
命令中的-S即是开启GPG签名,这样每次提交的时候都要加上-S,输入GPG的密码即可提交成功
如果默认就自动使用GPG签名的话,可以设置提交的时候默认使用GPG签名
git config --global commit.gpgsign true
导出GPG密钥
在多台电脑上操作的时候经常会涉及到 GPG 公钥/私钥的导入导出,比方说 GitHub 支持 GPG 加密 Commit,在多台电脑上使用相同的 Key 可以省去很多配置工作。
1 列出本地所有的密钥,"3AA5C34371567BD2"即是密钥ID
$ 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
2 根据ID导出相应的公钥和私钥,并输入密码,即可导出到用户目录下
gpg --output mygpgkey_pub.gpg --armor --export 3AA5C34371567BD2
gpg --output mygpgkey_sec.gpg --armor --export-secret-key 3AA5C34371567BD2
导入GPG密钥
1 将密钥放入用户目录下
2 导入GPG密钥
gpg --import ~/mygpgkey_pub.gpg
gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg
虽然所有功能都正常,但无论输入什么命令,只要是跟GPG相关的,都会弹出警告:“gpg: Warning: Enabling DEP failed: �ܾ����ʡ� (0,1)”该怎么解决呀?
我的邮箱是:suinian666@gmail.com
微信是:NianBroken
辛苦大佬帮忙看一下我的问题。
其实这里的GPG Key与其说是【加密】commit不如说是【签名】吧 hhh
包括在英文中也被称之为 Signed Git commits
因为 Git 机制里面有一个漏洞,就是 user.email 可以设置为任何你想要的邮件地址;也就是说,攻击者完全可以以你的名义创建 commit,如果攻击者同时还具有 repo 的 push 权限的话,就可以将这些伪造的 commit 上传进 repo。
为了防止攻击者伪造 commit,才引入了 GPG 这一个非对称加密的软件用于确保 commit 的真实性。因为理论上私钥是只有你个人持有的,通过私钥签名后的信息可以通过你分发的公钥进行验证(神奇的密码学hhh)
碰见职业选手了 哈哈
网上介绍 Git 全都用 SSH key,没人讲 GPG,学习了