Leif160519的blog Leif160519的blog

——————

目录
centos7安装全功能CA管理系统EJBCA
/    

centos7安装全功能CA管理系统EJBCA

写在前面

本文摘自 NGX 并对其中的部分内容作了补充和说明,避免大家采坑,文中的补充部分,是原文中没有的,为我个人总结,希望能给大家参考。

一、前言

我一直都自行签发数字证书并部署在测试和生产环境中,因为商业的 CA 非常昂贵,同时我也没有相应的资质申请。管理自签发的数字证书也是一个发问题,在这里,我使用 EJBCA。

在过去很长的一段时间里我都是随心所欲地签发私有证书,因为服务于服务之间都需要用到数字证书,这导致我需要维护的证书越来越多,而且存在很大的风险。

为了方便管理,我找到一款开源免费的 CA 管理系统:EJBCA。它可以管理 CA 与各级证书,签发和吊销证书,同时还支持 CRL 与 OCSP。

二、准备

我将在 CentOS7 上部署配置这个系统,过程不算难,但因为网络的关系可能需要较长的时间。

EJBCA 基于 Java,最新版的 EJBCA 需要用到 JBoss EAP 7 作为基础部署环境,同时你还需要一个 MariaDB 存储数据。当然你还可以选择其他的数据库,具体请参考以下的安装指引:EJBCA Installation guide

2.1 数据库配置

在配置 MariaDB 的时候请注意编码要为 utf-8,以下是我数据库的信息(因为我的 MariaDB 是放在 docker 中的,我会在文章末尾放上 docker-compose.yml):

  • MariaDB for EJBCA
    -- host:192.168.81.31(centos 本机)
    -- dbname:ejbca
    -- username:ejbca
    -- passwd:ejbca
MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.4.12-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id:		43
Current database:
Current user:		ejbca@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server:			MariaDB
Server version:		10.4.12-MariaDB-1:10.4.12+maria~bionic mariadb.org binary distribution
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			15 hours 41 min 17 sec

Threads: 13  Questions: 1506  Slow queries: 0  Opens: 121  Flush tables: 1  Open tables: 111  Queries per second avg: 0.026
--------------

MariaDB 创建用户及授权命令:

CREATE USER 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';
CREATE USER 'ejbca'@'%' IDENTIFIED BY 'ejbca';
GRANT ALL ON *.* TO 'ejbca'@'localhost';
GRANT ALL ON *.* TO 'ejbca'@'%';
flush privileges;
create database ejbca;

2.2 JDK 配置

JDK 信息:

openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

2.3 下载 jboss

但在实际安装中,我发现最新版的 JBoss EAP 7 会导致 EJBCA 部署失败,所以我选择使用 JBoss EAP 6.4.0 这个版本,JBoss EAP 可通过以下地址下载:Download JBoss EAP for Development Use(需要红帽账号)

下载的时候请下载 Installer:
image.png

JBoss EAP 的下载需要一个账户(红帽账号),在非商业使用环境中是免费的。

2.4 安装 ant

最后还需要用到 ant 命令,请使用以下命令安装:

yum -y install ant

2.5 下载最新 ejbca

ejbca_ce_6_15_2_5 下载请点击这里.

补充:其他 ejbca 版本下载地址点击这里(原文使用的是 ejbca_ce_6_5.0.5)

2.6 最后准备

准备好之后,应该会有这两个文件:

[root@ejbca ~]# ll -h /root/ejbca/
total 211M
-rw-r--r-- 1 root root  33M Jul 22 22:43 ejbca_ce_6_15_2_5.zip
-rw-r--r-- 1 root root 179M Jul 22 22:43 jboss-eap-6.4.0-installer.jar

三、JBoss EAP

安装 ant 的时候会默认装上 JDK 1.8,所以我用 Java 命令安装 JBoos EAP:

[root@ejbca ~]# java -jar ejbca/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] :
 
#确认协议之后是安装路径,默认即可
Select the installation path:  [/root/EAP-6.4.0]
 
