本文为 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 Community 和 EJBCA 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_path | 与 client_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 配置中所提供的值。
如果所选认证方式的全部配置参数都由环境变量指定,仍必须存在一个空的配置块来选定该认证方式。
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。
- 如果上述都不可用,则返回一个错误。