EJBCA Docker 部署与持久化指南
本文将详细介绍如何在 Docker 中部署 EJBCA (Enterprise Java Beans Certificate Authority),并确保其数据持久化存储在独立数据盘上,避免因容器或虚拟机重启导致数据丢失。内容包括使用内部数据库(默认 H2)的持久化配置、通过 docker run 和 docker-compose 两种方式运行容器、开放远程访问所需的配置,以及使用 EJBCA Web 界面进行登录、创建 CA、管理用户和证书的操作指南。本文以 Markdown 格式编写,适用于生产环境部署参考。
目录
- 数据持久化配置
- Docker 部署方式
- 使用
docker run部署 (生产环境) - 使用 Docker Compose 部署
- 使用
- EJBCA Web 界面使用指南
- 登录 EJBCA Web 管理界面
数据持久化配置
默认情况下,EJBCA Docker 镜像使用内置的 H2 数据库运行,且在未配置持久化时,数据仅存于内存。这意味着如果停止或删除容器,所有配置和颁发的证书数据都会丢失。因此,在生产环境中,我们需要将 EJBCA 数据持久化到宿主机的数据盘。以下是关键的持久化配置要点:
- 使用文件方式保存 H2 数据库:将 H2 数据库由内存模式切换为文件模式,并存储到容器内的固定路径。例如,将数据库 URL 配置为
jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1,表示在容器的/mnt/persistent目录下创建名为ejbcadb的数据库文件。这可确保EJBCA运行时的数据写入到文件。 - 挂载宿主机目录实现持久化:在启动容器时,将宿主机的某个目录挂载(bind mount)到容器的
/mnt/persistent(或其他配置的数据目录)。这样,EJBCA 在容器内写入的数据文件会实际保存到宿主机的数据盘目录。即使容器重启或重建,该目录中的数据仍然保留。 - 避免使用
--rm参数:Docker 的--rm参数会在容器停止后自动删除容器及其存储层。在生产环境切忌使用此参数,以免容器停止时丢失未持久化的数据。 - 权限设置:确保宿主机上用于挂载的数据目录有正确的权限,允许容器内的应用读写。如果EJBCA容器以非root用户运行,需保证挂载目录的属主和权限适配容器内用户。必要时可以在
docker run时添加--user参数指定用户,或者预先调整宿主目录权限。
提示:虽然本指南使用内置的 H2 数据库做示范,但在生产环境中,建议考虑使用独立的外部数据库(例如 MySQL/MariaDB、PostgreSQL 等)提高可靠性和性能。EJBCA 支持通过环境变量配置外部数据库连接。如果后续需要扩展,可参考相关文档将数据库切换为外部数据库服务。
Docker 部署方式
下面分别介绍通过直接运行 Docker 命令和使用 Docker Compose 两种方式部署 EJBCA,并确保数据持久化。
使用 docker run 部署 (生产环境)
使用 docker run 可以快速启动 EJBCA 容器。为保证适用于生产环境,我们需要加入持久化存储挂载和必要的配置。以下是一个示例步骤:
-
在宿主机创建数据目录:首先在宿主机的数据盘上创建用于保存EJBCA数据的目录,例如:
mkdir -p /opt/ejbca-data chown -R 10001:10001 /opt/ejbca-data(假设
/opt/ejbca-data位于独立的数据盘挂载点下,可根据实际情况选择路径) -
运行 EJBCA 容器:使用 Docker 命令启动容器,并挂载上述数据目录到容器内部。示例命令:
docker run -d \ --name ejbca \ --hostname myejbca.baixin.com \ -p 80:8080 -p 443:8443 \ -v /opt/ejbca-data:/mnt/persistent \ -e DATABASE_JDBC_URL="jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1" \ -e TLS_SETUP_ENABLED="true" \ --restart unless-stopped \ 192.168.13.116:8082/ejbca-ce:latest上面命令说明:
- 使用
-d后台运行容器。 --name ejbca指定容器名称,便于管理。--hostname myejbca.example.com设置容器主机名(可使用实际的域名或IP地址),EJBCA将基于此生成默认HTTPS证书的主机名。如果没有正式域名,可使用主机IP或自定义名称。注意:hostname的设置应与远程访问时使用的域名一致,以避免浏览器访问HTTPS时出现证书主机名不匹配的警告。-p 80:8080 -p 443:8443映射容器端口到宿主机端口。将EJBCA的8080端口映射为80 (HTTP),8443端口映射为443 (HTTPS),方便通过标准端口访问。8080端口提供EJBCA的RA接口(用于证书申请),8443端口提供EJBCA的管理员界面(需要客户端证书,后续详述)。-v /opt/ejbca-data:/mnt/persistent将宿主机的数据目录挂载到容器内的/mnt/persistent。EJBCA的H2数据库文件将保存在此处,实现持久化。-e DATABASE_JDBC_URL="jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1"设置环境变量,配置EJBCA使用文件模式的H2数据库,并将文件存储于上述挂载目录中(文件名为ejbcadb)。DB_CLOSE_DELAY=-1确保H2在连接关闭时不卸载数据库,以避免频繁启动数据库影响性能。-e TLS_SETUP_ENABLED="true"启用默认的TLS安全设置。EJBCA容器在首次启动时会生成一个内部管理CA(ManagementCA)和初始超级管理员账户,并要求通过客户端证书访问管理界面。设为"true"表示使用安全模式(需要客户端证书登录)。切勿在生产环境使用不安全模式(如"simple"),那种模式将管理界面开放为无需证书的状态,仅适合本地测试。--restart unless-stopped设置Docker的重启策略,确保容器随Docker守护进程或宿主机重启自动启动(除非被手动停止)。keyfactor/ejbca-ce:latest指定使用 Keyfactor 提供的 EJBCA Community Edition 镜像最新版本。
- 使用
-
等待启动完成:首次启动EJBCA容器时,需要初始化数据库、生成密钥和证书,过程可能耗时数十秒。可通过查看日志确认启动状态:
docker logs -f ejbca当日志中出现类似 “EJBCA startup complete” 或提示管理界面URL的信息时,表示服务已成功启动。
上述 docker run 部署在生产环境下会一直保持后台运行,并在宿主机重启后自动启动。数据都保存在 /opt/ejbca-data 目录下,确保了容器重建或重启后数据不会丢失。
使用 Docker Compose 部署
使用 Docker Compose 可以将配置写入 docker-compose.yml 文件,方便管理和复用部署配置。下面提供一个 Docker Compose 配置示例:
首先,在宿主机上创建项目目录并进入该目录:
mkdir -p /opt/ejbca-compose
cd /opt/ejbca-compose
然后,新建一个 docker-compose.yml 文件,内容如下:
version: '3.3'
services:
ejbca:
image: 192.168.13.116:8082/ejbca-ce:latest
container_name: ejbca
hostname: myejbca.baixin.local
environment:
- DATABASE_JDBC_URL=jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1
- TLS_SETUP_ENABLED=true
# SMTP 配置,使用 PBS 转发邮件
- SMTP_DESTINATION=192.168.13.18
- SMTP_DESTINATION_PORT=25
- SMTP_FROM=ejbca@example.local
- SMTP_TLS_ENABLED=false
- SMTP_SSL_ENABLED=false
ports:
- "80:8080"
- "443:8443"
volumes:
- /opt/ejbca-data:/mnt/persistent
restart: unless-stopped
在该 Compose 配置中:
services.ejbca定义了一个名为 ejbca 的服务,与上述docker run命令的配置相对应。hostname,environment,ports,volumes,restart等键的含义与前文 docker run 参数一致。- 您可以根据需要扩展 Compose 文件。例如,未来如需引入独立数据库服务,可在同一文件中添加 database 服务,并修改 EJBCa 的数据库连接环境变量。
完成 Compose 文件后,可以通过以下命令启动服务:
docker-compose up -d
这将根据 compose 文件的定义拉取镜像并后台启动容器。使用 docker-compose logs -f 可以实时查看启动日志。
提示:使用 Compose 部署的好处是配置集中、版本可控。您可以将 Compose 文件保存到版本控制中,方便团队协作或灾难恢复。此外,可轻松通过 docker-compose stop/start 控制服务,或通过修改配置后 docker-compose up -d 进行滚动更新。
EJBCA Web 界面使用指南
部署并运行EJBCA容器后,我们需要通过Web界面完成一系列初始化和管理操作,包括获取管理员证书登录、创建证书颁发机构 (CA)、添加用户并签发证书等。本节将逐步介绍这些常见任务的操作方法。
重要提示(请务必遵守以下要求)
必须 先将 myejbca.baixin.local 添加到 hosts 文件,或搭建本地 DNS 服务器,否则浏览器可能无法解析域名。
超级管理员证书算法默认是 DILITHIUM2,但 Windows 大概不能识别,建议改为 RSA 2048,以确保兼容性。
不能开代理,否则 EJBCA 可能无法正确处理客户端证书认证。
确保 Windows/macOS/Linux 证书存储正确导入,避免 No client certificate was presented 错误。
登录 EJBCA Web 管理界面
全新的EJBCA实例在启动后,会自动创建一个超级管理员账户(默认用户名为 superadmin)用于管理整个系统。注意:EJBCA的管理员登录不像普通网站通过用户名/密码,而是通过客户端证书来验证身份。因此,首次登录前需要为超级管理员生成一个数字证书,并将其导入浏览器。
以下是在Docker环境下获取并安装超级管理员证书、登录管理员界面的步骤:
-
获取超级管理员证书申请链接:在EJBCA容器启动后的日志中,EJBCA会输出一段包含 超级管理员证书注册 URL 和一次性密码的信息。例如日志可能提示:
SuperAdmin enrollment URL: http://myejbca.baixin.local/ejbca/enrollwithusername.xhtml?username=superadmin One-time password: abcd1234(上述为示例格式,实际URL和密码由系统随机生成)。如果您错过了容器日志,可再次执行:
docker logs ejbca | grep -A2 "SuperAdmin enrollment"从日志中提取相关信息。这个URL通常指向EJBCA的RA页面,用于以 用户名/密码 方式领取管理员证书。
-
访问证书领取页面:在一台安装有浏览器的电脑上(可以是您的本地工作站,需能访问EJBCA服务器),打开日志提供的URL。如果Docker端口映射如前文所述,URL一般是通过HTTP的80端口。例如:
http://myejbca.baixin.local/ejbca/enrollwithusername.xhtml?username=superadmin页面会提示输入 一次性密码。将上一步日志中的密码输入提交。
接下来会进入证书申请页面:- 页面可能显示“Superadmin - Request certificate”之类的标题。您需要选择证书的格式和加密参数。
- 通常可采用默认选项:密钥对由服务器生成 (Key pair generation: By the CA),算法使用RSA 2048位等。
- 设置证书加密密码:系统会要求您为待下载的PKCS#12证书文件设置一个保护密码(Protect Certificate with password)。请输入并记录该密码(用于导入证书)。
- 提交请求后,EJBCA将生成超级管理员的证书(.p12文件)。浏览器会提示下载文件(文件名类似
superadmin.p12)。
-
安装超级管理员证书:将下载得到的
superadmin.p12文件导入您的浏览器的证书管理器中。以Firefox浏览器为例,您可以:- 打开 “设置 → 隐私与安全 → 安全 → 查看证书 → 您的证书”,点击“导入”。
- 选中下载的
.p12文件,输入之前设置的保护密码导入。成功后,您将在“您的证书”列表中看到SuperAdmin或您用户名对应的证书条目。
对于Chrome/Edge浏览器,由于使用系统证书库,需要在操作系统中导入该证书(Windows下通过管理用户证书MMC,macOS通过钥匙串访问工具)。
-
登录管理员界面:证书导入后,使用浏览器访问 EJBCA 管理界面网址:
https://myejbca.baixin.local/ejbca/adminweb/浏览器应当在建立HTTPS连接时提示选择证书进行客户端身份验证(一般会弹出对话框列出刚才导入的证书)。选择 SuperAdmin 证书并确认。
如果证书验证通过,您将看到EJBCA的管理控制台页面,通常标题为“EJBCA CA UI”,显示欢迎管理员的界面。这表示您已以超级管理员身份成功登录。注意:如果浏览器未提示选择证书就直接访问失败,可能是证书未正确导入或者浏览器没有尝试发送证书。请确保:
- 访问的是正确的HTTPS地址及端口(8443映射到443的场合)。
- 超级管理员证书包含在浏览器的个人证书存储中。
- 浏览器没有将访问站点列入不发送证书的例外列表(有时取消过证书选择会记住决策,需要在浏览器证书设置中删除例外)。
初次登录成功后,建议备份超级管理员证书(包括生成它的ManagementCA证书)。超级管理员拥有系统最高权限,务必妥善保管其证书和私钥。一旦遗失,重新获取将非常麻烦。