一、前言:
1.关于EJBCA
EJBCA 是一款开源的企业级 Public Key Infrastructure(PKI,公钥基础设施)解决方案,核心用于管理数字证书和加密密钥的全生命周期,为企业、组织提供身份认证、数据加密、通信安全等基础安全能力。
最初基于 Java 技术开发,现由 Keyfactor 维护并提供商业支持,其核心价值是解决 “信任问题”—— 通过数字证书确认设备、用户、服务的身份合法性,确保数据在传输、存储过程中的机密性和完整性。它不仅是一个 “证书签发工具”,更是一套可扩展、可定制的 PKI 管理平台,支持从小型部署到大型跨国企业的大规模证书管理需求。
2.关键特性
(1).高可扩展性
支持集群部署和负载均衡,可应对上万甚至百万级别的证书签发请求(如 IoT 设备认证场景)。
提供多租户功能,允许在同一套系统中为不同部门、子公司独立管理 PKI 体系,数据隔离且互不干扰。
(2).安全与合规
遵循 X.509 证书标准、RFC 系列协议(如 RFC 5280),符合 GDPR、HIPAA、SOX 等行业合规要求。
支持硬件安全模块(HSM)集成,可将核心密钥存储在 HSM 中,防止密钥泄露,提升安全性。
(3).灵活定制与集成
提供 REST API、SOAP API 和命令行工具,可与企业现有系统(如 LDAP/Active Directory 身份系统、SAML/OAuth 认证平台、IoT 设备管理平台)无缝集成。
支持自定义证书模板、签发流程和审批机制,适配不同场景(如员工身份证书、设备证书、SSL 服务器证书)的需求。
(4).全生命周期管理
覆盖证书从 “申请→审核→签发→续订→吊销→归档” 的完整生命周期,无需手动干预关键环节,减少运维成本。
3.核心功能
(1).证书管理
签发多种类型证书:SSL/TLS 服务器证书、客户端证书(用于用户登录)、代码签名证书、IoT 设备证书、VPN 证书等。
支持证书自动续订(提前触发续订流程)和批量操作(批量签发、批量吊销),适合大规模场景。
(2).CA 层级管理
支持构建多层级 CA 架构(根 CA→子 CA→ issuing CA),根 CA 可离线存储(提升安全性),子 CA 负责实际证书签发,符合企业级 PKI 的最佳实践。
可创建 “从属 CA”,实现跨地域、跨部门的证书管理分布式部署。
(3).密钥管理
支持密钥对的自动生成(系统生成)或导入(用户提供),密钥算法覆盖 RSA、ECC、DSA 等主流类型。
提供密钥备份与恢复功能,防止因硬件故障导致密钥丢失。
(4).可视化管理与监控
内置 Web 管理控制台,可直观查看 CA 状态、证书库存、过期预警、操作。
4.为什么要写这个文章
小周最近在研究服务器之间的HTTPS通信,由于给每个服务器签IP证书价格有些昂贵,因此选择使用自签名证书,自己自签名又想折腾一下CA相关的东西。EJBCA是一个很好用的工具,包括SSL.COM也在使用EJBCA。想做一个网站来专门用来签内网证书,由于想折腾一下,好好玩一玩EJBCA,因此也想加入OCSP、CRL这些。
但是网上基本上没有详细讲解从安装EJBCA到如何使用EJBCA,因此小周打算写一系列文章,用来讲解EJBCA的使用,如有错误,欢迎指正。
二、安装
1.Docker安装
注意此搭建基于Docker部署直接部署所有的服务,CA和RA部署在一台服务器上,如果你需要分开部署的话,你就需要再找找官方文档,根据官方文档看看怎么部署,但是官方文档是全英文。
2.创建目录
mkdir -p containers/datadbdircd containers3.创建 Docker Compose 文件
注意:此处使用的是MySQL数据库,如果你需要使用其他数据库,请注意数据库语句。
vim docker-compose.ymlnetworks:
access-bridge:
driver: bridge
application-bridge:
driver: bridge
services:
ejbca-node1:
hostname: ejbca-node1
container_name: ejbca
image: keyfactor/ejbca-ce:latest
networks:
- access-bridge
- application-bridge
environment:
# 关键:修改JDBC URL指向您的MySQL(替换<>中的内容)
- DATABASE_JDBC_URL=jdbc:mysql://<IP地址>:<端口号>/<数据库名>?characterEncoding=UTF-8
# 您的MySQL用户名(替换为实际用户)
- DATABASE_USER=ejbca
# 您的MySQL密码(替换为实际密码)
- DATABASE_PASSWORD=<你的密码>
- LOG_LEVEL_APP=INFO
- LOG_LEVEL_SERVER=INFO
- TLS_SETUP_ENABLED=simple
ports:
#端口转发外部端口:内部端口
- "8080:8080"
- "8443:8443"请注意,在没有客户端的情况下启动容器时,最初将使用 TLS 证书,任何具有 HTTPS 访问权限的人都可以管理实例。
4.启动容器
docker compose up -d要查看和跟踪容器启动的日志输出,请执行以下作:
docker compose logs -f看到这里就说明启动成功了