#随后是部件选项,默认即可
Select the packs you want to install:
1    [x] [Required]      [Red Hat JBoss Enterprise Application Platform] (542.89 KB)
2    [x]                 [AppClient] (34.24 KB)
3    [x] [Required]      [Bin] (10.99 MB)
4    [x] [Required]      [Bundles] (1.01 MB)
5    [x]                 [Docs] (4.75 MB)
6    [x] [Required]      [Domain] (125.56 KB)
7    [x] [Required]      [Domain Shell Scripts] (17.35 KB)
8    [x] [Required]      [Modules] (147.01 MB)
9    [x] [Required]      [Standalone] (152.77 KB)
10   [x] [Required]      [Standalone Shell Scripts] (14.16 KB)
11   [x] [Required]      [Welcome Content] (2.11 MB)
12   [x]                 [Red Hat JBoss Enterprise Application Platform Natives] (8 KB)
13   [x]                 [Native RHEL7 x86_64] (76 KB)
14   [x]                 [Native Utils RHEL7 x86_64] (53.04 KB)
15   [x]                 [Native Webserver RHEL7 x86_64] (254.97 KB)
Total Size Required: 167.11 MB
Press 0 to confirm your selections
Please select which packs you want to install
 
#随后是jboss用户名和密码
Admin username: [admin] 
 
 
Admin password: [] 
*************
Confirm admin password: [*************] 
*************
press 1 to continue, 2 to quit, 3 to redisplay.
 
#然后是演示文件的安装,我选择no
Quickstarts
Red Hat JBoss Enterprise Application Platform comes with a series of quickstart examples designed to help users begin writing applications using the Java EE 6 technologies. Would you like to install quickstarts?
0  [x] No
1  [ ] Yes
 
#最后是监听端口,默认是8080,
Socket Bindings
Configure the socket bindings for Red Hat JBoss Enterprise Application Platform.
 
Select Port Configuration:
0  [x] Use the default port bindings for standalone and domain modes.
1  [ ] Configure an offset for all default port bindings.
2  [ ] Configure custom port bindings.
 
#紧接着是是否启用IPv6
If this computer is using a pure IPv6 configuration, please check the box below.
  [ ] Enable pure IPv6 configuration
 
#然后会询问是否启动服务器,先不启动
Server Launch
Choose server startup mode: 
0  [x] Don't start the server
1  [ ] Standalone Mode
2  [ ] Domain Mode
 
#选择日志等级
Configure the logging levels for Red Hat JBoss Enterprise Application Platform?
0  [x] No
1  [ ] Yes
 
#选择配置文件
Configure runtime environment
There are several additional options for configuring Red Hat JBoss Enterprise Application Platform now that the server has been installed. Each option can be individually chosen, and will be configured in the order displayed upon pressing next. Would you like to do this now?
0  [x] Perform default configuration
1  [ ] Perform advanced configuration

经过一系列交互之后就会解包安装。

到这里已经完成 JBoss EAP 的安装,其实他有个基于 Web 的控制面饭,但是服务器只监听 127.0.0.1 这个 IP,如果需要监听其他 IP 或 0.0.0.0,请修改以下文件(修改的地方仅有三处,其余出现的 127.0.0.1 请不要随意修改):

#打开文件进行修改
[root@ejbca ~]# vim /root/EAP-6.4.0/standalone/configuration/standalone.xml
 
#定位到interface的节点并修改监听地址为0.0.0.0
    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:0.0.0.0}"/>
        </interface>
        <interface name="unsecure">
            <inet-address value="${jboss.bind.address.unsecure:0.0.0.0}"/>
        </interface>
    </interfaces>

随后使用以下命令启动服务,在这里先不用脚本,因为后面需要重启服务。启动服务后再打开一个 SSH 窗口进行下面的步骤:

[root@ejbca ~]# /root/EAP-6.4.0/bin/standalone.sh

确认 JBoss EAP 服务启动后即可通过浏览器打开管理界面:
image.png

四、MariaDB connector

为了让 JBoss EAP 连接上 MariaDB,需要使用 MariaDB Connector,可以通过以下地址下载:
MariaDB Connector

我写这篇文章的时候,最新版是 2.5.4,可以通过以下地址直接下载:
mariadb-java-client-2.5.4.jar

然后创建数据库驱动文件夹并将下载好的 MariaDB Connector 放置到该目录中:

#进入JBoss根目录
[root@ejbca ~]# cd /root/EAP-6.4.0/
 
#新建文件夹
[root@ejbca ejbca_ce_6_15_2_5]# mkdir -p modules/org/mariadb/main/
 
#检查文件
[root@ejbca ejbca_ce_6_15_2_5]# ll -h modules/org/mariadb/main/
total 460K
-rw-r--r-- 1 root root 457K Jul 22 23:43 mariadb-java-client-2.5.4.jar

