Skip to content

本文为 SPIRE 官方文档 plugin_server_upstreamauthority_ejbca 的中文译本,以英文原文为准。

🔗 穿越源码分析:Server 详解 · UpstreamAuthority · 上游 CA 与无缝轮换

服务端插件:UpstreamAuthority "ejbca"

ejbca UpstreamAuthority 插件使用一个已连接的 EJBCA 为 SPIRE server 签发中间签名证书(intermediate signing certificate)。插件通过 mTLS(客户端证书)向 EJBCA 认证。

EJBCA UpstreamAuthority 插件只使用 /ejbca-rest-api/v1/certificate/pkcs10enroll 这一个 REST API 端点,同时兼容 EJBCA CommunityEJBCA Enterprise

要求

  • EJBCA Community 或 EJBCA Enterprise
    • 必须在 System Configuration > Protocol Configuration 下启用 "REST Certificate Management" 协议。

在使用本插件之前,妥善配置 EJBCA 的证书配置档(Certificate Profile)与端实体配置档(End Entity Profile)非常重要。插件不会尝试配置这些配置档。更多信息请参阅 EJBCA 子 CA 端实体配置档与证书配置档配置 一节。

配置

EJBCA UpstreamAuthority 插件接受以下配置项。

配置项说明来自环境变量的默认值
hostname所连接 EJBCA 服务器的主机名。
ca_cert_path(可选)用于校验 EJBCA 服务器证书的 CA 证书文件路径。证书必须为 PEM 格式。EJBCA_CA_CERT_PATH
client_cert_path用于向 EJBCA 认证的客户端证书(仅公钥)的路径。必须为 PEM 格式。EJBCA_CLIENT_CERT_PATH
client_cert_key_pathclient_cert 匹配、用于向 EJBCA 认证的客户端密钥的路径。必须为 PEM 格式。EJBCA_CLIENT_CERT_KEY_PATH
ca_name所连接 EJBCA 实例中将签发中间签名证书的某个 CA 的名称。
end_entity_profile_name所连接 EJBCA 实例中一个已配置为可签发 SPIFFE 证书的端实体配置档的名称。
certificate_profile_name所连接 EJBCA 实例中一个已配置为可签发中间 CA 证书的证书配置档的名称。
end_entity_name(可选)端实体名称,或用于配置 EJBCA UpstreamAuthority 应如何确定端实体名称的设置。更多信息见端实体名称定制
account_binding_id(可选)EJBCA 中的一个账号绑定 ID(account binding ID),用于关联所签发的证书。

具有环境变量覆盖(override)的配置参数,总是会用环境中的值覆盖 SPIRE 配置中所提供的值。

如果所选认证方式的全部配置参数都由环境变量指定,仍必须存在一个空的配置块来选定该认证方式。

hcl
UpstreamAuthority "ejbca" {
    plugin_data {
        hostname = "ejbca.example.com"
        ca_cert_path = "/path/to/ca_cert.pem"
        client_cert_path = "/path/to/client_cert.pem"
        client_cert_key_path = "/path/to/client_key.pem"
        ca_name = "Fake-Sub-CA"
        end_entity_profile_name = "fakeSpireIntermediateCAEEP"
        certificate_profile_name = "fakeSubCACP"
        end_entity_name = "cn"
        account_binding_id = "foo123"
    }
}

EJBCA 子 CA 端实体配置档与证书配置档配置

所连接的 EJBCA 实例必须至少有一个证书配置档(Certificate Profile)和至少一个端实体配置档(End Entity Profile),且它们能够签发 SPIFFE 证书。证书配置档的类型必须为 Sub CA,并且至少必须能够以 ECDSA prime256v1 算法签发证书。SPIRE Server 配置可能还会要求额外的字段。

端实体配置档必须具有以下 Subject DN 属性:

  • serialNumber, Serial number (in DN) [可修改]
  • O, Organization [可修改]
  • C, Country (ISO 3166) [可修改]

以及以下 Other Subject Attributes:

  • Uniform Resource Identifier (URI) [可修改]

EJBCA 端实体名称定制(叶子证书)

EJBCA UpstreamAuthority 插件允许用户决定端实体名称(End Entity Name)在运行时如何选取。以下是 end_entity_name 可用的选项:

  • cn: 使用 CSR 的可辨识名称(Distinguished Name)中的 Common Name。
  • dns: 使用 CSR 的主体备用名称(Subject Alternative Names,SAN)中的第一个 DNS Name。
  • uri: 使用 CSR 的主体备用名称(SAN)中的第一个 URI。
  • ip: 使用 CSR 的主体备用名称(SAN)中的第一个 IP Address。
  • 自定义值: 任何其他字符串都会被直接用作端实体名称。

默认情况下,SPIRE 签发的证书没有 DN,只在 SAN 中包含 SPIFFE ID。如果你想把 SPIFFE ID 用作端实体名称,通常可以将此字段留空或设为 uri

如果未显式设置 endEntityName 字段,EJBCA UpstreamAuthority 插件将按以下默认行为尝试确定端实体名称:

  • 首先,它会尝试使用 Common Name: 它查看 CSR 可辨识名称中的 Common Name。
  • 如果 Common Name 不可用,则使用第一个 DNS Name: 它查看 CSR 主体备用名称(SAN)中的第一个 DNS Name。
  • 如果 DNS Name 不可用,则使用第一个 URI: 它查看 CSR 主体备用名称(SAN)中的第一个 URI。
  • 如果 URI 不可用,则使用第一个 IP Address: 它查看 CSR 主体备用名称(SAN)中的第一个 IP Address。
  • 如果上述都不可用,则返回一个错误。