本文原载于 https://www.idc.moe/archives/qcloud-Lighthouse-EJBCA-build.html
一、名词解释和综述
1.1. PKI
PKI (Public Key Infrastructure) 公钥基础设施,又称为公钥基础架构、公钥基础建设或公钥基础机构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,能够为所有网络应用提供加密和数字签名等密码服务及所必须的密钥和证书管理体系,简单来说 PKI 就是利用公钥理论和技术建立的提供的安全服务设施,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
一个基础的 PKI 系统包括狭义上的证书颁发机构 (Certificate Authority, CA)、注册管理机构 (Registration Authority, RA) 和相应的 PKI 存储库。CA 用于签发并管理中间证书;RA 可以是 CA 的一部分,其功能包括身份或许可验证、CRL 管理、签发最终证书等;PKI 存储库包括 LDAP 目录服务器和普通数据库,用于对用户申请、证书、密钥、CRL 和日志等信息进行存储、管理并提供查询服务。
1.2. CA
广义上的 CA 指 PKI 中的 CA 和 RA。CA 是证书的签发机构,它是公钥基础设施的核心。CA 是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
本文涉及到的 CA 有时指狭义上的 CA,有时指 CA 和 RA 组成的整体,他们的区别不影响阅读理解和实践操作。
1.3. EJBCA
EJBCA 是一款历史悠久且至今仍在活跃维护和开发的基于 JavaEE 平台的 PKI 实现软件,能够在 Windows 和 Linux 各大发行版上独立运行或集成在 WildFly 和 JBoss EAP 等基于JavaEE的应用服务器上。EJBCA 提供了强大高效的 CA 及 RA 一体化功能,支持硬件安全模块 (Hardware Security Module, HSM)、集群和动态扩展,除了适合于供 CA/PKI 方案研究之外,它还完全能够胜任企业级应用场景乃至于承载公共 CA 的 PKI 体系。
本文旨在使用腾讯云轻量应用服务器通过将 EJBCA 集成至 JBoss EAP 以搭建一个自有 CA/PKI 系统并实践签发各类数字证书。
二、准备操作
2.1. 服务器准备
由于 JBoss EAP 是一个基于 JavaEE 的服务器程序,因此占用的内存会比较大,故建议选用 2GB 或更高内存的机器用作生产环境(图中红色方框内的套餐)。这里笔者选用的是腾讯云轻量应用服务器通用型套餐2C4G8M。
系统建议选用 Ubuntu 或 Debian,CentOS 7 的软件包过于陈旧可能会对部署和运行产生影响,笔者选用的是 Ubuntu 20.04 LTS。
2.2. 软件包准备
2.2.1. 包安装相关组件和依赖
依次执行以下命令:
apt update
apt install wget default-jdk-headless ant ant-optional unzip -y
apt install openjdk-8-jdk -y
2.2.2. 调整 Java 环境为 OpenJDK 8
依次执行以下命令:
update-alternatives --config java
update-alternatives --config javac
修改为 OpenJDK 8。
编辑 /etc/profile
,将以下内容附加到末尾并保存:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
执行 source /etc/profile
以应用配置,并执行 java -version
和 javac -version
以检查和确认 Java 环境已经调整为 OpenJDK 8。
2.2.3. 软件包下载
由于 JBoss EAP 7.3.0 + EJBCA 7.4.3 组合在笔者尝试五次后依旧部署失败,故本文将以 JBoss EAP 6.4.0 (April 15, 2015) + EJBCA 6.15.2.6 (April 6, 2020) (两者均为 6 系列的最后一个版本)作为演示。
JBoss EAP 6.4.0 下载地址: https://developers.redhat.com/content-gateway/file/jboss-eap-6.4.0.GA-installer.jar (需要登录 RedHat 账号后下载至本地再上传至服务器)
EJBCA 6.15.2.6 下载地址: https://sourceforge.net/projects/ejbca/files/ejbca6/ejbca_6_15_2_6/ejbca_ce_6_15_2_6.zip (需要下载至本地再上传至服务器)
2.3. 数据库准备
为了效率、灵活性和可迁移性,建议将 EJBCA 搭配数据库使用。EJBCA支持 MariaDB, MySQL, Oracle 数据库和 PostgreSQL 等类型的数据库,本文以 MariaDB 演示。
2.3.1. 包安装 Mariadb 数据库
本文仅演示包安装,若需编译安装,请自行查找相关教程。
执行 apt install mariadb-server -y
安装 Mariadb。
安装完成后,执行 mysql_secure_installation
初始化。具体操作在此不赘述,搜索“Ubuntu 安装 Mariadb”,各路大神会为你细说端详。
2.3.2. 修改数据库默认编码为 UTF-8 并创建数据库
Mariadb 和 MySQL 默认的字符集 utf8mb4
会触发索引限制,导致 EJBCA 无法启动,故需修改 Mariadb 和 MySQL 的默认字符集。
修改 /etc/mysql/my.cnf
,增加以下内容:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
修改 /etc/mysql/mariadb.conf.d/50-client.cnf
第 8 行,将 default-character-set = utf8mb4
改为 default-character-set = utf8
并保存。
修改 /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
第 8 行,将 default-character-set = utf8mb4
改为 default-character-set = utf8
并保存。
修改 /etc/mysql/mariadb.conf.d/50-server.cnf
第 104, 105 行,将
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
改为
character-set-server = utf8
collation-server = utf8_general_ci
并保存。
执行 systemctl restart mariadb
以应用更改。
输入 mysql -u root -p
登陆 Mariadb 服务器,执行 show variables like "%character%";
查询编码,若均为 UTF-8
(如图所示),则执行 CREATE DATABASE ejbca;
。
其中 ejbca
为数据库名,输入 exit
退出。
若您不想修改数据库的默认字符集,则请输入 mysql -u root -p
登陆 Mariadb 服务器,执行 CREATE DATABASE ejbca CHARACTER SET utf8 COLLATE utf8_unicode_ci;
。
其中 ejbca
为数据库名,输入 exit
退出。
此外,强烈推荐使用新发布的腾讯云轻量数据库服务器,内网连接延迟低于毫秒级、多级冗余备份,强劲的性能可以轻松应对突发的海量查询,非常适合 EJBCA 的使用场景,是替代在本机运行数据库服务器的不二之选!
2.3.3. 创建用户并赋权
输入 mysql -u root -p
登陆 Mariadb 服务器,依次执行以下语句:
CREATE USER 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';
GRANT ALL ON *.* TO 'ejbca'@'localhost';
其中 ejbca
分别为数据库用户名和密码。
输入 exit
退出。
三、安装并配置 JBoss EAP
3.1. 安装 JBoss EAP
将 JBoss EAP jar 安装包上传至服务器,执行 java -jar jboss-eap-6.4.0-installer.jar
,来到 JBoss EAP 交互安装界面,Select language 时选择 1: chn(中文)
接下来是 END USER LICENSE AGREEMENT 部分,按 1 继续;选择安装路径,若不想自定义请直接回车,后按 1 确定; “想安装的软件包”建议全选(直接按 0 即可确认);Quickstarts 选择否(按 0);“套接字绑定”选择“”为独立和域模式选择默认的端口绑定”(按 0);“启用纯粹的 IPv6 配置”按 0 取消选择;“服务器启动模式”选择“请不要启动服务器”(按 0);“日志选项”选择否(按 0);“配置运行时环境”选择“执行默认配置”(按 0)。
交互之后将进行解包安装,数十秒后安装就算完成了。
root@lighthouse:~/ejbca# java -jar jboss-eap-6.4.0-installer.jar
Select language :
0: eng
1: chn
2: deu
3: fra
4: jpn
5: por
6: spa
Please choose [0] :
1
END USER LICENSE AGREEMENT
按 1 继续、2 退出、3 重新显示
1
选择安装路径: [/root/EAP-6.4.0]
按 1 继续、2 退出、3 重新显示
1
选择你想安装的软件包:
1 [x] [必需的] [红帽 JBoss EAP] (542.89 KB)
2 [x] [AppClient] (34.24 KB)
3 [x] [必需的] [Bin] (10.99 MB)
4 [x] [必需的] [束] (1.01 MB)
5 [x] [docs] (4.75 MB)
6 [x] [必需的] [域] (125.56 KB)
7 [x] [必需的] [域的 Shell 脚本] (17.35 KB)
8 [x] [必需的] [模块] (147.01 MB)
9 [x] [必需的] [独立模式] (152.77 KB)
10 [x] [必需的] [Standalone 模式的 Shell 脚本] (14.16 KB)
11 [x] [必需的] [欢迎页的内容] (2.11 MB)
Total Size Required: 166.73 MB
按 0 来确认你的选择
选择你想安装的软件包
0
软件包选择完成
按 1 继续、2 退出、3 重新显示
1
创建一个管理性用户。
这个用户将被添加到主机容器里用于管理目的的管理区。它可以用来访问管理控制台、管理 CLI 或区里保护的其他应用程序。
密码必须包含至少 8 个字符、一个字母、一个数字和一个非字母数字的字符。
管理性用户名: [admin]
输入 admin 密码: []
确认 admin 密码: [********]
按 1 继续、2 退出、3 重新显示
1
Quickstarts
红帽 JBoss EAP 附带的一系列 Quickstart 例程的目的是帮助用户用 Java EE 6 技术来编写应用程序。你要安装 Quickstart 吗?
0 [x] 否
1 [ ] 是
输入选择:
0
按 1 继续、2 退出、3 重新显示
1
套接字绑定
为红帽 JBoss EAP 配置套接字绑定。
选择端口配置:
0 [x] 为独立和域模式选择默认的端口绑定。
1 [ ] 为所有默认端口绑定配置偏移量。
2 [ ] 配置自定义端口绑定。
输入选择:
0
如果这个机器在使用纯粹的 IPv6 配置,请选中下面的复选框。
[ ] 启用纯粹的 IPv6 配置
输入 1 进行选择,0 取消选择:
0
按 1 继续、2 退出、3 重新显示
1
启动服务器
选择服务器启动模式:
0 [x] 请不要启动服务器
1 [ ] 独立模式
2 [ ] 域模式
输入选择:
0
按 1 继续、2 退出、3 重新显示
1
日志选项
为红帽 JBoss EAP 配置日志级别?
0 [x] 否
1 [ ] 是
输入选择:
0
按 1 继续、2 退出、3 重新显示
1
配置运行时环境
在安装了红帽 JBoss EAP 服务器以后,你还可以配置几个其他的选项。每个选项都可以单独地选择,并按照下面的顺序进行配置。你要继续吗?
0 [x] 执行默认配置
1 [ ] 执行高级配置
输入选择:
0
按 1 继续、2 退出、3 重新显示
1
[ Starting to unpack ]
[ Processing package: 红帽 JBoss EAP (1/11) ]
[ Processing package: AppClient (2/11) ]
[ Processing package: Bin (3/11) ]
[ Processing package: 束 (4/11) ]
[ Processing package: docs (5/11) ]
[ Processing package: 域 (6/11) ]
[ Processing package: 域的 Shell 脚本 (7/11) ]
[ Processing package: 模块 (8/11) ]
[ Processing package: 独立模式 (9/11) ]
[ Processing package: Standalone 模式的 Shell 脚本 (10/11) ]
[ Processing package: 欢迎页的内容 (11/11) ]
[ Unpacking finished ]
[ 开始处理 ]
开始处理 Logging installation information (1/4)
写入 IzPack 变量状态 /root/EAP-6.4.0/installation/InstallationLog.txt
开始处理 Adding temporary admin user (2/4)
退出代码: 0
命令成功地完成。
开始处理 Adding admin user (3/4)
退出代码: 0
命令成功地完成。
开始处理 Unpacking natives (4/4)
解包完成。
已经全部安装成功。
安装的应用程序 /root/EAP-6.4.0
你要生成一个自动安装脚本和属性文件吗? (y/n) [n]:
[ Console installation done ]
3.2. 修改 JBoss EAP Web UI 监听地址
修改 /root/EAP-6.4.0/standalone/configuration/standalone.xml
( /root/EAP-6.4.0
为 JBoss EAP 安装目录),将 <interfaces>
中的 jboss.bind.address.management:127.0.0.1
, jboss.bind.address:127.0.0.1
和 jboss.bind.address.unsecure:127.0.0.1
共 3 处的 127.0.0.1
修改为 0.0.0.0
并保存。
3.3. 启动并测试 JBoss EAP 服务
新建一个 SSH 连接,执行 /root/EAP-6.4.0/bin/standalone.sh
( /root/EAP-6.4.0
为 JBoss EAP 安装目录)后访问 http://机器的 IP 地址:8080
,如若能够打开相应界面,说明 JBoss EAP 安装成功。
由于此时 JBoss EAP 处于 Standalone 模式,不要退出程序或关闭此 SSH 会话,请切到上一个空闲的 SSH 会话继续下面的步骤。
3.4. 注册 Mariadb 数据库驱动
3.4.1. 下载并创建数据库驱动指示文件
依次执行以下命令:
mkdir -p /root/EAP-6.4.0/modules/org/mariadb/main
cd /root/EAP-6.4.0/modules/org/mariadb/main
wget https://downloads.mariadb.com/Connectors/java/connector-java-2.6.2/mariadb-java-client-2.6.2.jar
( /root/EAP-6.4.0
为 JBoss EAP 安装目录)
将以下内容一次性复制并粘贴:(去除 <
后的第一个空格)
cat > module.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.mariadb">
<resources>
<resource-root path="mariadb-java-client-2.6.2.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="org.slf4j"/>
</dependencies>
</module\>
EOF
3.4.2. 在 JBoss CLI 内注册数据库驱动
执行 /root/EAP-6.4.0/bin/jboss-cli.sh
( /root/EAP-6.4.0
为 JBoss EAP 安装目录),输入 connect
并回车,依次执行以下命令:
/subsystem=datasources/jdbc-driver=org.mariadb.jdbc.Driver:add(driver-name=org.mariadb.jdbc.Driver,driver-module-name=org.mariadb,driver-xa-datasource-class-name=org.mariadb.jdbc.MySQLDataSource)
:reload
输入 exit
退出。
四、部署 EJBCA
4.1. 解压缩安装文件
将 EJBCA zip 压缩包上传至服务器,依次执行以下命令:
unzip ejbca_ce_6_15_2_6.zip
cd ejbca_ce_6_15_2_6/conf
4.2. 配置安装文件
将以下内容一次性复制并粘贴:
cat > database.properties << EOF
database.name=mysql
database.url=jdbc:mysql://127.0.0.1:3306/ejbca?characterEncoding=UTF-8
database.driver=org.mariadb.jdbc.Driver
database.username=ejbca
database.password=ejbca
EOF
其中 ejbca
分别为在 2.3.3 中定义的数据库用户名和密码。
将以下内容一次性复制并粘贴:
cat > ejbca.properties << EOF
appserver.home=/root/EAP-6.4.0
appserver.type=jboss
approval.defaultrequestvalidity=28800
approval.defaultapprovalvalidity=28800
ejbca.passwordlogrounds=8
EOF
其中, /root/EAP-6.4.0
为 JBoss EAP 安装目录。
将以下内容一次性复制并粘贴:
cat > install.properties << EOF
ca.name=YoungdoTestingRootCAR7
ca.dn=CN=Youngdo Testing Root CA - R7,O=Youngdo Trust Service,C=CN
ca.tokentype=soft
ca.tokenpassword=null
ca.keyspec=4096
ca.keytype=RSA
ca.signaturealgorithm=SHA256WithRSA
ca.validity=3650
ca.policy=null
ca.certificateprofile=ROOTCA
EOF
其中, ca.name
和 ca.dn
项的值可以自定义,必须符合格式。
将以下内容一次性复制并粘贴:
cat > web.properties << EOF
java.trustpassword=changeit
superadmin.cn=SuperAdmin
superadmin.dn=CN=${superadmin.cn}
superadmin.password=ejbca
superadmin.batch=true
httpsserver.password=serverpwd
httpsserver.hostname=ca.ejbca.com
httpsserver.dn=CN=${httpsserver.hostname},O=Youngdo Trust Service,C=CN
httpserver.pubhttp=8080
httpserver.pubhttps=8442
httpserver.privhttps=8443
EOF
其中,httpsserver.hostname
项的值可以修改为任意 FQDN, superadmin.cn
项的值不得修改。若提示 : bad substitution
,请将两个 EOF
之间的内容粘贴至 web.properties
文件中。
执行 cd ..
返回上一级目录。
4.3. 执行部署
执行 ant deploy
进行部署,注意观察另一个 SSH 会话(JBoss EAP Standalone)中有无成片报错。
执行 ant install
进行安装,若无报错则表示部署及安装完成。
4.4. 测试和登录
下载 EJBCA 解压目录里 p12
文件夹里的 superadmin.p12
文件。
安装为当前用户的证书,存储位置由向导决定。
回到另一个 SSH 会话(JBoss EAP Standalone),按 Ctrl + C 结束进程并执行 /root/EAP-6.4.0/bin/standalone.sh
( /root/EAP-6.4.0
为 JBoss EAP 安装目录),浏览器访问 https://机器的 IP 地址:8443/ejbca/adminweb/
。浏览器首先会弹出不受信任的证书,此时请继续,随后选择上文下载并导入的证书即可登录 EJBCA 管理界面。
五、结语
CA, PKI 和 EJBCA 还有很多值得讲的东西,限于篇幅无法再展开讲。与 EJBCA 有关的具体使用和最佳实践我将在另一篇尚未面世的文章中细说。
六、鸣谢
https://www.huaweicloud.com/articles/5c7cf1ebc3d55167583019aa72e27dc3.html
https://zh.wikipedia.org/wiki/%E8%AF%81%E4%B9%A6%E9%A2%81%E5%8F%91%E6%9C%BA%E6%9E%84
https://blog.csdn.net/carolzhang8406/article/details/79458206
https://www.jianshu.com/p/56051594fee9
https://www.it610.com/article/1288773045065949184.htm
https://app.yinxiang.com/fx/da629ce0-891b-4503-9693-6d196d7f3db7