最后还需要在该目录中新建一个配置文件:

[root@ejbca ejbca_ce_6_15_2_5]# cat modules/org/mariadb/main/module.xml 
<?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.5.4.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    <module name="org.slf4j"/>
  </dependencies>
</module>

请注意修改 resources 字段中的文件名。

然后是启用 MariaDB Connector,使用 jboss-cli.sh 进入 JBoss cli:

[root@ejbca ejbca_ce_6_15_2_5]# /root/EAP-6.4.0/bin/jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /]

如果提示 disconnected,则需要输入 connect 并回车,如果一切正常则显示:

[standalone@localhost:9999 /]

然后输入以下命令在 JBoss 中注册 MariaDB 驱动:

#注册驱动
/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 回车即可退出。

若注册驱动期间,有打错别字或者想更换注册的驱动时,务必使用 /subsystem=datasources/jdbc-driver=org.mariadb.jdbc.Driver:remove() 命令删除所有注册的驱动,之后再重新注册,否则会报错。

五、EJBCA

在新 SSH 窗口中解压并进入 EJBCA 源码目录:

#进入临时文件夹
[root@ejbca ~]# cd /root/ejbca/
 
#解压文件
[root@ejbca ~]# unzip ejbca_ce_6_15_2_5.zip
 
#进入EJBCA目录
[root@ejbca ~]# cd /root/ejbca/ejbca_ce_6_15_2_5/

5.1 配置文件

先进入配置文件目录:

[root@ejbca ejbca_ce_6_15_2_5]# cd conf/

配置文件目录包含以下文件:

[root@ejbca conf]# ll -h
total 176K
-rw------- 1 root root  587 Apr  6 10:29 batchtool.properties.sample
-rw------- 1 root root 8.1K Apr  6 10:29 cache.properties.sample
-rw------- 1 root root 1.4K Apr  6 10:29 catoken.properties.sample
-rw------- 1 root root  396 Apr  6 10:29 certstore.properties.sample
-rw------- 1 root root  14K Apr  6 10:29 cesecore.properties.sample
-rw------- 1 root root 1.4K Apr  6 10:29 cmptcp.properties.sample
-rw------- 1 root root  362 Apr  6 10:29 crlstore.properties.sample
-rw------- 1 root root  100 Apr  6 10:29 custom.properties.sample
-rw------- 1 root root 3.1K Apr  6 10:29 database.properties.sample
-rw------- 1 root root 9.5K Apr  6 10:29 ejbca.properties.sample
-rw------- 1 root root 3.1K Apr  6 10:29 externalra-gui.properties.sample
-rw------- 1 root root 1.9K Apr  6 10:29 externalra.properties.sample
-rw------- 1 root root 3.2K Apr  6 10:29 install.properties.sample
-rw------- 1 root root 2.7K Apr  6 10:29 jaxws.properties.sample
-rw------- 1 root root   50 Apr  6 10:29 jndi.properties.glassfish
-rw------- 1 root root  146 Apr  6 10:29 jndi.properties.jboss7
-rw------- 1 root root  146 Apr  6 10:29 jndi.properties.jbosseap6
-rw------- 1 root root 4.2K Apr  6 10:29 log4j-glassfish.xml.sample
-rw------- 1 root root 4.8K Apr  6 10:29 log4j-jboss6.xml.sample
-rw------- 1 root root 4.0K Apr  6 10:29 log4j-jbosseap6.xml.sample
drwx------ 2 root root   36 Apr  6 10:29 logdevices
-rw------- 1 root root 1.3K Apr  6 10:29 mail.properties.sample
-rw------- 1 root root  18K Apr  6 10:29 ocsp.properties.sample
drwx------ 2 root root   37 Apr  6 10:29 plugins
-rw------- 1 root root 6.4K Apr  6 10:29 scepra.properties.sample
-rw------- 1 root root 1.2K Apr  6 10:29 systemtests.properties.sample
-rw------- 1 root root 2.4K Apr  6 10:29 va.properties.sample
-rw------- 1 root root 1.9K Apr  6 10:29 va-publisher.properties.sample
-rw------- 1 root root  13K Apr  6 10:29 web.properties.sample

EJBCA 只加载后缀名为 properties 的文件,否则则加载默认配置。在这里我们需要修改以下文件:

  • database.properties:数据库配置文件
  • ejbca.properties:EJBCA 配置文件
  • install.properties:安装配置文件
  • web.properties:Web 服务配置文件

