跳转到: 导航, 搜索

OpenPGP Web of Trust

OpenPGP Web of Trust

随着分布式在线社区的不断发展,其成员之间能够以电子方式识别彼此的需求也日益增加。OpenPGP 标准是全球自由软件文化中首选的机制。OpenStack 项目依赖 OpenPGP 签名来进行以下活动:

GNU Privacy Guard

虽然有各种工具甚至设备可用于创建和管理 OpenPGP 密钥和签名,但本文档将提供 GNU Privacy Guard (有时缩写为 GnuPG 或 GPG) 的示例,作为最流行和可移植的工具集。这些建议通常也适用于大多数其他解决方案。

GNU Privacy Guard 安装

为您的平台使用最新的 GPG 2.X 版本(而不是功能较少的 1.X 系列)。在现代 Debian 和 Red Hat 基础操作系统上,软件包名称为 gnupg2,但命令行实用程序被调用为 gpg2

在嵌入式系统或其他资源受限的平台上,可以安装最新的 1.X 版本作为更轻量级的替代方案。请注意,在 Debian 衍生版上,gnupg (1.X) 软件包缺少 HKPS 支持,因此如果您想将其与下面的示例配置一起使用,您还需要可选的 gnupg-curl 软件包。

GNU Privacy Guard 示例配置

# A basic ~/.gnupg/gpg.conf using stronger than default message
# digests and transport protocols. For the most part, defaults in
# modern versions are chosen for an optimal balance of security and
# interoperability, but you may wish to override them in favor of
# slightly more secure modes of operation. This example should
# evolve over time, as new cryptographic recommendations emerge and
# software defaults shift to adopt them.

# Use a strong message digest algorithm (not MD5 or SHA1) when
# signing keys.
cert-digest-algo SHA512

# Override the algorithm priority order in recipient key
# preferences. The first hash in this list is also used when
# signing without encryption.
personal-digest-preferences SHA512 SHA384 SHA256 SHA224

# Define the priority order for hashes, ciphers and compression.
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed

# Receive, send and search for keys in the SKS keyservers pool using
# HKPS (OpenPGP HTTP Keyserver Protocol via TLS/SSL).
keyserver hkps://hkps.pool.sks-keyservers.net

# Set the path to the public certificate for the
# sks-keyservers.net CA used to verify connections to servers in
# the pool above.
keyserver-options ca-cert-file=~/.gnupg/sks-keyservers.netCA.pem

# Ignore keyserver URLs specified in retrieved/refreshed keys
# so they don't direct you to update from non-HKPS sources.
keyserver-options no-honor-keyserver-url

# Display key IDs in a more accurate 16-digit hexidecimal format
# and add 0x at the beginning for clarity.
keyid-format 0xlong

# Display the calculated validity of user IDs when listing keys or
# showing signatures.
list-options show-uid-validity
verify-options show-uid-validity

# If you have multiple keys (maybe you replaced an older, weaker
# one), specify the one you normally use. You can still override
# this with --local-user when needed.
#default-key 0xfedcba9876543210

上面的 HKPS 配置还需要一个 CA 证书,以便 GPG 可以确认与其通信的密钥服务器的有效性。使用以下命令检索它:

wget -P ~/.gnupg/ https://sks-keyservers.net/sks-keyservers.netCA.pem{,.asc}

然后通过验证随其提供的签名来确认其合法性:

gpg2 --verify ~/.gnupg/sks-keyservers.netCA.pem{.asc,}

输出应表明它是使用 RSA 密钥 0x0B7F8B60E3EDFAE3 创建的。

密钥生成和发布

