如何验证来自 Facebook 的电子邮件签名?

如何验证来自 Facebook 的电子邮件签名?

Facebook 允许用户

将 OpenPGP 公钥添加到他们的个人资料中;这些密钥可用于“端到端”加密从 Facebook 发送到您首选电子邮件帐户的通知电子邮件。–确保 Facebook 电子邮件通信安全

Facebook 提供了一个公钥(0x2F3898CEDEE958CF)https://www.facebook.com/facebook/publickey/download/

Facebook 通过电子邮件反复向我发送有关我账户的“加密通知”([电子邮件保护])。这些电子邮件使用我已上传到 Facebook 的公钥加密。这些电子邮件使用密钥 (0x3028CF59770E7A01) 签名,该密钥不是 Facebook 提供的密钥 (0x2F3898CEDEE958CF)。当我尝试使用 Enigmail 导入密钥 0x3028CF59770E7A01 时,会显示以下通知:

ID 为 0x3028CF59770E7A01 的密钥在密钥服务器上不可用。很可能是密钥的所有者没有将其密钥上传到密钥服务器。

请要求消息的发送者通过电子邮件向您发送他们的密钥。

  • 我找不到任何办法联系该消息的发件人。
  • 我没有找到密钥 0x3028CF59770E7A01 的来源。

我的主要问题是:如何验证来自 Facebook 的电子邮件签名?

顺便问一下:为什么 Facebook 要使用产生无法验证的签名的密钥?

更新

在密钥服务器上查找密钥 0x2F3898CEDEE958CF(参见例如密钥服务器)将显示最近包含的子项 0x3028CF59770E7A01

sub rsa4096/3028cf59770e7a01 2019-07-08T16:09:07Z            
sig sbind 2f3898cedee958cf 2019-07-08T16:09:07Z ____________________ 2020-01-04T20:00:00Z []

这与 Facebook 在其帖子中提供的信息一致确保 Facebook 电子邮件通信安全

Facebook 的 OpenPGP 密钥由一个长期主密钥和一些短期子密钥组成;这使我们能够频繁轮换操作密钥,同时保持信任网络和长期一致的身份。

然而,这个子密钥显然不是公开的,并且从密钥服务器接收这个丢失的密钥的尝试会失败。

gpg: Signature made Di 06 Aug 2019 17:56:19 CEST
gpg:                using RSA key 3B6C6808FC9D75EDAE0184E73028CF59770E7A01
gpg: Can't check signature: No public key

答案1

facebook.ascFacebook 提供的密钥实际上包含两个子密钥,可以通过执行gpg --show-key --with-colons facebook.asc

pub:-:4096:1:2F3898CEDEE958CF:1431903600:1581038771::-:
uid:::::::::Facebook, Inc.:
sig:::1:2F3898CEDEE958CF:1517966771:::::[selfsig]::13x:
sub:-:4096:1:D2CC929B77D6D6F9:1547468530:1564686000:::
sig:::1:2F3898CEDEE958CF:1547468530:::::[keybind]::18x:
sub:-:4096:1:3028CF59770E7A01:1562602147:1578168000:::
sig:::1:2F3898CEDEE958CF:1562602147:::::[keybind]::18x:

请注意,第二个子项是不祥的 0x3028CF59770E7A01。

将此文件导入到我的密钥环(gpg --import facebook.asc)中,然后突然

gpg: Signature made Di 06 Aug 2019 18:00:09 CEST
gpg:                using RSA key 3B6C6808FC9D75EDAE0184E73028CF59770E7A01
gpg: Good signature from "Facebook, Inc." [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 31A7 0953 D8D5 90BA 1FAB  3776 2F38 98CE DEE9 58CF
     Subkey fingerprint: 3B6C 6808 FC9D 75ED AE01  84E7 3028 CF59 770E 7A01

虽然 Enigmail 的密钥管理多次无法下载子密钥 0x3028CF59770E7A01(例如来自 hkps://keys.openpgp.org 或 hkps://hkps.pool.sks-keyservers.net),但它可以通过以下方式接收子密钥gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 0x3028CF59770E7A01

gpg: key 2F3898CEDEE958CF: 586 duplicate signatures removed
gpg: key 2F3898CEDEE958CF: 1417 signatures not checked due to missing keys
gpg: key 2F3898CEDEE958CF: 1 signature reordered
gpg: key 2F3898CEDEE958CF: public key "Facebook, Inc." imported
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2021-02-07
gpg: Total number processed: 1
gpg:               imported: 1

更新我的默认密钥服务器从密钥中剥离了用户 ID,导致new key but contains no user ID - skipped。使用 keyserver.ubuntu.com 可以解决这个问题。这个答案解释了为什么

相关内容