用法 #
Note:
- 每当命令中需要
user-id时,都可以使用您的key ID、fingerprint、您的姓名或电子邮件地址的一部分等来指定。GnuPG 在这方面非常灵活。 - 每当需要
key-id时,都可以在命令中添加--keyid-format=long标志。例如,要显示主密钥,请运行gpg --list-secret-keys --keyid-format=long user-id,key-id是与 sec 同一行提供的十六进制哈希值。
创建密钥对 #
在终端中输入以下命令生成密钥对:
$ gpg --full-gen-key该命令会提示用户回答几个问题。
列出密钥 #
要列出公钥环中的密钥:
gpg --list-keys要列出私钥环中的密钥:
$ gpg --list-secret-keys导出公钥 #
GnuPG 的主要用途是通过公钥加密确保交换消息的机密性。通过它,每个用户都会分发其密钥环的公钥,其他人可以使用该公钥来加密发送给该用户的消息。私钥必须始终保密,否则机密性就会被破坏。
因此,为了让其他人向您发送加密消息,他们需要您的公钥。
要生成用户公钥的 ASCII 版本以文件 public-key.asc(例如通过电子邮件分发):
$ gpg --export --armor --output public-key.asc user-idTip:您可以省略
user-id导出密钥环中所有公钥。如果您想同时共享多个身份,或者需要将密钥导入其他应用程序,这将非常有用。
导入公钥 #
为了加密发送给其他人的消息并验证他们的签名,您需要他们的公钥。要将文件名为 public-key.asc 的公钥导入到您的公钥环中:
$ gpg --import public-key.asc使用密钥服务器 #
发送密钥 #
您可以将您的密钥注册到公共 PGP 密钥服务器,以便其他人无需直接联系您即可获取您的密钥:
$ gpg --send-keys key-id警告:有些密钥服务器不允许删除已提交的密钥。
Note:关联的电子邮件地址一旦公开,就可能成为垃圾邮件发送者的目标,在这种情况下,反垃圾邮件过滤可能就显得必要了。
搜索和接受密钥 #
要查找密钥服务器上密钥的详细信息(无需导入密钥),请执行以下操作:
$ gpg --search-keys user-id从密钥服务器导入密钥:
$ gpg --receive-keys key-id要使用密钥服务器的最新版本刷新/更新钥匙串:
$ gpg --refresh-keys警告:
- 您应该通过将获取的公钥指纹与所有者在独立来源(例如,直接联系所有者)上公布的指纹进行比较,来验证其真实性。
- 建议在接收密钥时使用长密钥 ID 或完整指纹。使用短 ID 可能会发生冲突。所有使用短 ID 的密钥都将被导入。
加密和解密 #
您需要先导入用户的公钥,然后再将文件或消息加密(选项 -e/--encrypt)给该收件人(选项 -r/--recipient)。此外,如果您尚未创建密钥对,则需要创建密钥对。
要加密名为 doc 的文件,请使用:
$ gpg --recipient user-id --encrypt doc要解密(选项 -d/--decrypt)使用公钥加密的名为 doc.gpg 的文件,请使用:
$ gpg --output doc --decrypt doc.gpggpg 将提示您输入密码,然后解密并将数据从 doc.gpg 写入 doc。如果省略 -o/--output 选项,gpg 会将解密的数据写入 stdout。
密钥维护 #
备份私钥 #
要备份您的私钥,请执行以下操作:
$ gpg --export-secret-keys --armor --output private-key.asc user-id如果私钥受密码保护,则导出的密钥文件也将受同一密码保护。
导入私钥备份:
$ gpg --import private-key.asc备份吊销证书 #
为新生成的密钥自动生成吊销证书。默认情况下,它们位于 ~/.gnupg/openpgp-revocs.d/ 中。证书的文件名是它将撤销的密钥的指纹。用户也可以稍后使用以下命令手动生成吊销证书:
$ gpg --gen-revoke --armor --output revcert.asc user-id如果密钥丢失或泄露,此证书可用于撤销密钥。如果您无法再访问密钥并因此无法使用上述命令生成新的吊销证书,则备份将很有用。它足够短,可以打印出来,并在必要时手写。
注意:吊销证书需要按照证书里的说明进行编辑后才能正常使用。
警告:任何拥有撤销证书的人都可以公开撤销密钥,此操作无法撤销。请像保护您的私钥一样保护您的撤销证书。
编辑密钥 #
运行 gpg --edit-key user-id 命令将显示一个菜单,使您能够执行大部分与密钥管理相关的任务。
在编辑键子菜单中键入 help 以显示完整的命令列表。一些有用的:
> passwd # change the passphrase
> clean # compact any user ID that is no longer usable (e.g revoked or expired)
> revkey # revoke a key
> addkey # add a subkey to this key
> expire # change the key expiration time
> adduid # add additional names, comments, and email addresses
> addphoto # add photo to key (must be JPG, 240x288 recommended, enter full path to image when prompted)Tip:如果您有多个电子邮件帐户,您可以使用 adduid 命令将每个邮件帐户添加为身份。然后,您可以将您最喜欢的设置为 primary。
导出子密钥 #
如果您计划在多个设备上使用同一密钥,您可能需要移除主密钥,只在安全性较低的系统上保留最基本的加密子密钥。
首先,找出要导出的子密钥。
$ gpg --list-secret-keys --with-subkey-fingerprint仅选择要导出的子密钥。
$ mktemp -d
-------------------
/tmp/tmp.XXXXXXXXXX$ gpg --armor --export-secret-subkeys --output /tmp/tmp.XXXXXXXXXX/subkey.asc subkey-id!警告:如果您忘记添加感叹号 (!),您的所有子密钥都将被导出。
此时您可以停止操作,但最好也更改一下密码短语。将密钥导入到临时文件夹中。
$ gpg --homedir /tmp/tmp.XXXXXXXXXX --import /tmp/tmp.XXXXXXXXXX/subkey.asc
$ gpg --homedir /tmp/tmp.XXXXXXXXXX --edit-key user-id
> passwd
> save
$ gpg --homedir /tmp/tmp.XXXXXXXXXX --armor --output /tmp/tmp.XXXXXXXXXX/subkey.altpass.asc --export-secret-subkeys subkey-id!Note:您会收到一条警告,提示主密钥不可用且密码未更改,但可以忽略此警告,因为子密钥密码已更改。
此时,您现在可以在其他设备上使用 /tmp/tmp.XXXXXXXXXX/subkey.altpass.asc。
延长有效期 #
警告:除非有正当理由,否则切勿删除已过期或已撤销的子密钥。这样做会导致您无法解密使用旧子密钥加密的文件。请仅在清理密钥环时删除其他用户的已过期或已撤销的密钥。
为子密钥设置过期日期是一种良好的做法,这样即使您丢失了密钥的访问权限(例如忘记了密码),其他人也不会无限期地继续使用该密钥。密钥过期后,延长过期日期也相对简单:
$ gpg --edit-key user-id
> expire系统会提示您输入新的到期日期,以及用于签署新到期日期的密钥的密码短语。
对所有其他已过期的子密钥重复此操作:
> key 1
> expire最后,保存更改并退出:
> save如果您在多台计算机上使用此密钥,您可以导出公钥(带有新的签名过期日期),并将其导入到这些计算机上:
$ gpg --export --output pubkey.gpg user-id
$ gpg --import pubkey.gpg无需重新导出您的私钥或更新您的备份:主私钥本身永不过期,只有留在公钥和子密钥的过期日期签名是需要备份的。
轮换子密钥 #
警告:除非有正当理由,否则切勿删除已过期或已撤销的子密钥。这样做会导致您无法解密使用旧子密钥加密的文件。请仅在清理密钥环时删除其他用户的已过期或已撤销的密钥。
或者,如果您希望在子密钥过期后完全停止使用,您可以创建新的子密钥。请提前几周执行此操作,以便其他人可以更新他们的密钥环。
Tip:即使密钥已过期,您也不需要创建新密钥。您可以延长密钥的有效期。
创建新的子密钥(签名密钥和加密密钥均需重复此操作):
$ gpg --edit-key user-id
> addkey并回答它提出的问题。
保存更改:
> save您还需要导出一份新的私钥副本以作备份。
Tip:撤销过期的子密钥既没有必要,也可以说是不妥的做法。如果您频繁撤销密钥,可能会导致他人对您失去信任。
撤销密钥 #
如果密钥泄露、被取代、不再使用或您忘记了密码,则应执行密钥撤销操作。此操作通过将密钥与密钥撤销证书合并来完成。
如果您无法再访问您的密钥对,请首先导入公钥以导入您自己的密钥。
然后,要撤销密钥,请导入撤销证书:
$ gpg --import revcert.asc现在需要公开撤销密钥。如果您之前使用过公共 PGP 服务器,请使用密钥服务器将撤销的密钥发送到该服务器;否则,请将撤销的密钥导出到文件并分发给您的通信伙伴。
签名 #
签名用于认证文件并添加时间戳。如果文件被修改,签名验证将失败。与使用接收方公钥加密文件的加密不同,签名使用发送方的私钥创建。签名文件的接收方随后使用发送方的公钥验证签名。
创建签名 #
签名文件 #
要对文件进行签名,请使用 -s/--sign 标志:
$ gpg --output doc.sig --sign docdoc.sig 包含原始文件 doc 的压缩内容和二进制格式的签名,但该文件未加密。但是,您可以将签名与加密结合起来。
要在不将文件压缩成二进制格式的情况下对其进行签名,请使用:
$ gpg --output doc.sig --clearsign doc这里,原始文件 doc 的内容和签名都以人类可读的形式存储在 doc.sig 中。
分离签名 #
要创建单独的签名文件,以便与文档或文件本身分开分发,请使用以下 --detach-sig 标志:
$ gpg --output doc.sig --detach-sig doc这里 doc.sig 中存储了签名,但其中不存储 doc 的内容。这种方法常用于分发软件项目,让用户验证程序没有被第三方修改。
验证签名 #
要验证签名,请使用以下 --verify 标志:
$ gpg --verify doc.sig其中 doc.sig 是包含您要验证的签名的签名文件。
如果要验证分离签名,则验证时必须同时存在已签名的数据文件和签名文件。例如,要验证 Arch Linux 的最新 ISO 镜像,您可以执行以下操作:
$ gpg --verify archlinux-version.iso.sig其中 archlinux-version.iso 必须位于同一目录中。
您还可以使用第二个参数指定已签名的数据文件:
$ gpg --verify archlinux-version.iso.sig /path/to/archlinux-version.iso如果文件除了签名之外还进行了加密,只需解密该文件,其签名也会得到验证。