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 © 2026 openUBMC Community。本文由openUBMC社区首发,欢迎遵照CC-BY-SA 4.0协议规定转载。转载时敬请在正文注明并保留原文链接和作者信息。
【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。