gpg2 的手册页 提供了非常详细的使用信息,但这里有一些提示可以帮助您入门,如果您以前没有使用过它...

  1. 如果您还没有密钥,请使用 gpg2 --gen-key 创建一个。 Ubuntu 社区有一个很棒的教程可以遵循,但总的来说,现代版本 GPG 的默认密钥生成选项是合理的并且足够安全,因此您只需从那里开始按 Enter 键即可。
    1. 有些人可能觉得有必要选择 4096 位密钥大小以实现极致的未来兼容性,但实际上 2048 位的默认值在一段时间内应该足够了。
    2. 当它提示您提供真实姓名时,您需要确保输入与您在官方身份证明(例如政府颁发的带照片的身份证明)上尽可能匹配的姓名。
    3. 除非您需要它来澄清您的官方姓名,否则最好将用户 ID 的注释字段留空。
    4. 用您不用于其他任何用途但可以记住的强密码加密您的私钥是一个好主意,但打印出恢复密钥并将其锁在安全的地方是对忘记密码的良好保险。
  2. 完成密钥生成后,请务必将其发布到密钥服务器网络! gpg2 --send-key 0xfedcba9876543210(或您的密钥 ID)应该就是您真正需要做的,如果您遵循了之前的配置建议。
  3. 如果您不知道您的密钥 ID,gpg2 --list-keys you@example.com(用您与该密钥关联的电子邮件地址替换)将显示它。这是以 pub 开头,后跟密钥大小和指示密钥类型的字母(例如 2048R)的行。该行后跟斜杠 (/) 的十六进制数字是您的密钥 ID。
  4. 如果您刚刚创建了密钥,或者即使您已经拥有密钥并且在过去几年内生成了它(可能足够好),有一套很棒的建议 可以用来使您的工作流程更加安全。
  5. 如果您有一个...较旧的...密钥(您知道是谁),那个尘封已久的 1024 位遗物,带有来自十年前会议上遇到的人的签名,这不是荣誉徽章——相反,那些拥有闪亮新密钥的酷孩子正在从高处嘲笑您。(总之,1024 位密钥不再被认为适合长期使用。)生成并 过渡 到不太陈旧的东西。您会很高兴的。

密钥签名过程

使用签名来证明另一个密钥的有效性,密钥签名,构成了 信任网络。它使您能够根据来自您遇到过的人的传递签名,确定从未见过的人签名的相对真实性。OpenStack 社区在设计峰会上每半年举行一次密钥签名会议(遵循 “Sassaman-Projected” 方法),并在 开发邮件列表 上提前一个月左右讨论计划/注册。

也强烈鼓励进行临时密钥签名——会议和本地用户组会议是进行此操作的好地方——这里有一些建议可以使其更容易...

  1. 携带适当的官方照片身份证明,具体取决于环境。如果是在 OSUG 会议上,那么您的当地政府身份证(也许是驾驶执照)或甚至大学身份证可能就足够了。如果在大型国际会议上,那么一本完整的护照会更好。目标是向签署您密钥的人提供一些保证,即您就是您所说的人,因此最好携带带有照片的身份证明,该照片看起来像您,不易伪造/仿冒,并且由签署人已知并能够确认其合法性的权威机构提供。携带多种身份证明也可以帮助。
  2. 携带纸条或名片,上面写有您的姓名(如照片身份证明和 OpenPGP 密钥上所示),以及相关的密钥指纹(可以通过运行 gpg2 --fingerprint 0xfedcba9876543210 替换您的真实密钥 ID 在命令中获得)。请注意,一些签名者认为密钥 ID 本身不足以进行验证,因为较短的密钥 ID 相对容易被伪造(通过暴力密钥生成来创建具有类似/相同 ID 的新密钥)。
  3. 在与您想签署其密钥的人会面时,请查看他们的照片身份证明。检查照片上的人看起来像提供身份证明的人。检查它至少看起来是合法的,并且来自您以某种方式了解的权威机构(例如,由他们的雇主提供的工牌可能不是一个好选择,除非您在同一地方工作,因为您可能以前从未见过它,并且不知道其颁发情况)。如果您对提供的身份证明不满意,请要求提供另一种身份证明,并随时选择不进行密钥签名,除非您对它的真实性相当确定。记下照片身份证明上的姓名,并获取他们的密钥指纹(如果您已经为他们打印出来了,这将很容易),以便稍后在您实际签署他们的密钥时使用。
  4. 在交换信息和身份验证(可能需要几分钟或几个月)之后,将他们的密钥从密钥服务器检索到您的本地密钥环。这可以使用 gpg2 --recv-keys 0xfedcba9876543210(或他们的密钥 ID)完成。使用前面提到的命令查看并仔细比较他们的密钥上的指纹和真实姓名与您在面对面会议中做的笔记(因为没有证书颁发机构,手动检查姓名和指纹对于该过程至关重要)。最好使用像 caffDebianMageiaOpenSuSEUbuntu 中的 signing-party 软件包,以及 Fedora 上的 pgp-tools 软件包,以及适用于 CentOS 和 RHEL 的第三方软件包)等工具来帮助简化验证、签署每个 UID 并将这些签名发送给密钥持有者。
  5. 当有人向您发送您的密钥签名时,将其保存到某个地方并使用 gpg2 --import filename.asc 导入,不要忘记再次使用 gpg2 --send-key 0xfedcba9876543210 来炫耀新的签名!
  6. 如果您发现自己经常这样做,您可能需要确定并发布您自己的 签名策略,详细说明您个人的密钥签名选择。
  7. 我们忘记坚持您需要手动检查您签署的密钥的指纹,并确保它是正确的了吗? :)