前言
EJBCA是可以实现签发自签证书并且提供证书验证(CRL,OCSP)的开源项目,主要实现了CAB论坛的BR基准和ADOBE的基准以及一些RFC协议。
一般来说只有CA机构才会使用到,这里记录下EJBCA的安装。官方提供了docker的形式安装(以后测试安装)。
参考文献
EJBCA官网:https://www.ejbca.org/
EJBCA官方文档:https://doc.primekey.com/ejbca6152/ejbca-installations/ejbca-main-installation/application-servers/wildfly-10-jboss-eap-7-0
CAB论坛:https://cabforum.org/
EJBCA帮助论坛:https://sourceforge.net/p/ejbca/discussion/123123/
环境和版本信息
EJBCA:社区版6.15.2.1
中间件:wildfly-10.0.0.Final
系统:Centos7.2 内存:4G(虚拟机)
Ant:1.10.7
JDK:1.8
前置属性
默认java,ant的环境变量都已配置。下载ejbca_ca_6_15_2_1.zip,写文章的时候已经到6.15.2.5了。解压并放到服务器的/opt下面
到${ejbca_home}/conf/目录下,配置如下属性文件,初始化状态都是带sample后缀的,复制出来修改成properties即可。
配置属性文件在ejbca/conf/目录下,不指出来的可以留着默认 ejbca.properties(ejbca运行的服务器): appserver.home #中间件目录(wildfly的根目录) appserver.type #中间件类型(jboss) install.properties(构建时使用此CA来签发服务器SSL证书和登陆证书): ca.name #管理CA的名称 ca.dn #管理CA证书的一些DN项 database.properties(配置证书存储的数据库): datasource.jndi-name #数据源名称 database.name #数据库名称 database.url #数据库连接地址 database.driver #数据库驱动类名 database.username #数据库账号 database.password #数据库密码 web.properties(登陆证书以及服务器证书的配置): java.trustpassword #wildfly信任列表的jks密码 superadmin.cn #登陆证书的commonName superadmin.dn #登陆证书的DN项 superadmin.password #登陆证书的密码 httpsserver.password #服务器证书密码 httpsserver.hostname #服务器主机名(域名) httpsserver.dn #服务器主机DN
具体步骤
1.编辑wildfly的/bin/standalone.conf 文件添加初始化和最大堆参数:JAVA_OPTS="-Xms2048m -Xmx2048m -Djava.net.preferIPv4Stack=true"
然后添加数据源,如果觉得文档上的难理解,可以直接启动wildfly,然后访问后台页面直接添加即可。熟悉wildfly的也可以直接在standalone.xml里面添加数据源。
对应的数据库驱动需要放到wildfly的standalone/deployments目录下,后台管理才可以扫描到。数据源的账号密码对应database.properties里面的即可。
Wildfly启动的后台默认限制只能本地访问的,如果wildfly在虚拟机上面,需要修改standalone/configuration/standalone.xml对应的端口开放。
wildfly后台添加数据源的图:
2.设置访问限制
连接jboss本地服务设置远程访问,连接jboss:
执行如下:

/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

#配置日志 /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)
3.构建运行

#清理和构建并拷贝在指定的中间件 ant clean deployear #此命令执行的是先删除对应生成的一些文件和文件夹,然后构建整个项目(具体可查看build.xml) #创建证书(如果已经存在旧的证书,则不需要再次创建) ant runinstall #创建keystore,产生p12登陆证书和服务器的SSL证书,此项设置需要属性ejbca目录下的conf目录下的web.properties的属性 #拷贝产生的证书文件到指定的${wildfly_home}/standalone/configuration/keystore/目录下面。 ant deploy-keystore
再回到jboss的本地服务,添加interface和其他

#添加3个interface,并设置随处访问 /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") /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 #设置服务器的SSL连接,指定服务器证书和信任列表证书,对应web.properties上面的属性 /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="localhost") /core-service=management/security-realm=SSLRealm/authentication=truststore:add(keystore-path="${jboss.server.config.dir}/keystore/truststore.jks", keystore-password="changeit") /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/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 #设置webservice的属性 /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
到此,一个简单的EJBCA实例已经可以使用。如需要使用密码机之类的还需要对应的属性配置以及厂商的库。
把上面生成p12证书拿到本地安装,然后访问你的${httpsserver.hostname}:8443/ejbca/adminweb/,选择你的证书即可。上面的脚本绑定https访问是8443端口且需要客户端证书。
完成后的效果图:
如果需要免费的SSL证书可以在这里获取[免费SSL证书]