公开 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 中在服务器中实现。