GPG 使用笔记
type
status
date
slug
summary
tags
category
icon
password
GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG allows you to encrypt and sign your data and communications; it features a versatile key management system, along with access modules for all kinds of public key directories. GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. A wealth of frontend applications and libraries are available. GnuPG also provides support for S/MIME and Secure Shell (ssh).
GnuPG 是完整遵循 OpenPGP 标准实现的自由软件。GnuPG 的主要功能是密钥管理以及加密、签名数据和通信。例如为 Git 提交进行签名、用于 SSH 身份认证、邮件的签名及加密等等
安装 GnuPG
创建密钥对
选择算法:
命令中的 --expert 意为专家模式,可以列出更多密钥算法,否则将只能选择 RSA 或者 DSA 算法。根据个人偏好选择不同的密钥类型,这里选择了
9
,即 ECC(椭圆曲线),在安全性相近时,ECC 的密钥长度比 RSA 要短得多,此外还有很多其他优点 知乎: ECC算法与RSA算法的优劣?选择使用哪种椭圆曲线:
这里选择 Curve 25519
设置有效期、USER-ID、保护密码:
主密钥和子密钥
密钥用途介绍
上述操作会生成一个主密钥和一个子密钥,通过下面的命令可以查看:
可以看到主密钥的类型是 ed25519,并且后面有一个 [SC] 标识,而子密钥的类型是 cv25519,后面的标识为 [E],不同的标识代表不同的用途,GPG 中的密钥有这样几种用途
- C: Certificating,可以用来给其他密钥/证书签名
- S: Signing,用来签名
- A: Authenticating,用来认证/鉴权
- E: 用来加密 虽然主密钥的 [SC] 也有一个 [S],但是通常并不直接用主密钥来签名,更好的做法是为 [S]、[A]、[E] 等用途各生成一个子密钥,用子密钥来进行这些操作,现在已经有了一个用来加密的子密钥,所以还需要生成两个子密钥分别用来签名和认证。
添加子密钥
先使用下面的命令进入编辑密钥的交互 shell:
使用
addkey
命令添加子密钥
添加签名密钥:添加认证密钥:
最后保存并退出:
测试和使用
测试签名功能
可以通过
-u / --local-user
参数指定密钥,但这只在多个主密钥之间有用,因为当有多个子密钥时,gpg 会默认使用最后一个子密钥
可以进一步在密钥 ID 后面添加 !
来强制使用某个子密钥进行签名用来为 git commit 签名
只需要加上
-S
参数即可如果需要将签名设为默认行为,可以更改 git config
git 的默认行为是使用与当前配置的 name 和 email 完全相同的密钥进行签名,如果没有这样的密钥则会 commit 失败
另外,也可以指定签名密钥
其他
小问题 1
- 暂时不知道什么原因,GPG 经常无法正常弹出输入 passphrase 的界面,解决方法是
小问题 2
- 如果使用 ssh 登录到用户 A,然后切换到用户 B,那么用户 B 在使用 GPG 时可能会遇到以下错误:
这是因为当前的 tty 属于用户 A,因此可以通过为用户 B 生成新的 tty 来解决:
导出密钥
公钥和私钥都能导出,比如导出公钥:
其中
--export-filter keep-uid='{mbox = [email protected]}'
表示只过滤出邮箱地址为 [email protected]
的 UID发布公钥
对于某些服务器,一旦发布就不能删除。可以通过
—keyserver
指定服务器