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 上 进行的。

安装前的准备

  1. JDK1.8
  2. apache-ant-1.9.11-bin
  3. Wildfly-12.0.0.Final
  4. ejbca_ce_6_10_1_2
  5. mysql-connector-java-5.1.46.jar
  6. MySQL
  7. Centos 7 (也可是其他系统)

将其中的 Wildfly,ejbca_ce_6_10_1_2,mysql-connector-java-5.1.46.jar 放到同一个目录下,比如 /opt/ca

Mysql 建表

在 mysql 中新建一个表对应 EJBCA 的数据

1
2
CREATE DATABASE ejbcatest CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON ejbcatest.* TO 'ejbca'@'%' IDENTIFIED BY 'ejbca';

系统准备

  1. 安装 JDK
  2. 安装 ant
    1. 解压 ant unzip apache-ant-1.9.11-bin.zip
    2. 配置 path vim /etc/profile, 在文件末尾添加 export PATH="/opt/apache-ant-1.9.11/bin:$PATH"
    3. 编译生效 source /etc/profile
    4. 检查 ant 是否成功安装 ant -version
  3. 为 EJBCA 新建用户
    1
    2
    adduser ca
    passwd ca
  4. 将安装包的所有者改成 ca
    1
    2
    3
    4
    chown 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

安装

  1. 切换用户 su - ca
  2. 解压 Wildfly unzip /opt/ca/wildfly-12.0.0.Final.zip
  3. 修改 Wildfly 运行配置文件
    1. vim wildfly-12.0.0.Final/bin/standalone.conf
    2. 找到 53 行
    3. 将改行注释掉#JAVA_OPTS="-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true"
    4. 在该行下面加入一行 JAVA_OPTS="-Xms2048m -Xmx2048m -Djava.net.preferIPv4Stack=true"
    5. 保存,退出
  4. 启动 Wildfly./wildfly-12.0.0.Final/bin/standalone.sh
  5. 对 Wildfly 进行配置
    1. 启动客户端./wildfly-12.0.0.Final/bin/jboss-cli.sh -c。出现如下字符即进入成功 [standalone@localhost:9990 /]
    2. 配置数据源
      1
      2
      3
      4
      5
      6
      module 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"

    3. 配置 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"
      }

    4. 配置 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)
    5. 关闭 jboos-cli
  6. 对 ejbca 进行配置
    1. 解压文件,unzip ejbca_ce_6_10_1_2.zip
    2. 修改 ejbca.properties 文件
      1. cp ejbca_ce_6_10_1_2/conf/ejbca.properties.sample ejbca_ce_6_10_1_2/conf/ejbca.properties
      2. vim ejbca_ce_6_10_1_2/conf/ejbca.properties
      3. 设置 appserver.home 的值 (就是应用服务器的安装位置,对于我们来说是 /opt/ca/wildfly-10.0.0.Final), 最终结果 appserver.home=/opt/ca/wildfly-12.0.0.Final
    3. 修改 web.properties 文件
      1. cp ejbca_ce_6_10_1_2/conf/web.properties.sample ejbca_ce_6_10_1_2/conf/web.properties
      2. vim ejbca_ce_6_10_1_2/conf/web.properties
      3. 设置 CA 的超级管理员的证书密码,以及给应用服务器生成的服务器端证书的证书密码,和 CA 的 truststory 的密码等,这些密码的设置我们可以根据需要设置,或者保持默认的配置,需要注意的是 httpsserver.hostname, 这个要和后边的 alias 相对应,我的 ip 地址为 147.128.105.149, 那这里我们设置为 147.128.105.149.
      4. 最终修改,httpsserver.hostname=127.0.0.1
    4. 修改 database.properties
      1. cp ejbca_ce_6_10_1_2/conf/database.properties.sample ejbca_ce_6_10_1_2/conf/database.properties
      2. vim ejbca_ce_6_10_1_2/conf/database.properties
      3. 实际上只要使用 wildfly 的数据源即可 。把 datasource.jndi-name=EjbcaDS 的注释取消, 还要把 数据库类型 database.name=mysql 这个注释也要放开。否则安装出错,会执行 h2 数据库的库表安装脚本。
    5. 修改 install.properties
      1. cp ejbca_ce_6_10_1_2/conf/install.properties.sample ejbca_ce_6_10_1_2/conf/install.properties
      2. vim ejbca_ce_6_10_1_2/conf/install.properties
      3. 设置 CA 的名称,加密方式等,建议保持默认即可。
  7. ejbca 打包部署
    1
    2
    3
    4
    cd /opt/ejbca_ce_6_5.0.5/
    ant clean deployear
    ant runinstall
    ant deploy-keystore
  8. 去除 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
  9. 配置 TLS
    1. 配置外部可访问
      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
    2. 配置端口绑定
      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.passwordalias="127.0.0.1" 对应 web.properties 里面的 httpsserver.hostname

    3. 重启 wildfly:shutdown(restart=true), 等待重启完毕
    4. 配置 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
    5. 配置编码等其他重要配置
      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
    6. 重启 wildfly:shutdown(restart=true), 等待重启完毕
  10. 访问 http://127.0.0.1:8080/ejbca 进行验证
  11. 下载管理员证书,将 /opt/ca/ejbca_ce_6_10_1_2/p12 下的 superadmin.p12 拷贝到本地,对证书进行安装
  12. 访问 https://127.0.0.1:8443/ejbca 进行验证

    注:所有的 ip 需要换成对应的 ip 或者域名