keyfactor/ejbca-ceEJBCA Community Edition(EJBCA CE)是一款开源的公钥基础设施(PKI)和证书颁发机构(CA)软件,是运行时间最长的CA软件项目之一。EJBCA平台独立,可满足从证书注册、证书管理到证书验证的全流程需求。
EJBCA基于Java开发,可在OpenJDK等JVM上运行,支持Linux、Windows等多数平台。EJBCA分为两个版本:
最低系统要求:
EJBCA实例可部署用于以下一种或多种场景,支持从小型到超大型部署:
EJBCA适用于需要建立和管理PKI的各类场景,包括但不限于:
通过Docker命令直接拉取最新EJBCA Community镜像:
bashsudo docker pull keyfactor/ejbca-ce
启动临时测试实例,允许无认证网络访问管理系统:
bashdocker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname -e TLS_SETUP_ENABLED="simple" keyfactor/ejbca-ce
说明:
--rm:容器停止后自动删除-p 80:8080:映射HTTP端口(8080容器内→80主机)-p 443:8443:映射TLS端口(8443容器内→443主机)-h mycahostname:设置容器主机名TLS_SETUP_ENABLED="simple":生成管理CA和服务器TLS证书,但允许任何人通过HTTPS管理系统(仅用于测试,生产环境禁用)容器完全启动后,访问 [***] 进入管理界面。
启动需要客户端证书认证的实例:
bashdocker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname -e TLS_SETUP_ENABLED="true" keyfactor/ejbca-ce
说明:
TLS_SETUP_ENABLED="true":首次启动时生成管理CA,为服务器和初始管理员生成客户端TLS证书[***],通过客户端证书认证容器行为可通过环境变量自定义,以下为关键配置:
生产环境必须自定义以下安全相关密码:
| 环境变量 | 描述 |
|---|---|
PASSWORD_ENCRYPTION_KEY | 用于加密EJBCA中的密码(如终端实体明文密码、加密令牌密码等),首次安装前设置,不可更改 |
CA_KEYSTOREPASS | 保护数据库中软件加密令牌(非HSM)的默认密码,建议为加密令牌手动设置密码 |
EJBCA_CLI_DEFAULTPASSWORD | 本地命令行界面(CLI)的默认用户('ejbca')密码 |
设置示例:
bashdocker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname \ -e PASSWORD_ENCRYPTION_KEY="myrandomkey" \ -e CA_KEYSTOREPASS="anotherrandomkey" \ -e EJBCA_CLI_DEFAULTPASSWORD="randompassphrase" \ keyfactor/ejbca-ce
通过 docker inspect keyfactor/ejbca-ce:latest 可查看所有环境变量及默认值,常用变量包括:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
LOG_LEVEL_APP | 应用日志级别 | INFO |
TLS_SETUP_ENABLED | TLS配置模式:true(生成CA和证书)、simple(无认证访问)、later(代理TLS)、false(禁用TLS) | true(首次启动) |
DATABASE_JDBC_URL | 数据库JDBC连接URL | jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1 |
DATABASE_USER | 数据库用户名(外部数据库时必填) | - |
DATABASE_PASSWORD | 数据库密码(外部数据库时必填) | - |
EJBCA支持外部数据库实现集群部署,默认使用内置H2数据库(仅适合测试),生产环境建议使用MariaDB/MySQL或PostgreSQL。
| 数据库类型 | JDBC URL示例 |
|---|---|
| H2(持久化) | jdbc:h2:/mnt/persistent/ejbcadb;DB_CLOSE_DELAY=-1 |
| H2(内存,非持久化) | jdbc:h2:mem:ejbcadb;DB_CLOSE_DELAY=-1 |
| MariaDB/MySQL | jdbc:mariadb://database:3306/ejbca?characterEncoding=UTF-8 |
| PostgreSQL | jdbc:postgresql://database/ejbca |
bashdocker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname \ -e TLS_SETUP_ENABLED="true" \ -e DATABASE_JDBC_URL="jdbc:mariadb://172.26.0.1:3306/ejbcatest?characterEncoding=UTF-8" \ -e DATABASE_USER="ejbca" \ -e DATABASE_PASSWORD="password" \ keyfactor/ejbca-ce
注意:首次启动时会自动创建数据库表结构,后续启动将复用现有数据。
适用于在反向代理(如Nginx、Apache Httpd)后部署,需禁用容器内部TLS配置,通过代理处理TLS。
| 环境变量 | 描述 |
|---|---|
PROXY_AJP_BIND | AJP代理端口(8009)绑定的IP地址 |
PROXY_HTTP_BIND | HTTP后端端口(8081和8082)绑定的IP地址,8082接受SSL_CLIENT_CERT头 |
TLS_SETUP_ENABLED | 需设置为later(代理TLS)或false(禁用TLS),不可与true同时使用 |
说明:配置代理后会禁用管理CA创建,需手动配置EJBCA。
EJBCA通过JavaMail服务发送邮件通知,可通过环境变量配置SMTP参数:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
SMTP_DESTINATION | SMTP服务器地址 | localhost |
SMTP_DESTINATION_PORT | SMTP端口 | 25 |
SMTP_TLS_ENABLED | 启用TLS | true |
SMTP_SSL_ENABLED | 启用SSL | true |
SMTP_USERNAME | SMTP认证用户名 | - |
SMTP_PASSWORD | SMTP认证密码 | - |
SMTP_FROM | 发件人*** | - |
Gmail SMTP示例:
bashdocker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname \ -e TLS_SETUP_ENABLED="simple" \ -e SMTP_DESTINATION="smtp.gmail.com" \ -e SMTP_DESTINATION_PORT="587" \ -e SMTP_USERNAME="***" \ -e SMTP_PASSWORD="userssecretpassword" \ -e SMTP_FROM="***" \ -e SMTP_SSL_ENABLED="false" \ keyfactor/ejbca-ce
以下目录用于持久化数据、配置和密钥,生产环境建议通过Docker卷挂载:
| 目录路径 | 用途 |
|---|---|
/mnt/persistent | H2数据库持久化目录(默认),需通过卷挂载以保留数据 |
/mnt/external/secrets/tls/cas | DER编码的CA证书目录,文件名作为CA名称(如ManagementCA.crt) |
/mnt/external/secrets/tls/ks | 服务器密钥库目录,需包含server.jks、server.storepasswd等文件 |
/mnt/external/secrets/tls/ts | 信任库目录,需包含truststore.jks、truststore.storepasswd文件 |
/opt/keyfactor/ejbca/conf | 应用配置文件目录,可覆盖配置属性 |
/opt/keyfactor/bin | 启动脚本和CLI命令(如ejbca.sh、ejbcaClientToolBox.sh) |
bash# 创建卷 docker volume create ejbca-persistent-data # 启动容器,挂载卷 docker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname \ -v ejbca-persistent-data:/mnt/persistent \ keyfactor/ejbca-ce
bash# 映射主机9443端口到容器8443端口 docker run -it --rm -p 80:8080 -p 9443:8443 -h mycahostname keyfactor/ejbca-ce
修复静态链接端口:
创建web.properties文件,设置httpserver.external.privhttps=9443,挂载到容器:
bashdocker run -it --rm -p 80:8080 -p 9443:8443 -h mycahostname \ -v $PWD/config/web.properties:/opt/primekey/ejbca/conf/web.properties \ keyfactor/ejbca-ce
bash# 创建插件目录并放入JAR文件 mkdir -p ejbca-plugins && cp my-plugin.jar ejbca-plugins/ # 启动容器,挂载插件目录 docker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname \ -v $PWD/ejbca-plugins:/opt/primekey/ejbca/plugins \ keyfactor/ejbca-ce
EJBCA Enterprise版本提供商业支持,详情见EJBCA Enterprise。
EJBCA Community版基于LGPL许可证开源。

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务