GitHub API OpenPGP密钥格式

Dur*_*ndA 6 github pgp openpgp github-api

GitHub REST API v3为GPG密钥public_key返回的字段格式是什么?

例如,该命令curl -v -H "Accept: application/vnd.github.cryptographer-preview" https://api.github.com/users/DurandA/gpg_keys返回以下键:

pub   dsa2048/403094DF 2017-09-03 [SC] [expires: 2018-09-03]
uid         [ultimate] Arnaud Durand <arnaud.durand@unifr.ch>
sub   elg2048/A454F414 2017-09-03 [E] [expires: 2018-09-03]
Run Code Online (Sandbox Code Playgroud)

根据API文档:

public_key响应字段中返回的数据不是GPG格式的密钥.当用户上载GPG密钥时,将对其进行解析,并提取并存储加密公钥.此加密密钥是此页面上的API返回的密钥.此密钥不适合由GPG等程序直接使用.

是否可以从CLI或以编程方式使用这些密钥?

Jen*_*rat 4

返回的密钥是一个裸密钥(RSA、DSA...),如果不再次将其“包装”在正确的 OpenPGP 密钥数据包中,OpenPGP 的实现就无法使用该密钥。我不建议这样做,为什么你应该能够再次构造密钥包,你将没有机会构造子密钥和用户 ID 的绑定签名(这需要访问私钥)并且不会成功并构造一些东西因此有用。

在社区中共享密钥的“OpenPGP 模型”是从密钥服务器网络获取当前副本(包括所有当前的认证和撤销),而不是依赖于 GitHub 等“第三方位置”中可能过时的版本。这可以通过指纹和密钥 ID(或多或少唯一,见下文)寻址特定密钥来实现——不搜索邮件地址,每个人都可以使用任意用户 ID 创建密钥,并且密钥服务器不执行任何验证。

相反,再看一下 API 输出,它返回keyid所有键的对象(一些子键):

[
  {
    "id": 3,
    "primary_key_id": null,
    "key_id": "3262EFF25BA0D270",
    "public_key": "xsBNBFayYZ...",
    "emails": [
      {
        "email": "mastahyeti@users.noreply.github.com",
        "verified": true
      }
    ],
    [snip]
  }
]
Run Code Online (Sandbox Code Playgroud)

要使用此类密钥 ID,请运行gpg --recv-keys <key-id>. 并在 GitHub 上留言以遵循最佳实践并包含完整的指纹:

这些 64 位十六进制值(3262EFF25BA0D270在本例中)是长密钥 ID。虽然对密钥的任何编程引用都应始终包含密钥的指纹,而不是缩写的密钥 ID,但至少它们不提供容易遭受冲突攻击的短密钥 ID