跳过正文

GnuPG

目录

用法
#

Note

  • 每当命令中需要user-id 时,都可以使用您的 key IDfingerprint、您的姓名或电子邮件地址的一部分等来指定。GnuPG 在这方面非常灵活。
  • 每当需要 key-id 时,都可以在命令中添加 --keyid-format=long 标志。例如,要显示主密钥,请运行 gpg --list-secret-keys --keyid-format=long user-idkey-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-id

Tip:您可以省略 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.gpg

gpg 将提示您输入密码,然后解密并将数据从 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 doc

doc.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

如果文件除了签名之外还进行了加密,只需解密该文件,其签名也会得到验证。

作者
南风
美柑、小暗、菈菈、梦梦、娜娜、唯,你们带我走吧😭