今天偶然翻回一个老帖子,https://ex.noerr.eu.org/t/211088 免得一记洛阳镐,重贴一下大致内容,访问 https://github.com/yourname.keys ,可以看到其它人的公钥,对于这样做的解释,有人贴了官方的说法,也有人分析过有 github 背书的公钥比较权威,公钥的省去了他人索要公钥的过程。这些理由有道理,只是需要 ssh 公钥的情况并不多。
问题就来了, https://github.com/yourname.keys 这个链接既然可以查看 ssh 公钥,为何不一并公布了 gpg 公钥,后者的应用情境更多才是? github 目前只提供 commit 验证, pull 下来的项目在其它人不上网站的情况下也验证不了不是?
|  |      1msg7086      2016-04-25 02:23:09 +08:00 gpg ……不是已经有 gpg 公钥服务器了吗? | 
|  |      2sunjourney OP @msg7086 其它人用 github 上那个链接,可以免指纹了不是,何况不是所有人都传 gpg 服务器的 | 
|  |      3msg7086      2016-04-25 05:22:56 +08:00  2 @sunjourney 个人理解。 GPG 密钥是相对长期的,一对密钥生成以后会用几年甚至更久。 SSH 密钥是相对短期的,会经常换新。 GPG 密钥是绑定到人的,而 SSH 是绑定到服务器的(可以一个服务器用一对密钥,或者一个网站用一对密钥)。 所以对于 GitHub 来说,提供 SSH 密钥比较实际些。 而 GPG 密钥由于已经有各大服务器提供了,所以再提供一个意义不是很大。 | 
|  |      4liaa      2016-04-25 06:39:48 +08:00 “一记洛阳镐” 👍 | 
|  |      5dndx      2016-04-25 07:34:26 +08:00 via iPhone  1 https://pgp.mit.edu 已经是事实上的标准了。 GitHub 再搞一个也不一定有人用。 | 
|  |      6sunjourney OP @dndx 指纹和 key id 怎么呢? | 
|  |      7sunjourney OP @dndx 怎么发布呢? | 
|  |      8sunjourney OP @msg7086 github 利用他的权威性发布 gpg 公钥好处是不言喻的,其它人获取公钥的时候可以不用指纹,也不用知道他的 keyid ,这两步实现本来就是很麻烦的 | 
|      9julyclyde      2016-04-25 10:55:40 +08:00 @sunjourney PGP 不是中心认证的 PKI 模型,而是 web of trust 模型 | 
|  |      10sunjourney OP @julyclyde 如何理解?我认为使用 gpg 公钥只要解决好分发公钥与权威认证这两个问题就可以了, github 刚好可以代劳,而且它已经公布了 ssh 公钥, 再加上 gpg 也不是问题。除非里面有什么有说服力的考量,代公布 ssh 而代不公布 gpg 。 如果有这个考量,这就是我想知道的答案。 | 
|  |      11oott123      2016-04-25 12:05:26 +08:00 via Android  1 我感觉主要是那个功能很早了 GPG 是最近加的 所以没更新 | 
|      12julyclyde      2016-04-25 13:44:32 +08:00 @sunjourney gpg 信任模型里,人和 keyid 的对应关系要求“亲眼核实”才算数的。 github 又没见过你,就凭你上传一个 publickey 就说这个 key 是你?那你如果上传的是别人的 publickey 呢? github 能保证的只有:这个 commit 上的签名,和你上传的 publickey 能够对应的时候,给你显示个已核实该签名 | 
|  |      13sunjourney OP | 
|      14julyclyde      2016-04-25 15:38:21 +08:00 @sunjourney 没有意义!=没人会去做 | 
|  |      15sunjourney OP @julyclyde 那上传 fake ssh pubkey 也会有人做, github 不是防不了 | 
|      16julyclyde      2016-04-25 15:45:55 +08:00  1 @sunjourney 上传 假 ssh pubkey 不会造成危害啊。就拿你原文里举的那个 V2EX 旧帖子里的说法,开发者之间为了相互帮忙,用 github 互换 ssh key ,以便相互登录,如果上传的是假的,他就登录不到别人的服务器上了呗 但如果是 gpg key 是假的,有可能导致发信人根据假 key 上的 userID 把电邮发到错误的地方去,从而泄密 | 
|  |      17sunjourney OP @julyclyde pub key 没有 userID 啊,何来泄密? 不过就在刚才,我想通了,应该是应对这种情形, github 才不提供 gpg 公钥: github 帐号被攻破了! 假设 github 提供 gpg 公钥发布, faker 拿的 github 提交了 commit , 打上了 tag ,但他没法使用 owner 的签名,但可以上传自己的 公钥!其它正常使用者本来用真正 owner 的 pubkey 验证的,不能通过验证时可能会以为公钥过期,又会到 github 上拿 owner 的 pubkey ,正中 faker 下怀! 亏我专门还去 github 官方询问这事,糗大了。 感谢所有参与讨论者。我的想法如果再有误,欢迎继续讨论。 | 
|      18julyclyde      2016-04-25 16:29:31 +08:00 @sunjourney gpg public key 是有 userid 的; ssh 的没有 | 
|  |      19sunjourney OP @julyclyde 上传的没有呀, gpg cmd 传 keyserver 用的也是 keyid ,更不用说 copy & paste 过去的内容,就完全没这个信息了 | 
|      20julyclyde      2016-04-25 20:30:51 +08:00 @sunjourney 你是不是没理解什么叫 PGP publickey 的 userID 啊? | 
|  |      21sunjourney OP @julyclyde 那就请指教了,本地可以看到 uid ,上传服务器可用的只有 key id 及 fingerprint ,接收只有 key id , user-id 这两个环节可以怎么用?他人怎么获取 email ? | 
|  |      22sunjourney OP @julyclyde 刚导入了别人的 pub key 看了,导入后可以看到 uid 耻,之前以为 uid 没显式传上去,别人也不知道,现在看来 uid 信息包裹在 pub key 里,还是我在 gpg 公钥生成算法的理解上出问题了。 | 
|      23julyclyde      2016-04-25 21:40:56 +08:00  1 @sunjourney 虽然最终你用正确的方法理解了,不过其实反证法更快:如果你只上传一个 ID/fingerprint ,服务器怎么能有能力给其他客户提供完整 pubkey 的下载呢? | 
|  |      24sunjourney OP @julyclyde 嗯,之前想过没细想,验证,解密的时候, gpg 能知道文件该用哪个私钥解我就该看出来的。 | 
|  |      25webshe11      2020-05-06 01:42:16 +08:00 |