PKI 实践指南:构建完整的证书服务系统
1. 引言
本文是一份基于 EJBCA 的证书服务实践教程,目标是在 Demo 环境中快速跑通 CA/RA 全流程,包括证书模板创建、终端实体模板配置、审批流程启用,以及 RA 端的终端证书申请与下载。教程聚焦“能跑起来”,适合实验、PoC 或内部演示,不涉及生产环境的安全加固与合规细节。
- 主要收获:掌握 EJBCA 的核心操作路径,完成从模板配置到证书签发的全过程
2. 方案架构与术语
- RA:负责终端实体注册与身份审核。
- 证书模板(Certificate Profile):预设密钥用法、SAN、有效期等。
3. 实验环境与前置条件
- 操作系统:Ubuntu 20.04 Server(离线安装)
- 前置软件:Docker ,docker-compose (apt 包)
4. EJBCA Docker 部署与持久化
本文将详细介绍如何在 Docker 中部署 EJBCA 证书服务,并确保其数据持久化存储在独立数据盘上,避免因容器或虚拟机重启导致数据丢失。内容包括使用内部数据库(默认 H2)的持久化配置、docker-compose 方式运行容器、开放远程访问所需的配置。
4.1 环境准备与代理配置
由于部分 EJBCA Docker 镜像(如 keyfactor/ejbca-ce )需要从公网拉取,为确保环境可用,请先配置 Docker Daemon 的 HTTP/HTTPS 代理。
配置 systemd 代理
Docker Daemon 运行在 systemd 管理下,需添加配置以继承系统代理。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
内容如下:
[Service]
Environment="HTTP_PROXY=http://192.168.xxx.xxx:7890"
Environment="HTTPS_PROXY=http://192.168.xxx.xxx:7890"
Environment="NO_PROXY=127.0.0.1,localhost,192.168.13.119"//ip需要改成自己虚拟机主机ip
重新加载并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker --no-pager -l
若输出中含有 Active: active (running) 即表示代理配置生效。
验证代理是否生效
docker info | grep -i proxy
出现如下输出说明代理生效:
HTTP Proxy: http://192.168.xxx.xxx:7890
HTTPS Proxy: http://192.168.xxx.xxx:7890
4.2 数据持久化配置
- 使用文件方式保存 H2 数据库:将数据库配置为
jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1 - 宿主机挂载路径:
/opt/ejbca-data:/mnt/persistent - 避免使用
--rm启动容器 - 设置宿主机权限:
chown -R 10001:10001 /opt/ejbca-data
📌 提示:正式环境建议切换到 PostgreSQL / MySQL 等外部数据库,提升可靠性与容灾能力。
4.3 使用 Docker Compose 部署
- 创建目录结构:
mkdir -p /opt/ejbca-compose
cd /opt/ejbca-compose
mkdir -p /opt/ejbca-data
chown -R 10001:10001 /opt/ejbca-data
- 当前目录下创建
docker-compose.yml,编写docker-compose.yml:
version: "3.3" # 使用 Docker Compose 文件格式版本 3.3
services:
ejbca: # 定义名为 ejbca 的服务
image: keyfactor/ejbca-ce:latest # 使用 Keyfactor 提供的 EJBCA 社区版镜像,使用最新版本
container_name: ejbca # 容器名称为 ejbca
hostname: myejbca.test.local # 容器内部主机名,影响证书中的 CN 等字段
environment: # 设置环境变量配置 EJBCA 的启动行为
- DATABASE_JDBC_URL=jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1 # 使用嵌入式 H2 数据库,数据保存在挂载目录下
- TLS_SETUP_ENABLED=true # 启用自动 TLS 设置(用于 HTTPS 接入)
- SMTP_DESTINATION=192.168.xx.xx # 设置 SMTP 邮件服务器地址(用于发送通知邮件)
- SMTP_DESTINATION_PORT=25 # SMTP 服务端口,默认 25(未启用加密)
- SMTP_FROM=ejbca@example.local # 设置邮件发送的发件人地址
- SMTP_TLS_ENABLED=false # 不启用 SMTP 的 STARTTLS
- SMTP_SSL_ENABLED=false # 不启用 SMTP 的 SSL/TLS 加密
ports: # 映射容器端口到宿主机
- "80:8080" # 宿主机 80 端口映射到容器的 8080(HTTP)
- "443:8443" # 宿主机 443 端口映射到容器的 8443(HTTPS)
volumes: # 数据卷挂载,将容器中的目录映射到宿主机,以持久化数据
- /opt/ejbca-data:/mnt/persistent # 将宿主机的 /opt/ejbca-data 目录挂载到容器中,持久化数据库等数据
restart: unless-stopped # 如果容器异常退出则自动重启,除非人为停止
- 启动容器服务:
docker-compose up -d
docker-compose logs -f
⚙️ 使用 Compose 可轻松管理配置版本,便于团队协作和恢复。
4.4 远程访问配置
- 提前设置容器 hostname(影响 TLS 证书 CN):
hostname: myejbca.test.local
4.5 管理证书信任
- 下载超级管理员证书
.p12后需双击导入证书存储
4.6 登录流程摘要
docker-compose logs -f查找容器日志中SuperAdmin URL和一次性密码:
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * URL: https://myejbca.test.local:443/ejbca/ra/enrollwithusername.xhtml?username=superadmin *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * Password: urAMy0He5c/hHy+DYyDFNy4E *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * Once the P12 is downloaded, use "urAMy0He5c/hHy+DYyDFNy4E" to import it. *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) * *
ejbca | 2025-08-05 09:11:31,656+0000 INFO [/opt/keyfactor/bin/start.sh] (process:1) ******************************************************************************************************
- 访问领取 URL 填写密码 → 设置导出密码 → 下载
.p12 - 导入浏览器后访问:
https://myejbca.test.local/ejbca/adminweb - 若提示未提供客户端证书,检查是否导入成功、代理关闭、域名正确解析
✅ 至此,EJBCA 部署 + 持久化 + 管理登录流程即告完成。
4.7 重要提示(请务必遵守以下要求)
✅ 必须 先将 myejbca.test.local 添加到 hosts 文件,或搭建本地 DNS 服务器,否则浏览器可能无法解析域名。
✅ 超级管理员证书算法默认是 DILITHIUM2(根据版本默认算法会不一样),但 Windows 大概不能识别,建议改为 RSA 4096,以确保兼容性。
✅ 不能开代理,否则 EJBCA 可能无法正确处理客户端证书认证。
✅ 确保 Windows/macOS/Linux 证书存储正确导入,避免 No client certificate was presented 错误。
✅ 第一次建议使用 chrome 浏览器无痕模式,避免缓存问题导致No client certificate was presented。
5. 初始 CA 创建与证书层级搭建
5.1 进入证书 Profile 管理
- 登录 EJBCA 管理控制台。
- 依次点击 CA Functions → Certificate Profiles 进入管理页面。
5.2 创建证书 Profile
方法 1:克隆现有 Profile
- 在列表中找到合适的 Profile(如
ENDUSER)。 - 点击 Clone,输入新名称,保存。
方法 2:手动创建 Profile
- 点击 Add,输入名称后进入编辑页面。
- 根据实际需求设置 Key Usage、Extended Key Usage、有效期、Subject DN 设置等。
- 保存后返回列表查看。
5.3 创建 Crypto Token
- 进入 CA Functions → Crypto Tokens。
- 点击 Create new 并填写:
- Name:输入 Crypto Token 名称。
- Type:选择
SOFT。 - Auto-activation:可选,勾选可自动激活。
- Allow export of private keys:如需导出私钥,勾选
Allow。 - Authentication Code:输入认证码并重复确认。
dd if=/dev/random bs=1 count=128 2>&1| sha256sum | awk '{print $1}
- 保存并在列表中确保状态为 Active。
5.4 生成密钥对
- 进入 Crypto Token 详情页面。
- 在
Crypto Token currently does not contain any key pairs.处输入密钥名称(如signKey)。 - 选择密钥算法(如
RSA 4096)。 - 点击 Generate new key pair 生成密钥。
注意:默认 Profile 不能修改,需克隆后新建。
5.5 创建 CA
- 打开 CA Functions → Certification Authorities。
- 在顶部列表中会看到默认的
ManagementCA (Active);无需选中它。 - 滚动到页面底部的 Add CA 区域:
- 在文本框中输入新 CA 名称,例如
DemoCA。 - 点击右侧 Create… 按钮,进入 CA 配置向导。
- 在文本框中输入新 CA 名称,例如
- 在 Create CA 页面完成相关字段:
- 点击最下方 Create 保存。若配置正确,页面将跳转回 CA 列表并看到
DemoSubCA (Active)状态。 - (可选)若要手动上传由根 CA 签发的证书,可在列表中选中新 CA,然后使用 Import CA certificate… 功能上传链文件。
到此,中间 CA 创建完成,后续即可用它签发终端实体证书。
5.6 Root CA 创建简要步骤案例
1️⃣ CA 类型与密钥配置
| 参数 | 说明 |
|---|---|
| CA Type | X.509 CA ✅ 标准 X.509 证书 CA。 |
| Crypto Token | 选择已创建的 Crypto Token ✅(如 demoCrypto)。 |
| Signing Algorithm | SHA256WithRSA ✅ 更安全的签名算法。 |
| Alternative Signing Algorithm | None ❌ 无需备用签名算法。 |
| Key Sequence Format | Numeric (0-9) ✅ 用于 CA 证书序列号。 |
| Key Sequence | 00000 ✅ 初始序列号,可修改。 |
| Description | Root CA 说明,可填写用途、管理单位等 ✅ |
2️⃣ 证书策略(Directives)
| 参数 | 说明 |
|---|---|
| Enforce unique public keys | ✅ 强制公钥唯一性,防止重复 |
| Enforce key renewal | ❌ Root CA 可不启用 |
| Enforce unique DN | ✅ 确保 DN 唯一(适用于小规模 CA) |
| Enforce unique Subject DN SerialNumber | ❌ 仅适用于大规模 CA(20 个以下证书可不启用) |
| Use Certificate Request History | ❌ 记录证书请求历史,Root CA 不启用 |
| Use User Storage | ✅ 存储用户信息 |
| Use Certificate Storage | ✅ 存储已颁发证书 |
3️⃣ 证书数据(CA Certificate Data)
| 参数 | 说明 |
|---|---|
| Subject DN | CN=test EnterpriseIT Root CA ✅ |
| Signed By | Self Signed ✅ Root CA 必须自签名 |
| Certificate Profile | ITROOTCA_profile ✅ 选择克隆后的 ROOTCA,允许修改参数 |
| Validity | 20y ✅ 证书有效期 20 年 |
| Subject Alternative Name | ❌ Root CA 通常不需要 |
| Certificate Policy OID | ❌ 可选,默认留空 |
| Use UTF-8 in policy notice text | ✅ 确保国际字符支持 |
| PrintableString encoding in DN | ❌ 不勾选,避免影响国际化 |
| LDAP DN order | ✅ 确保 DN 按 LDAP 规范排列 |
| Serial Number Octet Size | 20 ✅ 推荐 20 字节,确保唯一性 |
| Name Constraints, Permitted | ❌ Root CA 默认禁用,留空 |
| Name Constraints, Excluded | ❌ Root CA 默认禁用,留空 |
4️⃣ CRL 配置(证书吊销列表)
| 参数 | 说明 |
|---|---|
| Microsoft CA Compatibility Mode | ❌ Root CA 不启用,仅适用于 Windows 证书颁发机构(AD CS)。 |
| Authority Key ID | ✅ 启用,并标记 Critical,用于标识 CRL 发行者。建议 Root CA 和中间 CA 都启用。 |
| CRL Number | ✅ 启用,并标记 Critical,确保 CRL 版本唯一。建议 Root CA 和中间 CA 启用。 |
| Issuing Distribution Point on CRLs | ❌ Root CA 可不启用,仅适用于分层 CRL 结构的大规模 CA。 |
| CA issuer URI | ❌ 留空,证书下载后期由用户自行提供接口。 |
| Keep expired certificates on CRL | ❌ Root CA 不启用,中间 CA 视情况决定,启用后即使证书过期仍会出现在 CRL 中。 |
| Use CRL partitions | ❌ Root CA 负载小,不需要。适用于大规模证书管理的 CA。 |
| CRL Expire Period | 30d ✅ Root CA 设长一些,如 30d,中间 CA 采用较短的 CRL 过期时间。 |
| CRL Issue Interval | 7d ✅ 定期更新 CRL,建议活跃 CA 采用 7d。 |
| CRL Overlap Time | 12h ✅ 旧 CRL 与新 CRL 重叠 12h,防止证书验证失败。 |
| Delta CRL Period | 0m ❌ Root CA 不使用 Delta CRL,只有对实时性要求高的 CA 才需要启用。 |
| Generate CRL Upon Revocation | ❌ Root CA 不启用,中间 CA 需要时启用,证书撤销后立即生成新的 CRL。 |
| Allow changing revocation reason | ✅ 启用,允许修改证书撤销原因。适用于所有 CA。 |
| Allow invalidity date | ✅ 启用,允许设置证书失效日期。适用于所有 CA。 |
5️⃣ 审批设置
| 参数 | 说明 |
|---|---|
| Add/Edit End Entity | None ❌ Root CA 不管理终端实体 |
| Key Recovery | None ❌ Root CA 不提供密钥恢复 |
| Revocation | None ❌ Root CA 很少撤销自身证书 |
| CA Service Activation | None ❌ Root CA 手动激活 |
6️⃣ 其他数据
| 参数 | 说明 |
|---|---|
| Validators | Finish User ✅ 启用证书验证策略。 |
| CMP RA Authentication Secret | ❌ 留空,仅在使用 CMP 协议时需要配置。 |
| Monitor if CA active (healthcheck) | Activate ✅ 启用 CA 运行监控,适用于所有 CA。 |
| Request Processor | None ❌ Root CA 通常不需要外部请求处理。 |
7️⃣ 外部签名 CA 创建或更新(Externally signed CA creation/renewal)
| 参数 | 说明 |
|---|---|
| Renew CA | ❌ 建议创建新的 Root CA,而不是重新生成密钥并重新签名现有 CA,以避免同名 Root CA 证书带来的问题。 |
| CA Chain Certificates | ✅ 仅当 CA 由外部 CA 签名时才需要上传证书链文件(PEM/DER 格式)。如果 Root CA 已安装在本地,则不需要上传此文件。 |
8️⃣ 完成 CA 创建
检查所有参数,确认无误后,点击 Create 生成 CA。
① 下载并验证 Root CA 证书:
使用以下 OpenSSL 命令验证证书格式和有效性:
# 验证 PEM 格式证书
openssl x509 -in rootca.pem -text -noout
# 验证 DER 格式证书
openssl x509 -in rootca.der -inform DER -text -noout
# 检查证书 SHA256 指纹信息
openssl x509 -noout -fingerprint -sha256 -in rootca.pem
# 验证证书的有效性(自签名证书验证)
openssl verify -CAfile rootca.pem rootca.pem
② 部署并验证 CRL(证书吊销列表):
若配置了 CRL URL,执行:
# 验证 CRL 文件
openssl crl -in rootca.crl -text -noout
确保 CRL 可通过 Web 正常访问。
🚀 Root CA 现在已成功创建,可用于签发中间 CA! 🎉
5.7 中间 CA 创建简要步骤案例
1️⃣ CA 类型与密钥配置
| 参数 | 说明 |
|---|---|
| CA Type | X.509 CA ✅ 标准 X.509 证书 CA |
| Crypto Token | 选择已创建的 Crypto Token ✅(如 demoCrypto) |
| Signing Algorithm | SHA256WithRSA ✅ 更安全的签名算法 |
| Alternative Signing Algorithm | None ❌ 无需备用签名算法 |
| Key Sequence Format | Numeric (0-9) ✅ 用于 CA 证书序列号 |
| Key Sequence | 00001 ✅ 初始序列号,与 Root CA 区分 |
| Description | 中间 CA 说明,可填写用途、管理单位等 ✅ |
2️⃣ 证书策略(Directives)
| 参数 | 说明 |
|---|---|
| Enforce unique public keys | ✅ 强制公钥唯一性,防止重复 |
| Enforce key renewal | ✅ 中间 CA 建议启用,保证安全 |
| Enforce unique DN | ✅ 确保 DN 唯一 |
| Enforce unique Subject DN SerialNumber | ❌ 规模小于 20 个证书时可不启用 |
| Use Certificate Request History | ✅ 记录证书请求历史 |
| Use User Storage | ✅ 存储用户信息 |
| Use Certificate Storage | ✅ 存储已颁发证书 |
3️⃣ 证书数据(CA Certificate Data)
| 参数 | 说明 |
|---|---|
| Subject DN | 例如 CN=test Intermediate CA ✅ |
| Signed By | test EnterpriseIT Root CA ✅ 中间 CA 必须由 Root CA 签名 |
| Certificate Profile | INTERMEDIATE_CA_profile ✅ 克隆后配置适合中间 CA |
| Validity | 10y ✅ 通常为 10 年,有效期小于 Root CA |
| Subject Alternative Name | ❌ 中间 CA 通常不需要 |
| Certificate Policy OID | ❌ 默认留空,或按需填写 |
| Use UTF-8 in policy notice text | ✅ 确保国际字符支持 |
| PrintableString encoding in DN | ❌ 不勾选,避免影响国际化 |
| LDAP DN order | ✅ 按 LDAP 规范排列 DN |
| Serial Number Octet Size | 20 ✅ 推荐 20 字节 |
| Name Constraints, Permitted | ❌ 默认禁用,留空 |
| Name Constraints, Excluded | ❌ 默认禁用,留空 |
4️⃣ CRL 配置(证书吊销列表)
| 参数 | 说明 |
|---|---|
| Microsoft CA Compatibility Mode | ❌ 一般不启用,仅用于 Windows AD 环境 |
| Authority Key ID | ✅ 启用,并标记为 Critical |
| CRL Number | ✅ 启用,并标记为 Critical |
| Issuing Distribution Point on CRLs | ❌ 通常不启用 |
| CA issuer URI | ❌ 留空,或按需填写下载地址 |
| Keep expired certificates on CRL | ❌ 中间 CA 建议启用,保留过期证书,目前不启用,会导致吊销列表越来越大 |
| Use CRL partitions | ❌ 通常不需要 |
| CRL Expire Period | 7d ✅ 建议 7 天,确保及时更新 |
| CRL Issue Interval | 1d ✅ 每天发布,确保及时更新 |
| CRL Overlap Time | 12h ✅ 与旧 CRL 重叠 12 小时,确保平稳过渡 |
| Delta CRL Period | 0m ❌ 不使用 Delta CRL |
| Generate CRL Upon Revocation | ✅ 启用,证书撤销后立即更新 |
| Allow changing revocation reason | ✅ 允许修改证书撤销原因 |
| Allow invalidity date | ✅ 允许设置证书失效日期 |
5️⃣ 默认 CA 验证数据(Default CA defined validation data)
| 参数 | 说明 |
|---|---|
| Default CRL Distribution Point | ❌ 默认留空或按需填写,用于 CRL 分发地址 |
| Default CRL Issuer | ❌ 默认留空,通常无需填写 |
| Default Freshest CRL Distribution Point | ❌ 默认留空,通常无需填写 |
| OCSP Service Default URI | ❌ 默认留空,按需填写 OCSP 地址 |
| CA Issuer Default URI | ❌ 默认留空或后期提供接口 |
6️⃣ 审批设置与其他数据
审批设置目前只有None选项,表示无需额外审批流程,如需开启需检查 EJBCA 的全局审批策略,Supervision Fuctions。
| 参数 | 说明 |
|---|---|
| Validators | Finish User ✅ 启用证书验证策略 |
| CMP RA Authentication Secret | ❌ 留空,仅在使用 CMP 协议时需要配置 |
| Monitor if CA active (healthcheck) | Activate ✅ 启用运行监控 |
| Request Processor | None ❌ 一般不需外部请求处理 |
7️⃣ 完成中间 CA 创建
检查所有参数,确认无误后,点击 Create 生成 CA 请求文件 (CSR)。
提交 CSR 给 Root CA 签名后,下载签名后的证书并验证:
openssl x509 -in intermediate_ca.pem -text -noout
openssl verify -CAfile rootca.pem intermediate_ca.pem
🚀 中间 CA 已成功创建,可用于签发终端实体证书!🎉
6. RA 普通用户创建与权限配置
6.1 创建 RA 角色(Role)
- 进入 RA 管理界面(RA Web),选择菜单:
Role Management →Roles →Create New Role - 填写角色信息:
字段 推荐填写值 Namespace No namespace Role name test RA Users - 设置 Certificate Authorities 权限:
- 从Available列表选择对应CA(如
Intermediate CA,Root CA),点击Add。
- 从Available列表选择对应CA(如
- 设置 End Entity 权限(permissions)(推荐配置):
- ✅ Create end entities
- ✅ Create certificates
- ✅ ...by using username and password
- ✅ ...by using a request ID
- ✅ View end entities and certificates
- 设置 End Entity Profiles 权限:
- 从 Available 列表选择
EMPTY,点击Add。
- 从 Available 列表选择
- 点击
Add保存创建好的角色。
6.2 创建 RA 普通用户 (End Entity)
- 进入 EJBCA Admin Web 界面,选择:
RA Functions → Add End Entity - 填写用户详细信息:
字段 推荐填写值 End Entity Profile EMPTY Username test_signuser Password 123 Confirm Password 123 Batch generation 不勾选 E-mail cert-user@example.com CN test RA user S1 O test C CN Certificate Profile ENDUSER CA test Intermediate CA Token P12 file - 点击
Add,完成 End Entity 创建。
6.3 用户证书下载
- 用户进入RA Web 界面,选择:
Enroll → Use Username - 使用刚创建的用户名和密码登录:
- Username:
test_signuser - Password:
123
- Username:
- 登录后选择密钥算法:
- 选择
RSA 4096算法,生成并下载.p12用户证书。
- 选择
6.4 将用户加入 RA 角色
- 进入 RA Web 界面,选择菜单:
Search → End Entities - 查找并复制刚才创建证书的 CN 。
- 进入 RA 管理界面,选择菜单:
Role Management → Roles → Members → Add Role Member - 填写 Role Member 信息:
字段 推荐填写值 Role test RA Users Token Type Certificate CA test Intermediate CA Match with CN Common Name Match Value 粘贴刚复制的证书 CN Description RA 普通用户 - 点击
Add,完成角色成员添加。 - 重启 EJBCA 服务,使权限生效(推荐):
docker restart ejbca
6.5 用户登录 RA 界面
- 非管理员角色将下载的
.p12证书导入浏览器。 - 访问 RA Web 界面,自动认证并登录。
- 用户即可执行授权内的 RA 操作(如创建和查看证书等)。
6.6 重要提示(请务必遵守以下要求)
✅ 第一次建议使用 chrome 浏览器无痕模式快速启动验证,避免缓存问题导致No OAuth providers configured. Please log in using a valid certificate.。
✅ 访问时候 使用 https 访问,https://192.168.xxx.xxx/ejbca/ra/,避免出现No OAuth providers configured. Please log in using a valid certificate.。
7. 证书模板设置说明
本节用于解释 EJBCA 中终端证书模板(Certificate Profile)设置项的具体含义及推荐用途,适用于 HTTPS/Web/设备/客户端等常见终端证书签发需求。
7.1 基本信息
| 配置项 | 描述 |
|---|---|
| Certificate Profile ID | 模板在数据库中的唯一标识,仅供系统内部识别 |
| 类型 | 可用终端实体,子 CA,根 CA |
| Available Key Algorithms | 可用密钥算法,如 RSA、ECDSA、Ed25519、 DILITHIUM 等 |
| Available ECDSA curves | ECDSA 可选曲线,当前未启用任何曲线 |
| 可用位长度 | 支持的密钥位数(针对 RSA),如 2048、4096 等 |
| 签名算法 | 用于签发证书时的签名哈希算法,如 SHA3-256withRSA |
| Alternative Signature | 是否启用替代签名算法,如 ECDSA, EdDSA 等 |
| 有效期 or end date of the certificate | 默认有效期,如 "2y" 表示 2 年 |
| Validity Offset | 签发日期的偏移量,允许向前或向后设定起始时间 |
| Expiration Restrictions | 限制最大到期时间,用于合规控制 |
| Profile Description | 证书模板说明,用于备注用途(如“终端设备证书”) |
7.2 权限控制(Permissions)
| 配置项 | 描述 | 推荐设置 |
|---|---|---|
| Allow Validity Override | 允许在签发证书时覆盖默认有效期 | ✅,如需手动调整有效期时使用 |
| Allow Expired Validity End Date | 允许设置一个已过期的结束时间(用于测试或审计) | ✅(调试用) |
| Allow Extension Override | 允许 CSR 中的扩展字段覆盖模板中预定义的扩展 | ❌,若开启会破坏模板统一性,可能引入风险 |
| Allow certificate serial number override | 允许在签发时自定义证书序列号 | ❌,仅特定需求下开启(如证书克隆、替换) |
| Allow Subject DN Override by CSR | 允许 CSR 中的主题信息(如 CN/O)覆盖模板配置 | ✅,适用于自动化签发流程 |
| Allow Subject DN Override by End Entity Information | 允许通过终端实体信息(用户输入)指定 Subject 字段 | ✅,灵活性高,推荐开启 |
| Allow Key Usage Override | 允许 CSR 中设置 keyUsage 字段覆盖模板配置 | ❌,开启会造成用途不一致,影响安全性 |
| Allow Backdated Revocation | 允许将吊销时间设置为历史时间,用于追溯性撤销 | ✅,部分审计/合规场景下需要 |
| Use Certificate Storage | 启用证书在数据库中存储(必须开启,除非特殊离线用途) | ✅ |
| Store Certificate Data | 存储证书完整原文数据(配合 OCSP/CRL 使用) | ✅,建议与存储功能一同开启 |
✅ 建议:在生产环境中保持模板统一性,除非明确需要,否则尽量关闭 Override 类权限项,避免 CSR/End Entity 越权操作。
7.3 X.509v3 扩展 - 基础信息
| 扩展项 | 描述 | 推荐设置 |
|---|---|---|
| 基本约束(Basic Constraints) | 限制是否为 CA 证书(终端证书应设为 FALSE) | ✅ 使用,关键 |
| CA 密钥标识符 | 标识签发 CA 的信息 | ✅ 使用 |
| 主题密钥标识符 | 生成此证书的唯一标识 | ✅ 使用 |
7.4 X.509v3 扩展 - 密钥用途(Key Usage)
| 项目 | 描述 |
|---|---|
| 数字签名 (digitalSignature) | 用于验证签名,如身份认证、代码签名 |
| 不可抵赖 (nonRepudiation) | 表明签名不可否认(法律场景) |
| 数据加密 (dataEncipherment) | 用于加密非密钥数据 |
| 密钥加密 (keyEncipherment) | 用于加密密钥材料,如对称密钥 |
| 密钥协议 (keyAgreement) | 支持密钥协商协议(如 DH) |
| CRL 签名 (cRLSign) | 用于签署吊销列表(CA 用) |
| 密钥证书签名 (keyCertSign) | 用于签署证书(CA 用) |
| 只用于加密 (encipherOnly) | 与密钥协议联合使用(仅加密) |
| 只用于解密 (decipherOnly) | 与密钥协议联合使用(仅解密) |
| Forbid encryption usage for ECC keys | 禁止 ECC 密钥用于加密 |
7.5 X.509v3 扩展 - 扩展密钥用途(Extended Key Usage)
| 扩展用途 | 描述 |
|---|---|
| TLS client | 用于客户端 TLS 认证 |
| TLS server | 用于服务器 TLS 认证 |
| EAP over LAN (EAPOL) | 企业网身份认证 |
| EAP over PPP | 点对点协议身份认证 |
| ETSI TSL Signing | 用于 ETSI TSL 签名场景 |
| ICAO Deviation List Signing | ICAO 签名用途之一 |
| ICAO Master List Signing | ICAO 主列表签名 |
| Intel AMT management | Intel 管理认证专用 |
| Internet Key Exchange for IPsec | IPsec 密钥交换 |
| Kerberos Client Authentication | Kerberos 客户端认证 |
| Kerberos KDC | Kerberos 密钥中心 |
| MS CA Key Exchange | Microsoft CA 密钥交换用途 |
| MS Commercial Code Signing | Microsoft 商业代码签名 |
| MS Document Signing | Microsoft 文档签名 |
| MS EFS Recovery | Microsoft EFS 恢复用途 |
| MS Encrypted File System | Microsoft 加密文件系统用途 |
| MS Individual Code Signing | Microsoft 个人代码签名 |
| MS 智能卡登录 | Microsoft 智能卡登录验证 |
| OCSP 签发者 | 在线证书状态协议(OCSP)签名证书用途 |
| PDF Signing | 用于 PDF 文件签名 |
| PIV Card Authentication | PIV 卡身份认证 |
| RFC9336 Document Signing | 符合 RFC9336 的文档签名用途 |
| SCVP Client | 简化证书验证协议客户端 |
| SCVP Server | 简化证书验证协议服务端 |
| SIP Domain | 用于 VoIP/SIP 域名认证用途 |
| SSH Client | 用于 SSH 客户端认证 |
| SSH Server | 用于 SSH 服务器认证 |
| 代码签名 (codeSigning) | 用于软件/驱动程序签名 |
| 任意扩展的密钥用途 | 任意通用用途扩展支持 |
| 安全 Email (emailProtection) | S/MIME 邮件签名/加密用途 |
| 客户身份验证 (clientAuth) | 用于 TLS 客户端身份认证 |
| 时间戳 (timeStamping) | 时间戳服务签名用途 |
| 服务器验证 (serverAuth) | 用于服务器身份验证(HTTPS 等) |
7.6 名称扩展
| 项目 | 描述 | 建议 |
|---|---|---|
| 主题别名(Subject Alt Name) | 支持 IP/DNS/UEmail 作为证书标识 | ✅ 使用 |
| Issuer Alternative Name | 可添加额外的 CA 名称信息 | 可选 |
| Name Constraints | 限定主题中可用的命名空间 | 可选(高安全场景使用) |
7.7 验证扩展(Validation Data)
| 项目 | 描述 | 推荐 |
|---|---|---|
| CRL 发布点 | 证书吊销列表地址 | ✅ 使用,关键 |
| Delta CRL(Freshest CRL) | 增量吊销列表 | 按需开启 |
| Authority Information Access (AIA) | 提供 OCSP/CA 信息 | ✅ |
7.8 私钥使用期限制
| 项目 | 描述 |
|---|---|
| Start Offset | 私钥可用的起始偏移时间 |
| Period Length | 私钥的可使用周期(独立于证书有效期) |
7.9 🇪🇺 ETSI 合规扩展(一般用于合规性要求高的 PKI 环境)
| 项目 | 描述 |
|---|---|
| 资质证书声明 | 用于标识法律或合规用途证书 |
| Assured validity | 确保短期证书的有效性 |
7.10 其他扩展(Other Extensions)
| 扩展 | 用途 |
|---|---|
| OCSP No Check | 禁用 OCSP 检查(通常仅对 OCSP responder 有用) |
| Microsoft 模板值 | 用于 Windows AD 集成的特殊扩展 |
| CA/B Forum OID | 用于 CA/B 合规的组织标识扩展 |
7.11 审批设置 & 附加字段
| 配置项 | 说明 |
|---|---|
| 添加/编辑终端实体 | 绑定的审批流程 |
| 密钥恢复 | 是否支持密钥找回(如用于备份恢复) |
| 撤销审批 | 吊销时是否需审批 |
| CN 后缀 | 在 Subject CN 后自动添加字符串 |
| 主题字段子集限制 | 限制允许使用的 Subject 字段 |
7.12 CA & 发布设置
| 项目 | 说明 |
|---|---|
| 可用的 CA | 允许哪些 CA 使用此证书模板 |
| 发布器(Publisher) | 可配置发布至 LDAP、数据库或外部服务 |
| 单证书限制 | 是否启用一个 End Entity 只能有一张有效证书 |
| Account Binding Namespace | 用于设备账户绑定场景(如 IoT) |
如需配置 "代码签名证书" 模板,请在此基础上调整 keyUsage 与 extendedKeyUsage 字段即可。
📌 建议对不同应用(如:VPN、HTTPS、代码签名、客户端认证)创建不同模板,便于管理和合规控制。
8. 审批配置与管理
8.1 创建 Approval Profile(审批配置)
- 进入:
监察员功能 → Approval Profiles
- 在底部输入名称(如
test)→ 点击添加。 - 在列表中点击
编辑进入详细设置。
8.2 基本参数设置
| 字段 | 建议/示例 |
|---|---|
| Approval Profile Type | Accumulative Approval(累计);跨部门可用 Partitioned Approval(分区) |
| Request Expiration Period | 8h(超时未批作废) |
| Approval Expiration Period | 8h(结果过期需重批) |
| Max Extension Time | 0d(不允许延长) |
| Allow Self Approved Request Editing | 不勾选(生产禁用自批) |
8.3 审批步骤(Approval Steps)
- 设置
Number of Required Approvals:- 开发/测试:
1(1-of-1)。 - 生产/敏感操作:
2(2-of-2)或分区审批。
- 开发/测试:
- 通知邮件:
Notification message email recipient:approval-admin-group@example.org supervisor@example.orgNotification message email sender:no-reply@192.168.xxx.xx- 主题模板示例:
[AR-${approvalRequest.ID}-${approvalRequest.STEP_ID}-${approvalRequest.PARTITION_ID}] Approval Request - 正文可引用变量:
${approvalRequest.TYPE}、${approvalRequest.REQUESTOR}、${approvalRequest.WORKFLOWSTATE}等。
8.4 绑定到具体动作
End Entity Profile:
CA Functions → End Entity Profiles → <Profile> → Approval Settings → 勾选需要审批的操作(如Add/Edit End Entity) → 选择上面创建的 Approval Profile → Save
常用勾选:Add/Edit End Entity、Key Recovery(若启用)。
Certificate Profile:
CA Functions → Certificate Profiles → <Profile> → Approval Settings → 勾选相关操作 → 选择 Approval Profile → Save
管理员敏感动作: 中间 CA 变更、吊销等建议使用 2-of-2 或分区审批。
8.5 测试与验证
- 用一个普通 RA 账号在 RA Web 发起一次需要审批的操作(如创建 End Entity)。
- 到
监察员功能 → Approvals查看待审批队列,使用另一个审批员账号完成审批。 - 确认操作自动执行,且邮件通知正常到达。
8.6 常见问题
- 邮件收不到:检查 SMTP 配置、防火墙、收件人拼写;查看容器日志。
- 一直待审批:
Number of Required Approvals设置过高或审批人不具备权限。 - 能自批:误勾选了 Allow Self Approved Request Editing;生产应关闭。
- 过期作废:
Request/Approval Expiration设置过短;可调到8–24h。
9. 终端实体模板设置
位置:RA Functions → End Entity Profiles。终端实体模板(End Entity Profile)决定了“能填哪些字段”“哪些必填/可改”“默认使用哪个证书模板/CA/Token”。
9.1 新建与进入
- 进入:
RA Functions → End Entity Profiles
- 在底部输入模板名(如
test)→ 添加模板。 - 在列表中选中该模板 → 编辑终端实体模板。
9.2 基本信息(用户名/密码/邮箱)
是否必须提前填? 通常 不需要 在模板里写死具体“用户名/密码”。模板里只定义“规则与方式”,具体的 Username/Password/Enrollment Code 在创建 End Entity 或申请时填写即可。
推荐做法
- Username:选择
Auto-generated(批量/自动化最方便),或在创建 End Entity 时手动指定。 - Password (or Enrollment Code):勾选
Required,作为一次性 Enrollment Code 使用;具体值在创建 End Entity 或 RA 端申请时再填。 - Minimum password strength / length:保持策略(如长度 ≥ 8),但不在模板里填具体密码。
- Maximum number of failed login attempts:按需限制;可勾
Modifiable便于临时调整。 - Batch generation:一般关闭;避免明文存储 Enrollment Code。
- E-mail:按业务是否
Required/Modifiable,便于通知与标识。
不同申请路径对 Username/Password 的影响
- RA Web → Enroll → Use Username:创建 End Entity 时需要指定
Username与Password/Enrollment Code,用户用该账号登录领取证书。 - RA Web → Enroll → Use Request ID:由系统分配
Request ID,Password/Enrollment Code在创建时设置,申请人用 ID+Code 领取。 - User Generated(CSR 提交):
Token=User Generated;保留Required以生成一次性代码,申请人用 CSR+Code 完成签发。
Directives(指令)
Reverse Subject DN and Subject Alt Name Checks:不勾也可以。Allow merge DN for all interfaces:通常 不勾,仅在多接口需要聚合 DN 时启用。Allow multi-value RDNs:仅特殊需求启用(默认关闭更安全)。
9.3 主体 DN 属性(Subject DN Attributes)—需要自己添加
左侧是“可选属性”,右侧是“已选属性”。把需要的字段添加到右侧,并为每个字段设置 Required / Modifiable / Validation。
常见推荐(客户端/通用):
| 字段 | 建议 |
|---|---|
CN, Common name | Required;Modifiable 由 RA 决定 |
emailAddress, E-mail address in DN | 选配;如需与邮件系统绑定可 Required |
O, Organization / OU, Org. Unit | 视业务;建议 Modifiable 关闭以避免乱填 |
C, Country | 固定为 CN 或所在国家;通常不允许修改 |
若需要更严格的校验,可在 Validation 指定正则/格式规则。
9.4 其他主体属性(Other Subject Attributes)—需要自己添加
Subject Alternative Name(SAN):
- 客户端证书:
RFC 822 Name (e-mail address)(与账户邮箱一致) - 服务器证书:
DNS Name、IP Address(按域名/IP 添加) - 设备证书:
OtherName(写入设备 ID/OID)
Subject Directory Attributes(可选):
- 仅在需要存档/合规时使用,例如
Date of birth (YYYYMMDD)等;默认不建议开启过多目录属性。
添加方法:在 Other Subject Attributes 区域选择条目 → 添加 到右侧;如界面支持,可设置
Required/Modifiable。
9.5 主要证书数据(Main Certificate Data)
| 字段 | 建议/说明 |
|---|---|
| Default Certificate Profile | 选择目标证书模板(如 ENDUSER / SERVER) |
| Available Certificate Profiles | 仅勾选允许使用的模板,避免误选 |
| Default CA / Available CAs | 指定可签发的 CA;注意:修改可用 CA 会影响角色对此 Profile 的访问 |
| Default Token / Available Tokens | P12 file(RA 直接下载 p12)或 User Generated(用户自带 CSR) |
9.6 其他证书数据(Other Certificate Data)
Custom certificate serial number:默认关闭Certificate Validity Start/End Time:默认由 Certificate Profile 控制;如需临时证书可开启并ModifiableName Constraints (Permitted/Excluded):一般用于中间 CA;终端实体模板通常不启用Custom certificate extension data/ETSI PSD2 QC Statement/CA/B Forum Organization Identifier:按合规需要开启
9.7 其他数据与限制(Other Data / Restrictions)
| 字段 | 建议 |
|---|---|
Number of allowed requests | 1(防多次重复签发) |
Allow renewal before expiration | 例如 30 天;如不限制填 -1 |
Revocation reason to set after certificate issuance | 默认 Active(一般不改) |
Redact Subject Name from logs | 仅在隐私/合规强需求时开启 |
Send Notification | 按需;与 SMTP 配置关联 |
9.8 保存与授权
- 点击 保存。
- 到 RA Web → Role Management 确认相关角色已被授权“使用此 End Entity Profile”(可见/可创建)。
- 在 Search → End Entities 使用该模板创建测试用户,验证:
- DN/SAN 是否按规则入库;
- 证书是否使用了期望的 Certificate Profile/CA/Token;
- 下载/导入是否成功(P12/PEM/CSR 流程)。
10. RA 普通用户申请终端证书
位置:RA Web → Enroll。
默认建议:优先使用 By the CA(CA 端生成密钥),无需 CSR,流程最稳、最少出错。
10.1 路径与前置
- 已在 End Entity Profiles(第 9 节)与 Certificate Profiles 准备好模板;用户具备访问权限。
- 若启用审批(第 8 节),提交后会进入待审队列,审批通过才签发。
10.2 推荐:By the CA(无需 CSR)
- 进入:
Enroll → Make New Request
- 选择 Certificate Type(End Entity Profile)与 Certificate subtype(Certificate Profile)。
- 在 Key‑pair generation 选择 By the CA。
- 展开 Provide request info,按模板要求填写 Subject DN / SAN(如 CN、Email、DNS/IP)。
- 下载
*.p12。
10.3 可选:Provided by user(上传 CSR)
仅当必须在客户端/服务器本地生成密钥(如合规要求、HSM/专用设备、已有密钥迁移)时使用。
- 本地生成私钥与 CSR:
- 在页面选择 Provided by user,将完整 CSR(含
BEGIN/END CERTIFICATE REQUEST)粘贴到输入框。 - 提交并按提示下载证书(不会包含你的私钥)。
10.4 审批联动与通知
- 当 Profile 绑定了 Approval Profile 时,提交即进入待审;通过后自动签发或开放下载。
- 邮件主题/正文遵循第 8 节的通知模板。
10.5 常见问题
- 字段不通过:DN/SAN 与 Profile 约束不一致;按第 9 节调整。
- 不能下载 P12:浏览器拦截或口令策略冲突;更换浏览器/检查口令长度与字符集。
- CSR 被拒:CSR 中 Subject/SAN 与模板冲突;按模板重建 CSR 或改用 By the CA。
- 审批卡住:审批人数未满足或审批人权限不足;去“监察员功能 → Approvals”。
[Copyright] Copyright © 2026 openUBMC Community. This article was first published by the openUBMC Community. Reproduction is welcomed under CC-BY-SA 4.0. When reproducing, please prominently note the source in the text and retain the original article link and author information.
[Disclaimer] The views expressed in this article are solely those of the author and do not represent the stance of this website. This website remains neutral regarding the statements and opinions presented and provides no express or implied warranty as to the accuracy, reliability, or completeness of the content. This article is intended for reference only, and all legal responsibilities arising therefrom shall be borne by the reader.