如果出现这种,就说明数据库配置存在问题

注意此时就需要放行端口,在配置文件中设置的外部端口,8080和8443.
然后再根据自己的实际情况访问:https://你的IP:8443/ejbca/adminweb/
5.配置
访问网站会提示你证书不被信任,此时只需要点击继续浏览,会弹出一个对话框让你选择证书,此时不需要选择证书,只需要点击取消即可进入管理页面。
(1).签发管理员证书
在管理页面,选择RA Web,
在Request new certificate一栏,点击Make New Request,
然后Certificate subtype一栏选择ENDUSER (default)
然后Key-pair generation一栏选择By the CA
然后Key algorithm一栏选择RSA 2048 bits

在Common Name设置为SuperAdmin
然后取消勾选Key Recoverable

在Provide User Credentials这一栏中,需要设置证书的用户名和密码,这个是必须的,我这里Username设置的superadmin,然后Enrollment code和Confirm enrollment code是密码和确认密码。注意务必记住,在导入证书到浏览器时需要使用。
最后点击Download the PKCS#12
(2).导入证书到浏览器
我这里以Edge浏览器为示例,Google浏览器、Firefox等浏览器请自行查找方法。
找到浏览器右上角的三个点,然后打开设置。

找到隐私、搜索和服务下面的安全性

然后选择管理证书

然后选择你的证书-管理从Windows导入的证书-导入

然后点击下一步,选择你刚刚下载的证书。
注意:选择证书时,注意右下角的文件后缀,默认是pem,要改为p12

然后输入你设置的密码,然后导入到默认的就可以了。
(3).授权
生成证书之后,还需要授权该证书,这里我们为了方面,直接授权我们刚刚为证书设置的Common Name
在控制台选择System Functions下面的子菜单Roles and Access Rules
然后找到Super Administrator Role这一项后面的Members点击进入
然后Match with选择X509:CN, Common name.
然后CA选择Management CA
然后Match Value设置为SuperAdmin(注意:大小写一定要区分!)
最后点击Add就授权好了。

(4).重启服务
设置了之后需要重启一下
docker compose restart如果你想看下日志,也可以使用下面的命令
docker compose logs -f重启需要一点时间,这时候打不开是正常的。
(5).删除公共访问
这时候后台还是公共访问的,为了防止未经授权的访问,我们需要限制只能通过刚刚生成的管理员证书登录。
注意:此时我们还是以游客身份登录的,我们需要切换到证书登录。
此处仅演示Edge浏览器
选择左上角的红色不安全标志,点击你的证书选择

然后选择刚刚安装的证书。

这样就切换到了管理员登陆状态。
依旧是找到控制台选择System Functions下面的子菜单Roles and Access Rules
此时点开之后,我们需要删除Public Access Role,点击Delete
紧接着还是点击Super Administrator Role这一栏的Members
点开之后,找到PublicAccessAuthenticationToken这一栏点击Delete删除,注意:如果你没有切换到管理员登录,此时删除无法进行。
至此,安装环节就结束了。如果你有更好的见解,欢迎留言交流。
评论区