PKI 体系(三)-EJBCA 安装
EJBCA 是一个全功能的 CA 系统软件,它基于 J2EE 技术,并提供了一个强大的、高性能并基于组件的 CA。EJBCA 兼具灵活性和平台独立性,能够独立使用,也能和任何 J2EE 应用程序集成。
特点
特性: LGPL 开源许可;
建立在 J2EE 1.3(EJB2.0)规范之上;
灵活的、基于组件的体系结构;
多级 CA
多个 CA 和多级 CA,在一个 EJBCA 实例中建立一个或者多个完整的基础设施单独运行,或者在任何 J2EE 应用中集成它;
简单的安装和配置
强大的基于 Web 的管理界面,并采用了高强度的鉴别算法
支持基于命令行的管理,并支持脚本等功能
支持个人证书申请或者证书的批量生产
服务器和客户端证书能够采用 PKCS12, JKS 或者 PEM 格 式导出
支持采用 Netscape, Mozilla, IE 等浏览器直接进行证书申请
支持采用开放 API 和工具通过其它应用程序申请证书
由 RA 添加的新用户可以通过 email 进行提醒
对于新用户验证可以采用随机或者手工的方式生成密码
支持硬件模块,来集成硬件签发系统(例如智能卡)
支持 SCEP
支持用特定用户权限和用户组的方式来进行多极化管理
对不同类型和内容的证书可以进行证书配置
对不同类型的用户可以进行实体配置
遵循 X509 和 PKIX (RFC3280) 标准
支持 CRL
完全支持 OCSP,包括 AIA 扩展
CRL 生成和基于 URL 的 CRL 分发点遵循 RFC3280,可以在任何 SQL 数据库中存储证书和 CRL(通过应用服务器来处 理)。
可选的多个发布器,以用来在 LDAP 中 发布证书和 CRL
支持用来为指定用户和证书来恢复私钥的密钥恢复模块
基于组件的体系结构,用来发布证书和 CRL 到不 同的目的地
基于组件的体系结构,用来在发布证书时采用多种实体授权方法
容易集成到大型应用程序中,并为集成到业务流程进行了优化
EJBCA 完 全采用 Java 编写,能够在任何采用 J2EE 服 务器的平台上运行。开发和测试是在 Linux 和 Windows 上 进行的。
安装前的准备
- JDK1.8
- apache-ant-1.9.11-bin
- Wildfly-12.0.0.Final
- ejbca_ce_6_10_1_2
- mysql-connector-java-5.1.46.jar
- MySQL
- Centos 7 (也可是其他系统)
将其中的 Wildfly,ejbca_ce_6_10_1_2,mysql-connector-java-5.1.46.jar 放到同一个目录下,比如
/opt/ca
Mysql 建表
在 mysql 中新建一个表对应 EJBCA 的数据1
2CREATE DATABASE ejbcatest CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON ejbcatest.* TO 'ejbca'@'%' IDENTIFIED BY 'ejbca';
系统准备
- 安装 JDK
- 安装 ant
- 解压 ant
unzip apache-ant-1.9.11-bin.zip
- 配置 path
vim /etc/profile
, 在文件末尾添加export PATH="/opt/apache-ant-1.9.11/bin:$PATH"
- 编译生效
source /etc/profile
- 检查
ant
是否成功安装ant -version
- 解压 ant
- 为 EJBCA 新建用户
1
2adduser ca
passwd ca - 将安装包的所有者改成
ca
1
2
3
4chown ca:ca /opt/ca
chown ca:ca /opt/ca/wildfly-12.0.0.Final.zip
chown ca:ca /opt/ca/ejbca_ce_6_10_1_2.zip
chown ca:ca /opt/ca/mysql-connector-java-5.1.46.jar
安装
- 切换用户
su - ca
- 解压 Wildfly
unzip /opt/ca/wildfly-12.0.0.Final.zip
- 修改 Wildfly 运行配置文件
vim wildfly-12.0.0.Final/bin/standalone.conf
- 找到 53 行
- 将改行注释掉
#JAVA_OPTS="-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true"
- 在该行下面加入一行
JAVA_OPTS="-Xms2048m -Xmx2048m -Djava.net.preferIPv4Stack=true"
- 保存,退出
- 启动 Wildfly
./wildfly-12.0.0.Final/bin/standalone.sh
- 对 Wildfly 进行配置
- 启动客户端
./wildfly-12.0.0.Final/bin/jboss-cli.sh -c
。出现如下字符即进入成功 [standalone@localhost:9990 /] - 配置数据源
1
2
3
4
5
6module add --name=com.mysql --resources=/opt/ca/mysql-connector-java-5.1.46.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=mysql:add(driver-name="mysql",driver-module-name="com.mysql",driver-xa-datasource-class-name=com.mysql.jdbc.Driver)
data-source add --name=ejbcads --driver-name="mysql" --connection-url="jdbc:mysql://127.0.0.1:3306/ejbcatest" --jndi-name="java:/EjbcaDS" --use-ccm=true --driver-class="com.mysql.jdbc.Driver" --user-name="username" --password="password" --validate-on-match=true --background-validation=false --prepared-statements-cache-size=50 --share-prepared-statements=true --min-pool-size=5 --max-pool-size=150 --pool-prefill=true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql="select 1;"上面的命令和后续的配置命令都需要一条一条执行。注意替换
--connection-url="jdbc:mysql://127.0.0.1:3306/ejbcatest"
,--user-name="username"
,--password="password"
- 配置 Wildfly 远程调用
1
2
3
4
5/subsystem=remoting/http-connector=http-remoting-connector:remove
/subsystem=remoting/http-connector=http-remoting-connector:add(connector-ref="remoting",security-realm="ApplicationRealm")
/socket-binding-group=standard-sockets/socket-binding=remoting:add(port="4447")
/subsystem=undertow/server=default-server/http-listener=remoting:add(socket-binding=remoting)
:reload输入完成,需等待 Wildfly reload 完成,可用命令
:read-attribute(name=server-state)
来进行检查。如果出现如下信息即代表 reload 成功。1
2
3
4{
"outcome" => "success",
"result" => "running"
} - 配置 Wildfly log
1
2
3
4/subsystem=logging/logger=org.ejbca:add
/subsystem=logging/logger=org.ejbca:write-attribute(name=level, value=DEBUG)
/subsystem=logging/logger=org.cesecore:add
/subsystem=logging/logger=org.cesecore:write-attribute(name=level, value=DEBUG) - 关闭 jboos-cli
- 启动客户端
- 对 ejbca 进行配置
- 解压文件,
unzip ejbca_ce_6_10_1_2.zip
- 修改
ejbca.properties
文件cp ejbca_ce_6_10_1_2/conf/ejbca.properties.sample ejbca_ce_6_10_1_2/conf/ejbca.properties
vim ejbca_ce_6_10_1_2/conf/ejbca.properties
- 设置
appserver.home
的值 (就是应用服务器的安装位置,对于我们来说是/opt/ca/wildfly-10.0.0.Final
), 最终结果appserver.home=/opt/ca/wildfly-12.0.0.Final
- 修改
web.properties
文件cp ejbca_ce_6_10_1_2/conf/web.properties.sample ejbca_ce_6_10_1_2/conf/web.properties
vim ejbca_ce_6_10_1_2/conf/web.properties
- 设置 CA 的超级管理员的证书密码,以及给应用服务器生成的服务器端证书的证书密码,和 CA 的 truststory 的密码等,这些密码的设置我们可以根据需要设置,或者保持默认的配置,需要注意的是 httpsserver.hostname, 这个要和后边的 alias 相对应,我的 ip 地址为 147.128.105.149, 那这里我们设置为 147.128.105.149.
- 最终修改,
httpsserver.hostname=127.0.0.1
- 修改
database.properties
cp ejbca_ce_6_10_1_2/conf/database.properties.sample ejbca_ce_6_10_1_2/conf/database.properties
vim ejbca_ce_6_10_1_2/conf/database.properties
- 实际上只要使用 wildfly 的数据源即可 。把
datasource.jndi-name=EjbcaDS
的注释取消, 还要把 数据库类型database.name=mysql
这个注释也要放开。否则安装出错,会执行 h2 数据库的库表安装脚本。
- 修改
install.properties
cp ejbca_ce_6_10_1_2/conf/install.properties.sample ejbca_ce_6_10_1_2/conf/install.properties
vim ejbca_ce_6_10_1_2/conf/install.properties
- 设置 CA 的名称,加密方式等,建议保持默认即可。
- 解压文件,
- ejbca 打包部署
1
2
3
4cd /opt/ejbca_ce_6_5.0.5/
ant clean deployear
ant runinstall
ant deploy-keystore - 去除 Wildfly 当前的 HTTPS 和 TLS 配置,需要使用
./wildfly-12.0.0.Final/bin/jboss-cli.sh -c
1
2
3
4/subsystem=undertow/server=default-server/http-listener=default:remove
/subsystem=undertow/server=default-server/https-listener=https:remove
/socket-binding-group=standard-sockets/socket-binding=http:remove
/socket-binding-group=standard-sockets/socket-binding=https:remove - 配置 TLS
- 配置外部可访问
1
2
3
4
5
6
7
8
9/interface=http:add(inet-address="0.0.0.0")
/interface=httpspub:add(inet-address="0.0.0.0")
/interface=httpspriv:add(inet-address="0.0.0.0")
/socket-binding-group=standard-sockets/socket-binding=http:add(port="8080",interface="http")
/socket-binding-group=standard-sockets/socket-binding=httpspriv:add(port="8443",interface="httpspriv")
/socket-binding-group=standard-sockets/socket-binding=httpspub:add(port="8442", interface="httpspub")
/subsystem=undertow/server=default-server/http-listener=http:add(socket-binding=http)
/subsystem=undertow/server=default-server/http-listener=http:write-attribute(name=redirect-socket, value="httpspriv")
:reload - 配置端口绑定
1
2
3
4/core-service=management/security-realm=SSLRealm:add()
/core-service=management/security-realm=SSLRealm/server-identity=ssl:add(keystore-path="${jboss.server.config.dir}/keystore/keystore.jks", keystore-password="serverpwd", alias="127.0.0.1")
/core-service=management/security-realm=SSLRealm/authentication=truststore:add(keystore-path="${jboss.server.config.dir}/keystore/truststore.jks", keystore-password="changeit")
:reload其中
keystore-password="serverpwd"
对应web.properties
里面的httpsserver.password
。alias="127.0.0.1"
对应web.properties
里面的httpsserver.hostname
- 重启 wildfly
:shutdown(restart=true)
, 等待重启完毕 - 配置 tls
1
2
3
4
5/subsystem=undertow/server=default-server/https-listener=httpspriv:add(socket-binding=httpspriv, security-realm="SSLRealm", verify-client=REQUIRED)
/subsystem=undertow/server=default-server/https-listener=httpspriv:write-attribute(name=max-parameters, value="2048")
/subsystem=undertow/server=default-server/https-listener=httpspub:add(socket-binding=httpspub, security-realm="SSLRealm")
/subsystem=undertow/server=default-server/https-listener=httpspub:write-attribute(name=max-parameters, value="2048")
:reload - 配置编码等其他重要配置
1
2
3
4
5
6
7/system-property=org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value=true)
/system-property=org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value=true)
/system-property=org.apache.catalina.connector.URI_ENCODING:add(value="UTF-8")
/system-property=org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value=true)
/subsystem=webservices:write-attribute(name=wsdl-host, value=jbossws.undefined.host)
/subsystem=webservices:write-attribute(name=modify-wsdl-address, value=true)
:reload - 重启 wildfly
:shutdown(restart=true)
, 等待重启完毕
- 配置外部可访问
- 访问 http://127.0.0.1:8080/ejbca 进行验证
- 下载管理员证书,将
/opt/ca/ejbca_ce_6_10_1_2/p12
下的superadmin.p12
拷贝到本地,对证书进行安装 - 访问 https://127.0.0.1:8443/ejbca 进行验证
注:所有的 ip 需要换成对应的 ip 或者域名