首先是数据库配置文件,先将文件复制一份然后进行修改:

#复制
[root@ejbca conf]# cp database.properties.sample database.properties
 
#修改
[root@ejbca conf]# vim database.properties
 
#修改以下内容
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

然后复制并修改 EJBCA 配置文件:

#复制文件
[root@ejbca conf]# cp ejbca.properties.sample ejbca.properties
 
#修改文件
[root@ejbca conf]# vim ejbca.properties
 
#修改以下内容
appserver.home=/root/EAP-6.4.0
appserver.type=jboss
approval.defaultrequestvalidity=28800
approval.defaultapprovalvalidity=28800
ejbca.passwordlogrounds=8

然后修改安装配置文件:

#复制文件
[root@ejbca conf]# cp install.properties.sample install.properties
 
#修改文件
[root@ejbca conf]# vim install.properties
 
#修改以下内容(Medcaptain为公司名称,可根据实际情况替换)
ca.name=MedcaptainManagementCA
ca.dn=CN=MedcaptainManagementCA,O=Medcaptain,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

最后是 Web 服务配置文件:

#复制文件
[root@ejbca conf]# cp web.properties.sample web.properties
 
#修改文件
[root@ejbca conf]# vim web.properties
 
#修改以下内容
java.trustpassword=changeit #默认即可
superadmin.cn=SuperAdmin #默认即可
superadmin.dn=CN=${superadmin.cn},O=Medcaptain,C=CN
superadmin.password=ejbca #默认即可
superadmin.batch=true #默认即可
httpsserver.password=serverpwd #默认即可
httpsserver.hostname=localhost #默认即可
httpsserver.dn=CN=${httpsserver.hostname},O=Medcaptain,C=CN
httpserver.pubhttp=8080
httpserver.pubhttps=8442
httpserver.privhttps=8443

5.2 部署 / 安装

特别注意:官网下载的 ejbca 压缩包中缺少两个 Java 文件,需补全,路径为:/root/ejbca/ejbca_ce_6_15_2_5/modules/cesecore-p11/src/sun/security/pkcs11,此目录下只有 CESeCoreUtils.java,但是本人在实际编译的时候却报错,后来发现是少两个文件,分别为:P11Key.javaECUtil.java。这两个文件的源码分别为:P11Key.javaECUtil.java

补充之后目录结构如下:

[root@pki-server pkcs11]# pwd
/root/ejbca/ejbca_ce_6_15_2_5/modules/cesecore-p11/src/sun/security/pkcs11
[root@pki-server pkcs11]# ll
total 60
-rw-------. 1 root root  6728 Apr  6  2017 CESeCoreUtils.java
-rw-r--r--. 1 root root  7970 Feb 28 08:59 ECUtil.java
-rw-r--r--. 1 root root 42036 Feb 27 19:09 P11Key.java

补充完毕

修改完成配置文件后回到 EJBCA 源码根目录并运行以下命令进行部署:

#回到根目录
[root@ejbca conf]# cd /root/ejbca/ejbca_ce_6_15_2_5/
 
#部署
[root@ejbca ejbca_ce_6_15_2_5]# ant deploy

部署需要较长的时间,请耐心等待。如果成功则显示:

BUILD SUCCESSFUL
Total time: 1 minute 39 seconds

然后还需要安装,安装过程中可以看到配置信息:

[root@ejbca ejbca_ce_6_15_2_5]# ant install

成功后会显示如下内容:

BUILD SUCCESSFUL
Total time: 3 minutes 11 seconds

数据库则会生成以下表:

MariaDB [ejbca]> show tables;
+-----------------------------+
| Tables_in_ejbca             |
+-----------------------------+
| AccessRulesData             |
| AdminEntityData             |
| AdminGroupData              |
| AdminPreferencesData        |
| ApprovalData                |
| AuditRecordData             |
| AuthorizationTreeUpdateData |
| Base64CertData              |
| CAData                      |
| CRLData                     |
| CertReqHistoryData          |
| CertificateData             |
| CertificateProfileData      |
| CryptoTokenData             |
| EndEntityProfileData        |
| GlobalConfigurationData     |
| HardTokenCertificateMap     |
| HardTokenData               |
| HardTokenIssuerData         |
| HardTokenProfileData        |
| HardTokenPropertyData       |
| InternalKeyBindingData      |
| KeyRecoveryData             |
| PeerData                    |
| PublisherData               |
| PublisherQueueData          |
| ServiceData                 |
| UserData                    |
| UserDataSourceData          |
+-----------------------------+
29 rows in set (0.00 sec)

5.3 登入

这时候可以通过以下地址访问公开页面:
http://192.168.81.31:8080/ejbca/
image.png

如果需要登入管理界面,则需要先重启 JBoss。回到 JBoss 的 SSH 窗口按下组合键 CTRL+C 终止运行,然后再重新启动 JBoss。从控制台中可以查看监听的地址与端口:
image.png

01:14:30,664 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-1) JBWEB003001: Coyote HTTP/1.1 initializing on : http-/0.0.0.0:8443
01:14:30,675 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-3) JBWEB003001: Coyote HTTP/1.1 initializing on : http-/0.0.0.0:8442
01:14:30,678 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-2) JBWEB003001: Coyote HTTP/1.1 initializing on : http-/0.0.0.0:8080
01:14:30,705 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-1) JBWEB003000: Coyote HTTP/1.1 starting on: http-/0.0.0.0:8443
01:14:30,710 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-2) JBWEB003000: Coyote HTTP/1.1 starting on: http-/0.0.0.0:8080
01:14:30,722 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-3) JBWEB003000: Coyote HTTP/1.1 starting on: http-/0.0.0.0:8442

在登入之前需要在以下目录将 p12 证书文件保存到本地并安装:

[root@ejbca ~]# ll /root/ejbca/ejbca_ce_6_15_2_5/p12/
total 20
-rw-r--r-- 1 root root 4334 Jul 23 01:06 superadmin.p12
-rw-r--r-- 1 root root 5332 Jul 23 01:05 tomcat.jks
-rw-r--r-- 1 root root 1456 Jul 23 01:06 truststore.jks

在 windows 系统中双击下载的 p12 文件并选择 本地用户
image.png

证书密码为 ejbca
image.png

Mac 下双击 p12 文件之后直接输入密码即可:
image.png

证书导入完毕后即可通过浏览器登入管理面板:

https://192.168.81.31:8443/ejbca/adminweb/

image.png

这里要选择正确的数字证书,否则无法登入,登入后的界面如下:
image.png

Mac 用户在选择证书之后,还需要输入本机登录密码授权:
image.png

补充将界面语言设置成中文:
image.png
刷新之后即可见效
补充完毕

六、结语

EJBCA 是一套很强大的 CA 管理软件,完全可以在企业内部部署使用。

JBoss 的启动可以使用以下脚本:

[root@ejbca ~]# cat /usr/local/shell/jboss_startup.sh 
#!/bin/sh
 
nohup /root/EAP-6.4.0/bin/standalone.sh > /dev/null 2>&1 &

补充:我这里写了一个 systemd 的服务文件:

  • /lib/systemd/system/ejbca.service
[Unit]
Description=EJBCA
After=network.target docker.service
[Service]
ExecStart=/usr/bin/bash /root/EAP-6.4.0/bin/standalone.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target

之后用 systemctl start ejbcasystemctl enable ejbca 命令来启动服务和设置开机自启

补充完毕

七、相关视频

Bilibili:EP18 – centos7 安装全功能 CA 管理系统 EJBCA

八、补充

MariaDB 的 docker-compose.yml 及对应的配置文件(这两个文件放同级目录即可)

  • docker-compose.yml
version: '3'
services:
  mariadb:
    image: mariadb:latest
    restart: always
    container_name: mariadb
    environment:
    - TZ=Asia/Shanghai
    - MYSQL_ROOT_PASSWORD=123456
    volumes:
    - ./mariadb.cnf:/etc/mysql/mariadb.cnf
    ports:
    - 3306:3306
    network_mode: host
  • mariadb.cnf
[mysql]
default-character-set=utf8

[mysql.server]
default-character-set=utf8

[mysqld_safe]
default-character-set=utf8

[client]
default-character-set = utf8

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake
# Import all .cnf files from configuration directory
!includedir /etc/mysql/mariadb.conf.d/

九、扩展

怕麻烦的可以直接用 docker 容器安装 ejbca

docker pull primekey/ejbca-ce

ejbca 使用:EJBCA 证书平台-管理员及用户使用指南


“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill

标  题centos7安装全功能CA管理系统EJBCA
作  者Leif160519
出  处https://github.icu/articles/2020/02/28/1582857350622.html
关于博主:坐标南京,运维工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!