1. 記事一覧 >
  2. ブログ記事
category logo

EJBCA(PKIおよび証明書管理アプリ)をビルドしてインストールしてみた

(更新) (公開)

はじめに

EJBCA(EJBCA Community)というオープンソースの公開鍵基盤(PKI)および認証局(CA)ソフトウェアをビルドしてインストールしました。
本記事では、その手順を紹介していきたいと思います。

EJBCA Web 管理画面


公式 Docker コンテナ がありますので、Docker(Docker Compose)を使った方が良いと思いますが、あえてのビルドです。
公式ビルド手順は、https://doc.primekey.com/ejbca/ejbca-installation にあり、今回の記事では、アプリケーションサーバー、DB など、いろいろな選択肢の中の一つです。動けばヨシで、細かい設定、チューニングは極力無しです。
この記事では、インストールして Web 管理画面(/ejbca/adminweb/)が表示されたら終わりです。

Java ラー以外の方でも進められるようになるべく意味を紐解きながら進めます。

Docker のやり方は、こちらにあります。EJBCA を動かすだけなら、「Docker って何?」から始まらない限り絶対こっちの方が良いと思います。

https://doc.primekey.com/ejbca/tutorials-and-guides/tutorial-start-out-with-ejbca-docker-container

以下の環境です。少しでも環境が異なると、途中で詰まるかもしれません。

Ubuntu Desktop 22.04.3 LTS

  EJBCA 8.2.0.1 Community

  openjdk version "11.0.21" 2023-10-17

  wildfly 26.0.0.Final

  mysql Ver 15.1 Distrib 10.6.16-MariaDB

  Apache Ant(TM) version 1.10.12

【 EJBCA 】

EJBCA は、エンタープライズ向けの公開鍵基盤(PKI)認証局のツールです。証明書の発行、失効、鍵管理などを行うことができます。

【 PKI 】

PKI(Public Key Infrastructure、公開鍵基盤)は、公開鍵暗号やデジタル署名をインターネット上で安全に運用するための社会的基盤です。

これにより、公開鍵の配布、認証、鍵の管理などが行われます。具体的には、信頼できる第三者(認証局)がデジタル証明書を発行し、その証明書を通じて公開鍵が安全に配布されます。

これにより、通信の安全性が保証されます。

【 CA 】

CA(Certificate Authority)は、インターネット上で接続者の身分を証明する電子証明書の発行と管理を行う認証局のことです。

本記事情報の設定不足、誤りにより何らかの問題が生じても、一切責任を負いません。


ホスト名設定

root 権限で作業します。

とりあえず、ホスト名を ejbcatest と最初に決めておきます。(この作業は、省略しても良いです。)

$ su
# hostnamectl set-hostname ejbcatest
# vi /etc/hosts
127.0.0.1	ejbcatest
192.168.11.6	ejbcatest

MariaDB インストール

MariaDB をインストールします。PostgreSQL など、その他の選択肢もありますが、今回は、MariaDB です。

【 MariaDB 】

MariaDB は、MySQL から派生したオープンソースのリレーショナルデータベース管理システム(RDBMS)です。MySQL と高い互換性を持ちつつ、新機能の追加やソースコードの改善が行われています。

# apt update
# apt -y upgrade
# apt install mariadb-server -y
# mysql_secure_installation
Enter current password for root (enter for none): エンター
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] エンター
Disallow root login remotely? [Y/n] エンター
Remove test database and access to it? [Y/n] エンター
Reload privilege tables now? [Y/n] エンター
# mysql --version
mysql  Ver 15.1 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

ejbca ユーザー作成

公式ドキュメント(https://doc.primekey.com/ejbca/ejbca-installation/creating-the-database)に以下の記述があるため、それに従います。
"MySQL バージョン 8 以降、GRANT コマンドを使用してユーザーを暗黙的に作成することはできません。"
"MySQL バージョン 8 以降を実行している場合は、 次の例に従って最初にejbcaユーザーを作成します。"

# mysql -u root -p
Enter password: エンター(空のパスワード)
MariaDB [(none)]> CREATE USER 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

1. mysql -u root -p

MariaDB サーバーに root ユーザーとしてログインします。
-p オプションはパスワードを求めるためのものです。

2. CREATE USER 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';

ejbca という名前の新しいユーザーを作成します。このユーザーは localhost からの接続のみを許可し、パスワードは ejbca に設定されます。

3. GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost';

新しく作成した ejbca ユーザーに、ejbca データベースの全てのテーブルに対する全権限を付与します。

4.FLUSH PRIVILEGES;

変更した権限設定を即時反映させます。

# mysql -u root -p
Enter password:エンター
MariaDB [(none)]> CREATE DATABASE ejbca CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';
MariaDB [(none)]> exit;

1. CREATE DATABASE ejbca CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ejbca という名前の新しいデータベースを作成します。文字セットと照合順序はそれぞれ utf8mb4utf8mb4_unicode_ci に設定されます。

2. GRANT ALL PRIVILEGES ON ejbca.* TO 'ejbca'@'localhost' IDENTIFIED BY 'ejbca';

ejbca ユーザーに、新しく作成した ejbca データベースの全てのテーブルに対する全権限を付与します。このユーザーは localhost からの接続のみを許可し、パスワードは ejbca に設定されます。

wildfly26 インストール

wildfly26 をインストールします。
公式ドキュメントは、こちらです。
https://doc.primekey.com/ejbca/ejbca-installation/application-servers/wildfly-26


ZIP パッケージを使用してインストールします。
インストール先は、/opt/wildfly です。


# wget https://github.com/wildfly/wildfly/releases/download/26.0.0.Final/wildfly-26.0.0.Final.zip -O /home/admin/wildfly-26.0.0.Final.zip
# unzip -q /home/admin/wildfly-26.0.0.Final.zip -d /opt/
# ln -snf /opt/wildfly-26.0.0.Final /opt/wildfly

【 WildFly 】

WildFly は、Java EE 準拠のオープンソースアプリケーションサーバで、高速、軽量、高機能、柔軟な特性を持っています。元々は「JBoss Application Server」という名前でしたが、現在は「WildFly」に改名されています。


RESTEasy-Crypto を削除します。

# sed -i '/.*org.jboss.resteasy.resteasy-crypto.*/d' /opt/wildfly/modules/system/layers/base/org/jboss/as/jaxrs/main/module.xml
# rm -rf /opt/wildfly/modules/system/layers/base/org/jboss/resteasy/resteasy-crypto/

【 RESTEasy 】

RESTEasy は、JBoss Enterprise Application Platform(EAP)の一部です。JBoss が提供するフレームワークで、Java で RESTful Web サービスを簡単に作成できるようにするものです。


カスタム構成の作成を行います。

# cp -p /opt/wildfly/bin/standalone.conf /opt/wildfly/bin/standalone.conf.org
# sed -i -e 's/{{ HEAP_SIZE }}/2048/g' /opt/wildfly/bin/standalone.conf
# sed -i -e "s/{{ TX_NODE_ID }}/$(od -A n -t d -N 1 /dev/urandom | tr -d ' ')/g" /opt/wildfly/bin/standalone.conf

1. sed -i -e 's/{{ HEAP_SIZE }}/2048/g' /opt/wildfly/bin/standalone.conf

standalone.conf ファイル内の {{ HEAP_SIZE }} という文字列を 2048 に置換します。これは、Java のヒープサイズを設定するためのもので、通常は Java アプリケーションのパフォーマンスを調整するために使用されます。

2. sed -i -e "s/{{ TX_NODE_ID }}/$(od -A n -t d -N 1 /dev/urandom | tr -d ' ')/g" /opt/wildfly/bin/standalone.conf

standalone.conf ファイル内の {{ TX_NODE_ID }} という文字列をランダムな数値に置換します。この数値は /dev/urandom デバイスから生成され、トランザクションノード ID を一意に識別するために使用されます。

WildFly をサービスとして構成します。

# cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin
# cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system
# mkdir /etc/wildfly
# cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly
# systemctl daemon-reload
# useradd -r -s /bin/false wildfly
# chown -R wildfly:wildfly /opt/wildfly-26.0.0.Final/

WildFly を開始します。

# systemctl start wildfly

Elytron 認証情報ストアを作成します。

# echo '#!/bin/sh' > /usr/bin/wildfly_pass
# echo "echo '$(openssl rand -base64 24)'" >> /usr/bin/wildfly_pass
# chown wildfly:wildfly /usr/bin/wildfly_pass
# chmod 700 /usr/bin/wildfly_pass

【 Elytron 認証情報ストア 】

Elytron 認証情報ストアは、JBoss EAP の Elytron サブシステムで導入されたセキュアなストレージ機能で、認証情報を安全に保存できます。

これは、設定ファイル外で機密文字列を暗号化し、キーストアに格納することができます。また、JBoss EAP 管理 CLI 内での認証情報の管理が容易になります。


openjdk11 インストール

OpenJDK 11 をインストールします。
11 なのは、公式ドキュメントに "Supported and recommended." と書いてあるからです。
この後の手順に出てくる /opt/wildfly/bin/jboss-cli.sh の実行に必要です。

# apt update;apt install -y openjdk-11-jdk
# which java
/usr/bin/java
# java -version
openjdk version "11.0.21" 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

【 jboss-cli.sh 】

jboss-cli.sh は、JBoss EAP(Enterprise Application Platform)のコマンドライン管理ツールです。このツールを使用すると、サーバーの起動や停止、アプリケーションのデプロイ(展開)やアンデプロイ(取り外し)、システムの設定など、さまざまな管理タスクを行うことができます。

【 余談:なぜ wildfly-cli.sh ではないのか 】

WildFly は、元々 JBoss Application Server という名前で開発されていました。そのため、多くのツールや設定ファイルは、まだ「JBoss」の名前を使用しています。jboss-cli.sh もその一つで、WildFly の管理を行うためのコマンドラインツールです。したがって、wildfly-cli.sh ではなく jboss-cli.sh という名前が使われています。


認証情報ストア作成

WildFly の Elytron サブシステムで認証情報ストアを作成します。

# mkdir /opt/wildfly/standalone/configuration/keystore
# chown wildfly:wildfly /opt/wildfly/standalone/configuration/keystore

ここで、なぜか wildfly が止まっていたため、再起動が必要でした。

# systemctl status wildfly
○ wildfly.service - The WildFly Application Server
     Loaded: loaded (/etc/systemd/system/wildfly.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

# systemctl start wildfly

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/credential-store=defaultCS:add(path=keystore/credentials, relative-to=jboss.server.config.dir, credential-reference={clear-text="{EXT}/usr/bin/wildfly_pass", type="COMMAND"}, create=true)'
{"outcome" => "success"}

1. jboss-cli.sh --connect

WildFly の管理 CLI に接続します。

2. /subsystem=elytron/credential-store=defaultCS:add(...)

Elytron サブシステム内で defaultCS という名前の認証情報ストアを作成します。

3. path=keystore/credentials, relative-to=jboss.server.config.dir

認証情報ストアの物理的な場所を指定します。これは、WildFly の設定ディレクトリ内の keystore/credentials というパスになります。

4. credential-reference={clear-text="{EXT}/usr/bin/wildfly_pass", type="COMMAND"}

認証情報ストアのマスターパスワードを指定します。このパスワードは、/usr/bin/wildfly_pass というコマンドの出力から取得されます。

5. create=true

認証情報ストアがまだ存在しない場合に作成します。

データベースドライバーの追加

データベースに接続するための JDBC ドライバを WildFly サーバーに配置します。

mariadb-java-client.jar 以外は、念のため、入れておきます。

/opt/wildfly/standalone/deployments/mariadb-java-client.jar
/opt/wildfly/standalone/deployments/postgresql-jdbc4.jar
/opt/wildfly/standalone/deployments/mssql-jdbc.jre11.jar
をインストールします。

# wget https://dlm.mariadb.com/1157496/Connectors/java/connector-java-2.7.0/mariadb-java-client-2.7.0.jar -O /opt/wildfly/standalone/deployments/mariadb-java-client.jar
# wget https://jdbc.postgresql.org/download/postgresql-42.2.18.jar -O /opt/wildfly/standalone/deployments/postgresql-jdbc4.jar
# wget https://github.com/microsoft/mssql-jdbc/releases/download/v12.2.0/mssql-jdbc-12.2.0.jre11.jar -O /opt/wildfly/standalone/deployments/mssql-jdbc.jre11.jar

【 JDBC 】

JDBC(Java Database Connectivity)は、Java プログラムからデータベースへのアクセスを行うための API(Application Programming Interface)です。これにより、Java プログラムはデータベースへの接続、データの読み書きなどの操作を行うことができます。JDBC はデータベースの種類に関わらず同じ手順で接続し、データを操作することが可能です。


データソースの追加

データソースを追加します。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/credential-store=defaultCS:add-alias(alias=dbPassword, secret-value="ejbca")'
# /opt/wildfly/bin/jboss-cli.sh --connect 'data-source add --name=ejbcads --connection-url="jdbc:mysql://127.0.0.1:3306/ejbca" --jndi-name="java:/EjbcaDS" --use-ccm=true --driver-name="mariadb-java-client.jar" --driver-class="org.mariadb.jdbc.Driver" --user-name="ejbca" --credential-reference={store=defaultCS, alias=dbPassword} --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;"'
# /opt/wildfly/bin/jboss-cli.sh --connect ':reload'

1. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/credential-store=defaultCS:add-alias(alias=dbPassword, secret-value="ejbca")'

Elytronサブシステムの defaultCS という名前の認証情報ストアに、dbPassword というエイリアスを追加します。このエイリアスの秘密値は ejbca に設定されます。なお、エイリアスとは、パスワードが入った入れ物の名前のようなものです。

2. /opt/wildfly/bin/jboss-cli.sh --connect 'data-source add (...略...)

新しいデータソース ejbcads を作成します。このデータソースは、MariaDB の ejbca データベースに接続するためのもので、JNDI 名は java:/EjbcaDS に設定されます。また、CCM(Cached Connection Manager)を使用し、ドライバ名は mariadb-java-client.jar、ドライバクラスは org.mariadb.jdbc.Driver に設定されます。ユーザ名はejbcaで、パスワードは先ほど作成した認証情報ストアのエイリアス dbPassword を参照します。その他、様々なデータソースの設定が行われています。

3. /opt/wildfly/bin/jboss-cli.sh --connect ':reload'

WildFly サーバーをリロードします。これにより、上記の設定変更が反映されます。

WildFly リモート処理の構成

WildFly リモート処理の構成を行います。
全体としてこの操作は、新たな接続ポイントを作成し、その接続ポイントが特定の IP アドレスとポートで HTTP リクエストを待ち受けるように設定する、ということを行っています。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=remoting/http-connector=http-remoting-connector:write-attribute(name=connector-ref,value=remoting)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=remoting:add(port=4447,interface=management)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/http-listener=remoting:add(socket-binding=remoting,enable-http2=true)'
# /opt/wildfly/bin/jboss-cli.sh --connect ':reload'

1. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=remoting/(...略...)

http-remoting-connector という名前のHTTPコネクタの connector-ref 属性を remoting に設定します。これにより、HTTP コネクタが remoting コネクタを参照するようになります。

2. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/(...略...)

standard-sockets という名前のソケットバインディンググループに、remoting という名前の新しいソケットバインディングを追加します。このソケットバインディングは、management インターフェース上の 4447 ポートを使用します。

3. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/(...略...)

default-server という名前のサーバーに、remoting という名前の新しい HTTP リスナーを追加します。この HTTP リスナーは、先ほど作成した remoting ソケットバインディングを使用し、HTTP/2 を有効にします。

ロギングの構成

公式ドキュメントに載っているログ関係の操作です。(説明は省略します。)


オプション 1 - 推奨されるログ記録

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.ejbca:add(level=INFO)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore:add(level=INFO)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=com.keyfactor:add(level=INFO)'

追加のロギング構成

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.jboss.as.config:write-attribute(name=level, value=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.jboss:add(level=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.wildfly:add(level=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.xnio:add(level=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.hibernate:add(level=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.apache.cxf:add(level=WARN)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.config.ConfigurationHolder:add(level=WARN)'

アクセスログの追加

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/host=default-host/setting=access-log:add(pattern="%h %t \"%r\" %s \"%{i,User-Agent}\"", relative-to=jboss.server.log.dir, directory=access-logs)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=io.undertow.accesslog:add(level=INFO)'

コンソールハンドラーを削除する

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/root-logger=ROOT:remove-handler(name=CONSOLE)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/console-handler=CONSOLE:remove()'

古いログファイルを削除する

# vi /etc/cron.daily/remove-old-wildfly-logs.sh
----- ここから
#!/bin/sh
# Remove log files older than 7 days
find /opt/wildfly/standalone/log/ -type f -mtime +7 -name 'server.log*' -execdir rm -- '{}' \;
----- ここまで
# chmod +x /etc/cron.daily/remove-old-wildfly-logs.sh

Syslog 送信を有効にする

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/json-formatter=logstash:add(exception-output-type=formatted, key-overrides=[timestamp="@timestamp"],meta-data=[@version=1])'
# /opt/wildfly/bin/jboss-cli.sh --connect "/subsystem=logging/syslog-handler=syslog-shipping:add(app-name=EJBCA,enabled=true,facility=local-use-0,hostname=$(hostname -f),level=INFO,named-formatter=logstash,port=514,server-address=syslog.server,syslog-format=RFC5424)"
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/root-logger=ROOT:add-handler(name=syslog-shipping)'

ファイルへの監査ログを有効にする

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/size-rotating-file-handler=cesecore-audit-log:add(file={path=cesecore-audit.log, relative-to=jboss.server.log.dir}, max-backup-index=1, rotate-size=128m)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.audit.impl.log4j.Log4jDevice:add'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.audit.impl.log4j.Log4jDevice:add-handler(name=cesecore-audit-log)'

OCSP ログの構成

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.TransactionLogger:add(use-parent-handlers=false)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.TransactionLogger:write-attribute(name=level, value=INFO)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-tx-async:add(queue-length="100")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-tx-async:write-attribute(name=level, value=DEBUG)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-tx-async:write-attribute(name="overflow-action", value="BLOCK")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.TransactionLogger:add-handler(name=ocsp-tx-async)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/periodic-rotating-file-handler=ocsp-tx:add(autoflush=true, append=true, suffix=".yyyy-MM-dd", file={path=ocsp-tx.log,relative-to=jboss.server.log.dir})'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-tx-async:add-handler(name=ocsp-tx)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.AuditLogger:add(use-parent-handlers=false)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.AuditLogger:write-attribute(name=level, value=INFO)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-audit-async:add(queue-length="100")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-audit-async:write-attribute(name=level, value=DEBUG)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-audit-async:write-attribute(name="overflow-action", value="BLOCK")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/logger=org.cesecore.certificates.ocsp.logging.AuditLogger:add-handler(name=ocsp-audit-async)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/periodic-rotating-file-handler=ocsp-audit:add(autoflush=true, append=true, suffix=".yyyy-MM-dd", file={path=ocsp-audit.log,relative-to=jboss.server.log.dir})'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=logging/async-handler=ocsp-audit-async:add-handler(name=ocsp-audit)'
# vi /etc/cron.daily/archive-rotated-ocsp-logs.sh
----- ここから
#!/bin/sh
# Compress the OCSP audit log and the OCSP transaction log after rotation
xz /opt/wildfly/standalone/log/ocsp-tx.log.*
xz /opt/wildfly/standalone/log/ocsp-audit.log.*
----- ここまで
# chmod +x /etc/cron.daily/archive-rotated-ocsp-logs.sh

【 OCSP 】

OCSP(Online Certificate Status Protocol)は、デジタル証明書(公開鍵証明書)の有効性を TCP/IP ネットワークを通じて問い合わせるためのプロトコルです。これにより、デジタル証明書が何らかの理由で有効期限前に失効している場合でも、その情報を迅速に知ることができます。


HTTP(S) 構成

HTTP/HTTPS の構成を行います。
この記事では、管理コンソールに、https://ejbcatest:8443/ejbca/adminweb/ で接続します。


既存の TLS および HTTP 構成を削除します。
以下の操作により、不要なリスナーやソケットバインディングが削除されます。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/http-listener=default:remove()'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=http:remove()'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/https-listener=https:remove()'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=https:remove()'
# /opt/wildfly/bin/jboss-cli.sh --connect ':reload'
# /opt/wildfly/bin/jboss-cli.sh --connect ':read-attribute(name=server-state)'

1. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/http-listener=default:remove()'

default-server という名前のサーバーから、default という名前の HTTP リスナーを削除します。

2. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=http:remove()'

standard-sockets という名前のソケットバインディンググループから、http という名前のソケットバインディングを削除します。

3. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/https-listener=https:remove()'

default-server という名前のサーバーから、https という名前の HTTPS リスナーを削除します。

4. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=https:remove()'

standard-sockets という名前のソケットバインディンググループから、https という名前のソケットバインディングを削除します。

5. /opt/wildfly/bin/jboss-cli.sh --connect ':reload'

WildFly サーバーをリロードします。これにより、上記の設定変更が反映されます。

6. /opt/wildfly/bin/jboss-cli.sh --connect ':read-attribute(name=server-state)'

WildFly サーバーの状態を読み取ります。これにより、サーバーが正常に起動しているかどうかを確認できます。

3 ポート分離を使用します。
これは、公式ドキュメントで以下のように説明されている部分です。内部的な役割によって、ポートを分ける設定のようです。8443 は Web 管理コンソールです。
"3 ポート分離で Undertow をセットアップする方法について説明します。ポート 8080 は HTTP (非暗号化トラフィック) に使用され、ポート 8442 はサーバー認証のみの HTTPS (暗号化) トラフィックに、ポート 8443 はサーバー認証とクライアント認証の両方を含む HTTPS (暗号化) トラフィックに使用されます。"
2 ポート分離の手順もありますが、そちらではなく、3 ポート分離で進めます。


新しいインターフェースとソケットバインディングが作成されます。これにより、サーバーは新たな IP アドレスとポートで接続を受け付けることができます。

# /opt/wildfly/bin/jboss-cli.sh --connect '/interface=http:add(inet-address="0.0.0.0")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/interface=httpspub:add(inet-address="0.0.0.0")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/interface=httpspriv:add(inet-address="0.0.0.0")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=http:add(port="8080",interface="http")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=httpspub:add(port="8442",interface="httpspub")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=httpspriv:add(port="8443",interface="httpspriv")'

1. /opt/wildfly/bin/jboss-cli.sh --connect '/interface=http:add(inet-address="0.0.0.0")'

http という名前の新しいインターフェースを作成します。このインターフェースは、すべてのIPアドレス(0.0.0.0)で接続を受け付けます。

2. /opt/wildfly/bin/jboss-cli.sh --connect '/interface=httpspub:add(inet-address="0.0.0.0")'

httpspub という名前の新しいインターフェースを作成します。このインターフェースも、すべてのIPアドレスで接続を受け付けます。

3. /opt/wildfly/bin/jboss-cli.sh --connect '/interface=httpspriv:add(inet-address="0.0.0.0")'

httpspriv という名前の新しいインターフェースを作成します。このインターフェースも、すべてのIPアドレスで接続を受け付けます。

4. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=http:add(port="8080",interface="http")'

standard-sockets という名前のソケットバインディンググループに、http という名前の新しいソケットバインディングを追加します。このソケットバインディングは、http インターフェース上の 8080 ポートを使用します。

5. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=httpspub:add(port="8442",interface="httpspub")'

standard-sockets ソケットバインディンググループに、httpspub という名前の新しいソケットバインディングを追加します。このソケットバインディングは、httpspub インターフェース上の 8442 ポートを使用します。

6. /opt/wildfly/bin/jboss-cli.sh --connect '/socket-binding-group=standard-sockets/socket-binding=httpspriv:add(port="8443",interface="httpspriv")'

standard-sockets ソケットバインディンググループに、httpspriv という名前の新しいソケットバインディングを追加します。このソケットバインディングは、httpspriv インターフェース上の 8443 ポートを使用します。

【 Undertow 】

Undertow は、Java で書かれた軽量で高性能な Web サーバーです。非ブロッキングのアーキテクチャを採用しており、大量の同時接続を効率的に処理することができます。また、Servlet 3.1、WebSockets、HTTP/2 などの最新の Web 技術をサポートしています。WildFly などのアプリケーションサーバーの内部で使用されることが多いです。


TLS の構成

TLS の構成を設定します。

これにより、Web 管理画面(/ejbca/adminweb/)へのアクセスは、クライアント証明書が必要になります。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/credential-store=defaultCS:add-alias(alias=httpsKeystorePassword, secret-value="serverpwd")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/credential-store=defaultCS:add-alias(alias=httpsTruststorePassword, secret-value="changeit")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/key-store=httpsKS:add(path="keystore/keystore.p12",relative-to=jboss.server.config.dir,credential-reference={store=defaultCS, alias=httpsKeystorePassword},type=PKCS12)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/key-store=httpsTS:add(path="keystore/truststore.p12",relative-to=jboss.server.config.dir,credential-reference={store=defaultCS, alias=httpsTruststorePassword},type=PKCS12)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/key-manager=httpsKM:add(key-store=httpsKS,algorithm="SunX509",credential-reference={store=defaultCS, alias=httpsKeystorePassword})'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/trust-manager=httpsTM:add(key-store=httpsTS)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/server-ssl-context=httpspub:add(key-manager=httpsKM,protocols=["TLSv1.3","TLSv1.2"],use-cipher-suites-order=false,cipher-suite-filter="TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",cipher-suite-names="TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/server-ssl-context=httpspriv:add(key-manager=httpsKM,protocols=["TLSv1.3","TLSv1.2"],use-cipher-suites-order=false,cipher-suite-filter="TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",cipher-suite-names="TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256",trust-manager=httpsTM,need-client-auth=true)'

1. /opt/wildfly/bin/jboss-cli.sh(...略...)defaultCS:add-alias(alias=httpsKeystorePassword, secret-value="serverpwd")'

defaultCS という名前のクレデンシャルストアに httpsKeystorePassword というエイリアスを追加しています。このエイリアスは serverpwd という秘密の値を保持します。

2. /opt/wildfly/bin/jboss-cli.sh(...略...)defaultCS:add-alias(alias=httpsTruststorePassword, secret-value="changeit")'

defaultCS という名前のクレデンシャルストアに httpsTruststorePassword というエイリアスを追加しています。このエイリアスは changeit という秘密の値を保持します。

3. /opt/wildfly/bin/jboss-cli.sh(...略...)httpsKS:add(path="keystore/keystore.p12(...略...)store=defaultCS, alias=httpsKeystorePassword},type=PKCS12)'

httpsKS という名前のキーストアを作成し、そのパスを keystore/keystore.p12 に設定しています。このキーストアは defaultCS クレデンシャルストアの httpsKeystorePassword エイリアスを使用します。

4. /opt/wildfly/bin/jboss-cli.sh(...略...)httpsTS:add(path="keystore/truststore.p12"(...略...)store=defaultCS, alias=httpsTruststorePassword},type=PKCS12)'

httpsTS という名前のキーストアを作成し、そのパスを keystore/truststore.p12 に設定しています。このキーストアは defaultCS クレデンシャルストアの httpsTruststorePassword エイリアスを使用します。

5. /opt/wildfly/bin/jboss-cli.sh(...略...)httpsKM:add(key-store=httpsKS,algorithm="SunX509"(...略...)store=defaultCS, alias=httpsKeystorePassword})'

httpsKM という名前のキーマネージャーを作成し、httpsKS キーストアと SunX509 アルゴリズムを使用します。このキーマネージャーは defaultCS クレデンシャルストアの httpsKeystorePassword エイリアスを使用します。

6. /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=elytron/trust-manager=httpsTM:add(key-store=httpsTS)'

httpsTM という名前のトラストマネージャーを作成し、httpsTS キーストアを使用します。

7. /opt/wildfly/bin/jboss-cli.sh(...略...)httpspub:add(key-manager=httpsKM,protocols=["TLSv1.3","TLSv1.2"](...略...):TLS_CHACHA20_POLY1305_SHA256")'

httpspub という名前のサーバーSSLコンテキストを作成します。このコンテキストはhttpsKM キーマネージャーを使用し、特定のプロトコルと暗号スイートを指定します。

8. /opt/wildfly/bin/jboss-cli.sh(...略...)httpspriv:add(key-manager=httpsKM,protocols=["TLSv1.3","TLSv1.2"](...略...)TLS_CHACHA20_POLY1305_SHA256",trust-manager=httpsTM,need-client-auth=true)'

httpspriv という名前のサーバーSSLコンテキストを作成します。このコンテキストはhttpsKM キーマネージャーとhttpsTM トラストマネージャーを使用し、特定のプロトコルと暗号スイートを指定します。さらに、クライアント認証が必要とされています。

【 クライアント認証 】

クライアント認証とは、コンピューターシステムやネットワーク、サービスなどにアクセスする際、アクセス元となるユーザーまたはクライアントがインストール済みのクライアント証明書をアクセス先に提示して、アクセス先が正当なユーザーであることを認証するための仕組みです。

具体的には、クライアント証明書という電子証明書を使用します。この証明書は、認証局によって個人や組織、あるいは端末を認証し発行されます。この証明書がインストールされていない端末からのアクセスは防止できます。


HTTP(S) リスナーの追加

HTTP(S) リスナーの追加を行います。 これらのコマンドにより、HTTP と HTTPS の通信を適切にハンドリングするための設定が行われます。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/http-listener=http:add(socket-binding="http", redirect-socket="httpspriv")'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/https-listener=httpspub:add(socket-binding="httpspub", ssl-context="httpspub", max-parameters=2048)'
# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=undertow/server=default-server/https-listener=httpspriv:add(socket-binding="httpspriv", ssl-context="httpspriv", max-parameters=2048)'
# /opt/wildfly/bin/jboss-cli.sh --connect ':reload'
# /opt/wildfly/bin/jboss-cli.sh --connect ':read-attribute(name=server-state)'

1. /opt/wildfly/bin/jboss-cli.sh(...略...)http-listener=http:add(socket-binding="http", redirect-socket="httpspriv")'

HTTP リスナーを追加しています。socket-binding="http" は、HTTP 通信を待ち受けるソケットを指定しています。また、redirect-socket="httpspriv" は、HTTPS 通信へのリダイレクトを行うソケットを指定しています。

2. /opt/wildfly/bin/jboss-cli.sh(...略...)https-listener=httpspub:add(socket-binding="httpspub", ssl-context="httpspub", max-parameters=2048)'

HTTPS リスナーを追加しています。socket-binding="httpspub" は、HTTPS 通信を待ち受けるソケットを指定しています。ssl-context="httpspub" は、SSL コンテキストを指定しています。これは、SSL 通信の設定(鍵や証明書など)を含んでいます。max-parameters=2048 は、リクエストパラメータの最大数を指定しています。

3. /opt/wildfly/bin/jboss-cli.sh(...略...)https-listener=httpspriv:add(socket-binding="httpspriv", ssl-context="httpspriv", max-parameters=2048)'

このコマンドも HTTPS リスナーを追加していますが、異なるソケットと SSL コンテキストを使用しています。

この後、公式ドキュメントでは、HSM の設定手順の記述がありますが、スキップします。

【 HSM 】

HSM(ハードウェアセキュリティモジュール)は、一般的に電子証明書の暗号鍵と鍵管理に関する国際規格を取得しているデバイスです。

具体的な規格としては、以下のものがあります:

FIPS 140-2:米国の連邦情報処理標準です。暗号モジュールのセキュリティ要件を定めています。

Common Criteria(コモンクライテリア):IT製品のセキュリティ機能を評価するための国際標準です。

これらの規格は、HSMが暗号鍵の生成、保護、管理などのプロセスを安全に行うことを保証します。

また、これらの規格に準拠しているHSMは、テスト、検証、および認定を受けています。これにより、HSMは高度なセキュリティ要件を満たすことができます。


HTTP プロトコルの動作構成

HTTP プロトコルに関するもろもろの設定を行います。


URI エンコーディングを UTF-8 に設定

# /opt/wildfly/bin/jboss-cli.sh --connect '/system-property=org.apache.catalina.connector.URI_ENCODING:add(value="UTF-8")'

クエリストリングのエンコーディングにボディエンコーディングを使用する

# /opt/wildfly/bin/jboss-cli.sh --connect '/system-property=org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value=true)'

エンコードされたスラッシュ(%2Fまたは%5C)を許可

# /opt/wildfly/bin/jboss-cli.sh --connect '/system-property=org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value=true)'

リクエストパラメータの最大数を 2048 に設定

# /opt/wildfly/bin/jboss-cli.sh --connect '/system-property=org.apache.tomcat.util.http.Parameters.MAX_COUNT:add(value=2048)'

バックスラッシュ(\)を許可

# /opt/wildfly/bin/jboss-cli.sh --connect '/system-property=org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value=true)'

Web サービスサブシステムの wsdl-host 属性を’jbossws.undefined.host’に設定
クライアントが Web サービスを呼び出す際に使用する URL を動的に変更するためのものです。これにより、同じ Web サービスが異なるホストや環境で動作している場合でも、正しいエンドポイントがクライアントに通知されます。

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=webservices:write-attribute(name=wsdl-host, value=jbossws.undefined.host)'

Web サービスサブシステムの modify-wsdl-address 属性を’true’に設定

# /opt/wildfly/bin/jboss-cli.sh --connect '/subsystem=webservices:write-attribute(name=modify-wsdl-address, value=true)'
# /opt/wildfly/bin/jboss-cli.sh --connect ':reload'

公式ドキュメントの手順
Galleon Specific Configuration(Galleon 特有の構成)
Optional Configuration(オプションの構成)
は、スキップします。

【 Galleon 】

Galleonは、Java のアプリケーションサーバーである WildFly の機能の一つで、特定のバージョンや設定の WildFly サーバーを簡単に作成、管理するためのツールです。Galleon を使用すると、必要な機能だけを含むカスタムな WildFly サーバーを作成でき、不要なリソースを消費することなく、効率的にアプリケーションを実行できます。また、Galleonはアップデートやパッチの適用もサポートしています。これにより、WildFly サーバーのライフサイクル管理が容易になります。

※今回は使っていません。


Deploying EJBCA

さて、いよいよ、と言うかやっとですが...EJBCA ソースコードを取得して、ビルドに取り掛かります。


ejbca-ce を git clone して、/opt/ejbca/ に配置します。
ここで、ejbca というユーザーを作成して、シェルを bash に変更しています。

# systemctl enable wildfly
# apt install git -y
# useradd -m -U -r -d /opt/ejbca ejbca
# passwd ejbca
ejbca
# usermod -aG sudo ejbca
# su - ejbca -c "chsh -s $(which bash)"
# git clone https://github.com/Keyfactor/ejbca-ce.git
# mv ejbca-ce/* /opt/ejbca/
# rm -rf ejbca-ce

設定を配置します。
ここで、設定は、全てデフォルト(サンプル設定のまま)とします。

# cd /opt/ejbca
# cp conf/ejbca.properties.sample            conf/ejbca.properties
# cp conf/cache.properties.sample            conf/cache.properties
# cp conf/logdevices/log4j.properties.sample conf/logdevices/log4j.properties
# cp conf/cesecore.properties.sample         conf/cesecore.properties
# cp conf/ocsp.properties.sample             conf/ocsp.properties
# cp conf/systemtests.properties.sample      conf/systemtests.properties
# cp conf/custom.properties.sample           conf/custom.properties
# cp conf/mail.properties.sample             conf/mail.properties
# cp conf/catoken.properties.sample          conf/catoken.properties
# cp conf/batchtool.properties.sample        conf/batchtool.properties
# cp conf/jaxws.properties.sample            conf/jaxws.properties
# cp conf/web.properties.sample              conf/web.properties
# cp conf/install.properties.sample          conf/install.properties
# cp conf/va.properties.sample               conf/va.properties
# cp conf/database.properties.sample         conf/database.properties
# cp conf/va-publisher.properties.sample     conf/va-publisher.properties

環境変数をセットします。

# apt install ant -y
# vi /etc/environment
APPSRV_HOME=/opt/wildfly
EJBCA_HOME=/opt/ejbca
JBOSS_HOME=/opt/wildfly
# export APPSRV_HOME=/opt/wildfly
# export EJBCA_HOME=/opt/ejbca
# export JBOSS_HOME=/opt/wildfly

環境変数を適切にセットしていないと、この後の、

ant -q clean deployear にて、以下のエラーになり、ビルドに失敗します。

BUILD FAILED

/opt/ejbca/build.xml:829: The following error occurred while executing this line:

/opt/ejbca/propertyDefaults.xml:226: 'appserver.type' could not be detected or is not configured. Glassfish 3.1, Glassfish 4.0, JBoss 7.1.1, JBoss EAP 6.1, 6.2, 6.3, 6.4, WildFly 8, 9, 10 can be detected. (Is 'appserver.home' configured?)


設定は、全てデフォルト(サンプル設定のまま)としましたが、ホスト名と DB 関連設定だけ変更します。

# vi conf/web.properties
/opt/ejbca/conf/web.properties
httpsserver.hostname=ejbcatest
# vi conf/database.properties
/opt/ejbca/conf/database.properties
database.name=mysql
database.url=jdbc:mysql://127.0.0.1:3306/ejbca
database.driver=org.mariadb.jdbc.Driver

それぞれ、20, 50, 66 行目をコメントアウトする形になります。


ビルドし、デプロイします。

ant -q clean deployear

以下の2つのタスクを実行します:

clean:プロジェクトのビルド時に生成されたファイルを削除します。これにより、次回のビルドがクリーンな状態から始まることを保証します。

deployear:EAR(Enterprise Archive)ファイルをビルドし、それをアプリケーションサーバーにデプロイ(配布)します。これにより、新しいまたは更新されたアプリケーションがサーバー上で利用可能になります。

-q オプションは、「quiet」(静かな)モードを指定します。このモードでは、Ant は必要最低限の情報しか出力しません。これにより、ビルドのログがすっきりとします。


TLS キーストアを WildFly にデプロイする

TLS キーストアを WildFly にデプロイし、/ejbca/adminweb/ へのクライアント認証を可能とします。
公式手順書には、ant deploy-keystore とだけ説明されているのですが、JKS 形式のキーストアを PKCS12 形式のキーストアに変換する必要があります。
これは、2024 年 2 月時点では公式手順書(https://doc.primekey.com/ejbca/ejbca-installation)に書かれていませんでした。
変換する手順は、https://github.com/Keyfactor/ejbca-ce/discussions/46 に書かれていました。

【 JKS, PKCS12 】

JKS (Java KeyStore) は、鍵と証明書を保存するための Java の専用フォーマットです。これは Java アプリケーションでよく使われます。

PKCS12 (Public Key Cryptography Standards #12) は、鍵と証明書を保存するための一般的なフォーマットです。これは多くの異なるタイプのアプリケーションで使われます。

これらのフォーマットは、鍵と証明書を安全に保存するために使われます。これらは、通信を暗号化したり、デジタル署名を検証したりするために必要です。それぞれが異なる目的や要件に合わせて設計されています。

例えば、JKS は Java アプリケーション用に設計されていますが、PKCS12 はより広範な用途に対応しています。また、PKCS12 は JKS よりも新しく、一般的にはより安全とされています。そのため、JKS から PKCS12 への変換が推奨されることがあります。


デプロイし、JKS 形式のキーストアを PKCS12 形式のキーストアに変換します。
なお、このとき、p12/superadmin.p12 が生成されて、クライアント証明書として、ブラウザ(今回は、Ubuntu22 の Firefox)に設定する必要があるため、ユーザーの /home/ 配下にコピーしています。

# cp -p $EJBCA_HOME/p12/tomcat.jks $JBOSS_HOME/standalone/configuration/keystore/keystore.jks
# ant deploy-keystore
# cd /opt/wildfly/standalone/configuration/keystore
# keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12
→serverpwd×3回入力
# keytool -importkeystore -srckeystore truststore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore truststore.p12
→changeit×3回入力
# cd /opt/ejbca
# cp p12/superadmin.p12 /home/admin/
# chown admin /home/admin/superadmin.p12

1. keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12

JKS 形式のキーストア(keystore.jks) を PKCS12 形式のキーストア(keystore.p12) に変換します。

2. keytool -importkeystore -srckeystore truststore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore truststore.p12

JKS 形式のトラストストア(truststore.jks)を PKCS12 形式のトラストストア(truststore.p12) に変換します。

クライアント証明書インポート

Ubuntu22 の Firefox にクライアント証明書をインポートします。
なお、これを行わないと、Web 管理画面(/ejbca/adminweb/)にアクセスしたときに、以下のエラーになります。
安全な接続ができませんでした
ejbcatset:8443 への接続中にエラーが発生しました。SSL peer cannot verify your certificate.
エラーコード: SSL_ERROR_BAD_CERT_ALERT
受信したデータの真正性を検証できなかったため、このページは表示できませんでした。

安全な接続ができませんでした


Firefox を起動して、設定 をクリックします。

Firefoxハンバーガーメニュー


Firefox設定


プライバシーとセキュリティ証明書を表示 をクリックします。 Firefox プライバシーとセキュリティ 証明書を表示


あなたの証明書 タブをクリックして、インポート をクリックします。 あなたの証明書 インポート


ホーム(/home/admin)/superadmin.p12 を選択します。
この時、パスワードを聞かれますが、ejbca を入力します。 superadmin.p12 を選択


Windows の場合、Edge や Chrome は、OS の機能で証明書が管理されます。一方、Firefox の場合、Windows であっても、ブラウザ独自に証明書を管理します。そのため、公式ドキュメントでも Firefox の利用が推奨されていました。


Web 管理画面

# systemctl restart wildfly

として、
URL = https://ejbcatest:8443/ejbca/adminweb
または、
URL = https://localhost:8443/ejbca/adminweb
でアクセスします。

ejbcatest は今回の手順の場合です。

EJBCA Web 管理画面


ヨシっ!

loading...