目录
1. 关于 GPG
1.1. GPG 是什么?
GnuPG,即 GNU Privacy Guard (GPG) 是一个密码学软件,用于加密、签名内容及管理非对称密钥。
GPG 的核心是 GPG 密钥对,分为公钥和私钥。在密码学技术上,GPG 可以使用若干不同的加密算法来向外提供加密解密服务。
1.2. KEYID 是什么?
KEYID 就是你的 GPG Key 指纹的缩短版:
Long Fingerprint 的末尾 16 位数字
Short Fingerprint 的末尾 8 位数字
在很多命令中,--keyid-format [none|short|0xshort|long|0xlong] 可以决定 KEYID 的显示格式。
1.3. USER-ID 是什么?
USER-ID 通常是指你为邮箱地址所关联的姓名字段,有时候也指所关联的注释文本。
2. 安装 GPG
2.1. macOS
2.2. windows
https://gpg4win.org/download.html
2.3. Linux
gpg --version # 查看是否安装
sudo apt-get install -y gnupg
sudo yum install -y gnupg
3. GPG 密钥管理
3.1. 生成 GPG 密钥对
gpg --full-generate-key
- gpg 密钥是与 email 绑定的,它是一个身份证明。
- 算法建议选择默认值 RSA,其用途是完整的。
- 密钥强度首选 4096 bits。
- 建议生成一个不过期的根密钥,然后再建立若干子密钥,用于不同的用途。
3.2. 列出密钥
# 列出公钥和指纹
gpg --list-keys --keyid-format=short
# 列出私钥和指纹
gpg --list-secret-keys -keyid-format=short
参数 --keyid-format 可以指定长度。
3.3. 列出指纹
gpg --fingerprint me@wangyan.org
3.4. 生成子密钥
gpg --expert --edit-key 2E0E8722
gpg> addkey
3.5. 删除密钥
# 删除公钥
gpg --delete-key [USER-ID or KEYID]
# 删除私钥
gpg --delete-secret-key [USER-ID or KEYID]
3.6. 导出密钥
# 导出公钥
gpg --armor --output user.gpg.public.asc --export MASTER-KEYID
# 导出私钥
gpg --armor --output user.gpg.private.key.asc --export-secret-keys MASTER-KEYID
# 不导出子密钥
gpg --armor --output user.gpg.private.key.asc --export-secret-keys MASTER-KEYID!
# 导出指定子密钥
gpg --armor --output 2E0E8722.pub.asc --export 2E0E8722
- 默认导出主密钥的同时,将会连同其全部子密钥一起导出
- 根据非对称密钥体系原理,导出私钥就代表着同时也导出了公钥,因为私钥能够推导出公钥。
- 使用子密钥的公钥KEYID,可以指定导出子密钥
3.7. 导入密钥
gpg --import user.gpg.public.pem
gpg --import user.gpg.private.key
3.8. 信任密钥
重新导入密钥后会显示未知,因此需要信任。
gpg --edit-key user@useremail.com
gpg> trust
gpg> 5
gpg> save
导出信任文件:gpg --export-ownertrust > file.txt
3.9. 分发公钥
一旦密钥创建就绪,你就可以将其发表到 GPG 公共服务器,其他人通过指纹或者邮箱地址能够检索到你的公钥。
# 默认发布到 hkps://keys.openpgp.org 服务器
gpg --send-keys 2E0E8722
# 发布到指定服务器
gpg --keyserver hkps://keyserver.ubuntu.com --send-keys 2E0E8722
3.10. 检索公钥
# 检索默认服务器
gpg --search-keys 70B152332E0E8722
gpg --auto-key-locate keyserver --locate-keys no-reply@wangyan.org
# 检索指定服务器
gpg --keyserver hkps://keyserver.ubuntu.com --search-keys 70B152332E0E8722
gpg --keyserver hkps://keyserver.ubuntu.com --search-keys no-reply@wangyan.org
3.11. 接收他人的公钥
# 使用 Long-KEYID 从指定服务器接收
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 70B152332E0E8722
3.12. 签名他人公钥
-
接收他的公钥
gpg -recv-keys 70B152332E0E8722
-
签名这个公钥
gpg –ask-cert-level –sign-key no-reply@wangyan.org
-
签名后导出
#使用他的公钥加密签名再导出 gpg -a –export no-reply@wangyan.org | gpg -se -r no-reply@wangyan.org > no-reply@wangyan.org.asc.pgp
-
接收方解密并导入
gpg –decrypt no-reply@wangyan.org.asc.pgp > no-reply@wangyan.org.asc gpg –import no-reply@wangyan.org.asc
-
发布新公钥到服务器
gpg –send-keys no-reply@wangyan.org.
4. GPG 文件操作
4.1. 加解与解密
4.1.1. 加密
gpg -e -r 2E0E8722 original.file
-e, --encrypt加密数据-r, --recipient为 USER-ID 加密- 加密后默认生成一个新文件
original.file.gpg
4.1.2. 解密
gpg -d -r 2E0E8722 original.file.gp
-d, --decrypt解密数据
4.2. 签名与验证
4.2.1. 签名且加密
gpg -u 2E0E8722 -s original.file
-u, --local-user使用 USER-ID 来签名或者解密-s, --sign生成一份签名- 这会生成一个加密文件
original.file.gpg,同时它也是被签名的。 - 发给他人,只需分发加密文件,无需附带原始文件。
4.2.2. 只签名不加密
gpg -u 2E0E8722 -a -b -s original.file
-a, --armor创建 ASCII 字符封装的输出-b, --detach-sign生成一份分离的签名- 签名后生成一个纯文本的签名文件
original.file.asc。 - 发给他人,需要和原始文件一同分发。
4.2.3. 只签名不加密,且使用明文签名
gpg -u 2E0E8722 --clear-sign original.file
--clear-sign生成一份明文签名- 区别在于包含了原始文件的内容,无需和原始文件一同分发。
4.2.4. 验证
gpg -u 2E0E8722 --verify original.file.gpg
gpg -u 2E0E8722 --verify original.file.asc
5. GPG 吊销操作
一旦发布到 keyserver 上,你的 GPG Key 就不能被真正删除了。
对于失效的、过时的、可能已经泄漏的密钥,你要使用吊销功能。
5.1. 生成吊销证书
gpg --output revoke.asc --gen-revoke key-ID
5.2. 导入吊销证书
gpg --import revoke.asc
- 注意:吊销并不删除密钥本身,它是标记该密钥被作废了
5.3. 撤销密钥服务器上的密钥
gpg --keyserver hkps://keys.openpgp.org --send-keys key-ID
- 已标记作废的密钥会被发送到服务器
6. Git 配置
git config --global gpg.program gpg
git config --global commit.gpgsign true
git config user.name wangyan
git config user.email no-reply@wangyan.org
git config user.signingkey 2E0E8722
git commit -S -m your commit message
参考文档: