公开 CA 注册模板

https://blueprints.launchpad.net/barbican/+spec/expose-ca-enrollment-templates

问题描述

Barbican 将允许通过多个 CA 插件与多个证书颁发机构 (CA) 进行交互。每个插件期望证书请求符合特定格式并具有特定的输入参数。通用的 CA 接口将使客户端更容易构建证书请求。尽管如此,仍然需要一种机制来公开创建证书请求所需的参数。

提议的变更

在 [1] 中为证书颁发机构提出了一种新的资源。该接口可用于公开创建证书请求所需的参数。以下 REST API 部分显示了接口更改的详细信息。

通过实现两个新的 API 调用:get_enrollment_templates() 和 get_enrollment_template(template) 从插件获取数据。这些调用可以具有默认实现,返回 None,以便并非所有插件都需要立即实现这些调用。

对于通用 API,将实现方法 get_common_enrollment_templates() 和 get_common_enrollment_template() 以返回正确的数据。

备选方案

保持代码库不变。

数据模型影响

无。

REST API 影响

将添加以下 REST API 操作

  • GET /cas/templates/enrollment – 返回通用 CA API 的请求模板。这将最终返回 get_common_enrollment_templates() 的数据。

  • GET /cas/{ca_id}/templates/enrollment – 返回特定 CA(由 ca_id 定义)的请求模板列表。这将最终返回调用 get_enrollment_templates(plugin_ca_id) 在特定插件上的数据。

ca_id 值在识别 ca_id 的规范 [1] 中定义,该规范已在服务器中实现。

这种方法也为将来根据需要公开其他类型的模板(例如续订和撤销模板)留下了可能性。

返回的数据可以包含参数和/或指向附加数据的链接。所有相关链接都将从属于请求模板 URL。

例如,对于 Dogtag CA,调用

  • GET /cas/{ca_id}/templates/enrollment 可能会返回

    {“templates”:[
    {“id”: “caUserCert”,

    “name”: “手动用户双用途证书注册”, “description”: “此证书配置文件用于注册用户证书。”, “link”: “https://host:port/cas/ca1/templates/enrollment/caUserCert”},

    {“id”: “caServerCert”,

    “name”: “服务器证书注册”, “description”: “此证书配置文件用于注册服务器证书。”, “link”: “https://host:port/cas/ca1/templates/enrollment/caServerCert”}

    ]}

  • GET /cas/{ca_id}/templates/enrollment/caServerCert 可能会返回

    {“parameters”:[
    {“id”: “profile_id”,

    “description”: “配置文件 ID”, “syntax”: “string”},

    {“id”: “cert_request_type”,

    “description”: “证书请求类型”, “syntax”: “cert_request_type”},

    {“id”: “cert_request”,

    “description”: “证书请求”, “syntax”: “cert_request”},

    {“id”: “requestor_name”,

    “description”: “请求者姓名”, “syntax”: “string”},

    {“id”: “requestor_email”,

    “description”: “请求者邮箱”, “syntax”: “string”},

    {“id”: “requestor_phone”,

    “description”: “请求者电话”, “syntax”: “string”}

    ]}

想法是,填写上述所有参数的客户端将使用所有必需的参数创建证书请求。

使用上述参数的示例请求如下

{ 'type': 'certificate',
  'meta': { 'profile_id': 'caServerCert',
            'ca_id': '{ca_id}'
            'cert_request_type': 'pkcs10',
            'cert_request': '<put PEM formatted CSR here>',
            'requestor_name': 'John Wood',
            'requestor_email': 'jwood@rackspace.com',
            'requestor_phone': '555-1212'
          }
}

请注意,’profile_id’ 的指定需要指定 ‘ca_id’。此检查已在服务器中强制执行。

安全影响

无。通过此接口公开的数据是 CA 选择公开的参数,以向用户展示如何与其交互。这些是 CA 在 Web UI 或作为其客户端 API 的一部分所暴露的内容。这些数据本质上是公开的 - 否则没有人会知道如何与 CA 交互。

所有这些信息都由 CA 插件向 CA 查询。Barbican 仅揭示 CA 选择公开的内容。

通知与审计影响

无。

其他最终用户影响

需要增强 python-barbicanclient 以利用此新功能。特别是,可以通过参数递归(交互式或其他方式)生成有效的证书请求。

性能影响

无。

其他部署者影响

无。

开发人员影响

插件开发人员可以选择实现新方法以利用新功能。

实现

负责人

主要负责人

alee-3

工作项

  • 添加代码以实现新的 API 调用并调用 get_enrollment_templates() 等。将这些调用及其默认实现添加到插件接口。

  • 添加代码以实现 get_common_enrollment_templates() 和 get_common_enrollment_template(x)。

  • 根据需要为每个插件实现 get_enrollment_templates() 和 get_enrollment_template()。

  • 记录所有内容,包括 sphinx 文档。

依赖项

测试

当前的单元和功能测试也将修改以反映此更改。

文档影响

需要记录的新功能。

参考资料

[1] 识别 CA 的规范:https://review.openstack.org/#/c/129048

此规范在 Kilo 中在服务器中实现。