IIMを使用してIHSとWAS Libertyをインストールし、Pluginで接続してみる

# 0.はじめに

久ぶりにIBM製品の紹介です。
今回はIHSとWAS Libertyを使用してWEB/APサーバを構築し、ブラウザから443ポート経由でAPの画面を表示するのが目標です。
IIM、IHS、Libertyのインストール方法や役立つコマンドや機能もナレッジとして紹介出来たらと思います。

# 1.ダウンロード

まずはIBMのInstallation Manager(略してIIM)をダウンロードします。
IIMは[こちら][iimDownloadLink]のサイトからダウンロード可能です。
最新のIIMのバージョンが`1.10.1.0`だったため、こちらを使用していきます。

# 2. IIMインストール

## 2-1.OS情報

今回はVMWare上に構築した、RHEL9を使用しています。

```bash
# cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.5 (Plow)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="9.5"
# 以下省略
```

## 2-2. ファイル解凍

先ほどダウンロードしたIIMのインストーラはzip形式のため解凍します。

```bash:
# ls -l agent.installer.linux.gtk.x86_64_1.10.1000.20241118_1329.zip
-rw-r--r--. 1 root root 149992646 12月 27 09:09 agent.installer.linux.gtk.x86_64_1.10.1000.20241118_1329.zip

# unzip -q agent.installer.linux.gtk.x86_64_1.10.1000.20241118_1329.zip

# ls -la
合計 147124
drwxr-xr-x. 11 root root      4096 12月 28 23:17 .
drwxr-xr-x.  4 root root        27 12月 28 22:40 ..
drwxr-xr-x.  2 root root        64 12月 28 23:17 META-INF
drwxr-xr-x.  2 root root       130 11月 18 13:41 Offerings
-rw-r--r--.  1 root root 149992646 12月 27 09:09 agent.installer.linux.gtk.x86_64_1.10.1000.20241118_1329.zip
-rwxr-xr-x.  1 root root      4642 11月 18 13:41 con-disk-set-inst.sh
drwxr-xr-x.  3 root root        50 11月 18 13:41 configuration
drwxr-xr-x. 13 root root       122 11月 18 13:41 documentation
-rwxr-xr-x.  1 root root     80385 11月 23  2016 groupinst
-rwxr-xr-x.  1 root root       311 11月 18 13:41 groupinst.ini
-rwxr-xr-x.  1 root root     80385 11月 23  2016 groupinstc
-rwxr-xr-x.  1 root root       356 11月 18 13:41 groupinstc.ini
-rwxr-xr-x.  1 root root     80385 11月 23  2016 install
-rwxr-xr-x.  1 root root       309 11月 18 13:41 install.ini
-rwxr-xr-x.  1 root root       266 11月 18 13:41 install.xml
-rwxr-xr-x.  1 root root     80385 11月 23  2016 installc
-rwxr-xr-x.  1 root root       354 11月 18 13:41 installc.ini
drwxr-xr-x.  3 root root        17 11月 18 13:41 jre_11.0.23.20240702
drwxr-xr-x.  2 root root      4096 11月 18 13:41 license
drwxr-xr-x.  2 root root      4096 11月 18 13:41 native
drwxr-xr-x. 10 root root     65536 11月 18 13:41 plugins
-rwxr-xr-x.  1 root root      9909  5月 22  2024 readme.html
-rwxr-xr-x.  1 root root       278 11月 18 13:41 repository.config
-rwxr-xr-x.  1 root root     10718 11月 18 13:41 repository.xml
-rwxr-xr-x.  1 root root       360 11月 18 13:41 silent-install.ini
drwxr-xr-x.  2 root root        70 11月 18 13:41 tools
-rwxr-xr-x.  1 root root       367 11月 18 13:41 user-silent-install.ini
-rwxr-xr-x.  1 root root     80385 11月 23  2016 userinst
-rwxr-xr-x.  1 root root       313 11月 18 13:41 userinst.ini
-rwxr-xr-x.  1 root root     80385 11月 23  2016 userinstc
-rwxr-xr-x.  1 root root       358 11月 18 13:41 userinstc.ini

```

## 2-3. インストール

インストールにはGUIでインストールする`install`コマンドと、コマンドでサイレントインストールする`installc`の2種類があります。

今回はサイレントかつパスなども特に変更せずそのままインストールしようかと思います。
デフォルトのインストールパスは`/opt/IBM/InstallationManager`となります。

もしインストールパスを変更したい場合は、`-installationDirectory`オプションでインストールディレクトリを変更できます。
例として`/usr/IBM/InstallationManager`にインストールしたい場合は、`-installationDirectory /usr/IBM/InstallationManager`のようなイメージです。

```bash:
# ./installc -acceptLicense -showProgress
                 25%                50%                75%                100%
------------------|------------------|------------------|------------------|
............................................................................
/opt/IBM/InstallationManager/eclipse ディレクトリーに com.ibm.cic.agent_1.10.1000.20241118_1329 がインストールされました。
```
インストールが問題なければ上記のようなメッセージが表示されます。
インストールパス配下に`tools`というディレクトリがあるため、移動しインストールしたプログラムの一覧を確認します。

```bash:
# cd /opt/IBM/InstallationManager/eclipse/tools;pwd
/opt/IBM/InstallationManager/eclipse/tools

# ls -l
合計 168
-rwxr-xr-x. 1 root root 80385 12月 28 23:31 imcl
-rw-r--r--. 1 root root   509 12月 28 23:31 imcl.ini
-rwxr-xr-x. 1 root root 80385 12月 28 23:31 imutilsc
-rw-r--r--. 1 root root   513 12月 28 23:31 imutilsc.ini

# ./imcl listInstalledPackages -verbose
[共有]
共有リソース・ディレクトリー:

[パッケージ・グループ]
名前: IBM Installation Manager
インストール・ディレクトリー: /opt/IBM/InstallationManager/eclipse
翻訳: ドイツ語 (de), ノルウェー語 (no), フィンランド語 (fi), ロシア語 (ru), クロアチア語 (hr), ポルトガル語 (ブラジル) (pt_BR), フランス語 (fr), ハンガリー語 (hu), 中国語 (繁体字) (zh_TW), 中国語 (繁体字) (zh_HK), スロバキア語 (sk), スロベニア語 (sl), スウェーデン語 (sv), 韓国語 (ko), ギリシャ語 (el), 英語 (en), イタリア語 (it), ヘブライ語 (iw), 中国語 (簡体字) (zh), スペイン語 (es), チェコ語 (cs), アラビア語 (ar), タイ語 (th), 日本語 (ja), ポーランド語 (pl), デンマーク語 (da), オランダ語 (nl), トルコ語 (tr)
アーキテクチャー 64 ビット

[パッケージ]
名前: IBM Installation Manager (com.ibm.cic.agent)
バージョン: 1.10.1 (1.10.1000.20241118_1329)
リポジトリー: /work/iim
フィーチャー:
    なし
フィックス:
    なし
ロールバック・バージョン:
    なし
```

問題なくIIMが表示されることを確認できました。

## 2-4. 資格情報の保存

本作業は必須ではないですが、毎回パスワードの入力が大変なため資格情報を補完するファイルの作成を行います。
`imutilsc saveCredential`コマンドで資格情報をファイルに保存することができます。
各オプションの内容は以下の通りです。

- `-url`：リポジトリのURLを入力します。今回はIBMのドキュメントに記載の複合リポジトリのURLを設定します。
- `-userName`：自身のIBMアカウントのIDを入力
- `-userPassword`：自身のIBMアカウントのパスワードを入力
- `-secureStorageFile`：資格情報を保存するためのファイルパスを入力

以下のオプションはどちらか1つとなります。予め資格情報ファイルにかけるパスワードは考えておきましょう。
- `-masterPasswordFile`：資格情報を保護するためのパスワードの外部ファイル化。`./master_password_file.txt`のような形でファイルを作成し、中身にパスワードを入力しておきましょう。
- `-password`：資格情報を保護するためのパスワードをコマンドで直接指定できます。セキュリティなど気にしなくてよいのであればこちらで大丈夫でしょう。

```bash:
# echo "Password" > master_password_file.txt

# ./imutilsc saveCredential \
  -url https://www.ibm.com/software/repositorymanager/V9WASBase \
  -userName test@test.com \
  -userPassword Password \
  -secureStorageFile ./credentials.stg \
  -masterPasswordFile ./master_password_file.txt
資格情報がセキュア・ストレージ・ファイルに正常に保存されました。

# ls -l
合計 176
-rw-r--r--. 1 root root   956 12月 29 00:02 credentials.stg
-rwxr-xr-x. 1 root root 80385 12月 28 23:31 imcl
-rw-r--r--. 1 root root   509 12月 28 23:31 imcl.ini
-rwxr-xr-x. 1 root root 80385 12月 28 23:31 imutilsc
-rw-r--r--. 1 root root   513 12月 28 23:31 imutilsc.ini
-rw-r--r--. 1 root root    13 12月 29 00:01 master_password_file.txt
```

以上でIIMの設定、準備周りは完了です。

# 3. IHSインストール・設定

## 3-1. インストールリストの確認

まずはインストールするリポジトリから対象を出力しましょう。
`imcl listAvailablePackages`コマンドに先ほど設定した資格情報のファイルパスなどを渡しましょう。

```bash:
# _REPO_URL=https://www.ibm.com/software/repositorymanager/V9WASBase
# ./imcl listAvailablePackages \
   -repositories ${_REPO_URL} \
   -secureStorageFile ./credentials.stg \
   -masterPasswordFile ./master_password_file.txt

com.ibm.java.jdk.v8_8.0.3000.20160526_1317
com.ibm.java.jdk.v8_8.0.3010.20160830_1018
com.ibm.java.jdk.v8_8.0.3011.20160909_1138
com.ibm.java.jdk.v8_8.0.3012.20160926_0717
com.ibm.java.jdk.v8_8.0.3020.20161207_0843
com.ibm.java.jdk.v8_8.0.3021.20161207_0751
com.ibm.java.jdk.v8_8.0.3022.20161219_1105
# 省略
com.ibm.java.jdk.v8_8.0.8035.20241125_0150
# 省略
com.ibm.websphere.IHS.v90_9.0.0.20160526_1854
com.ibm.websphere.IHS.v90_9.0.1.20160906_0049
# 省略
com.ibm.websphere.IHS.v90_9.0.5020.20240605_1405
```

非常に出力が長いですが、ここで注目する所は、`com.ibm.java.jdk.v8`や`com.ibm.websphere.IHS.v90`といった`_`で区切られた手前の場所です。
ここがインストールするべき対象のパッケージ名となります。

このパッケージ名を指定してインストールを行います。
なお、IHS、Plugin、Libertyなど全てIBM Javaが必須ですので一緒にインストールを行います。

```bash:
# ./imcl install com.ibm.websphere.IHS.v90 com.ibm.java.jdk.v8 \
  -repositories ${_REPO_URL} \
  -secureStorageFile ./credentials.stg \
  -masterPasswordFile ./master_password_file.txt \
  -installFixes all \
  -acceptLicense \
  -showProgress
                 25%                50%                75%                100%
------------------|------------------|------------------|------------------|
............................................................................
/opt/IBM/HTTPServer ディレクトリーに com.ibm.websphere.IHS.v90_9.0.5020.20240605_1405 がインストールされました。
/opt/IBM/HTTPServer ディレクトリーに com.ibm.java.jdk.v8_8.0.8035.20241125_0150 がインストールされました。
```
IIM上からもインストールの確認ができました。

```bash:
# ./imcl listInstalledPackages
com.ibm.cic.agent_1.10.1000.20241118_1329
com.ibm.java.jdk.v8_8.0.8035.20241125_0150
com.ibm.websphere.IHS.v90_9.0.5020.20240605_1405
```

IHSやIBM Javaのバージョンも問題なさそうです。
```bash:
# /opt/IBM/HTTPServer/bin/apachectl -v
Server version: IBM_HTTP_Server/9.0.5.20 (Unix)
Server built:   Apr 18 2024 10:53:25
```

```bash:
# /opt/IBM/HTTPServer/java/8.0/bin/java -version
java version "1.8.0_431"
Java(TM) SE Runtime Environment (build 8.0.8.35 - pxa6480sr8fp35-20241105_01(SR8 FP35))
IBM J9 VM (build 2.9, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20240926_78736 (JIT enabled, AOT enabled)
OpenJ9   - 8ce0d57a2f6
OMR      - 8eaf1a20f
IBM      - dd9cff8)
JCL - 20241016_01 based on Oracle jdk8u431-b10
```

## 3-2. IHSの起動停止

IHSのインストールが完了したので、早速試しに起動停止してみたいと思います。
今回は全てrootユーザで実行するので、rootユーザの`~/.bash_profile`に以下の情報を追記します。

```bash:
export PATH=/opt/IBM/HTTPServer/bin:/opt/IBM/HTTPServer/gsk8/bin:$PATH
export LD_LIBRARY_PATH=/opt/IBM/HTTPServer/gsk8/lib64:/opt/IBM/HTTPServer/lib:$LD_LIBRARY_PATH
```
## 3-2-1. IHSの起動

起動停止ともに単純ですが、以下のコマンドを実行するだけです。

```bash:
# apachectl start
```
psコマンドで確認すると起動しています。

```bash:
# ps -ef | grep http
root       51100       1  0 00:34 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
nobody     51101   51100  0 00:34 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
nobody     51102   51100  0 00:34 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
```
`http://ipアドレス`にアクセスすると初期ページが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/684cb104-1ce1-474a-7eee-33e4a1c259de.png)


## 3-2-2. IHSの停止

停止はオプションを`stop`に変更するだけです。

```bash:
# apachectl stop
```
## 3-3. IHSのSSL化
### 3-3-1. 鍵の取得
私の記事では毎度お馴染みですが、`Let's Encrypt`を使用してIHSをSSL化したいと思います。
まずは鍵ファイル格納用のディレクトを作成します。

```bash:
# cd /opt/IBM/HTTPServer;pwd
/opt/IBM/HTTPServer
# mkdir ssl
```

作成したsslディレクトリには以下のファイルを格納しておきましょう。
- `privkey.pem`：`Let's Encrypt`の秘密鍵
- `cert.pem`：`Let's Encrypt`のSSL証明書
- `chain.pem`：`Let's Encrypt`の中間証明書
- `ca.cer`：`Let's Encrypt`のルート証明書を`ca.cer`で保存(ISRG Root X1は[こちら][root]で保存可能)

### 3-3-2. 鍵の作成
現在の`ssl`ディレクトリ配下は以下のようなファイル構成になっていると思います。

```bash:
# ls -la
合計 20
drwxr-xr-x.  2 root root   72 12月 29 00:57 .
drwxr-xr-x. 26 root root 4096 12月 29 00:41 ..
-rw-r--r--.  1 root root 1970 12月 29 00:45 ca.cer
-rw-r--r--.  1 root root 1306 12月  1 23:23 cert.pem
-rw-r--r--.  1 root root 1566 12月  1 23:23 chain.pem
-rw-r--r--.  1 root root  241 12月  1 23:23 privkey.pem
```

早速鍵を作成していきます。
まずは`キーストアファイル`と呼ばれる鍵を入れる箱を作成します。
パスワードの箇所は任意の値に変更してください。

オプションを1か所だけ解説すると、`-stash`とは`key.kdb`のキーファイルを開くためのパスワードが暗号化された形式で格納されるファイル作成するオプションになります。

```bash:キーストアファイル作成
# gsk8capicmd_64 -keydb -create -db key.kdb -pw "Password" -stash
```

```bash:
# ls -l key.*
-rw-------. 1 root root 144 12月 29 01:00 key.crl
-rw-------. 1 root root 144 12月 29 01:00 key.kdb
-rw-------. 1 root root 144 12月 29 01:00 key.rdb
-rw-------. 1 root root 193 12月 29 01:00 key.sth
```

続いて各証明書を`キーストアファイル`に格納していきます。

```bash:ルート証明書のインポート
# gsk8capicmd_64 -cert -add -db key.kdb -stashed -file ca.cer
```

```bash:中間証明書のインポート
# gsk8capicmd_64 -cert -add -db key.kdb -stashed -file chain.pem
```

秘密鍵はそのままインポートすることができない(確か)ため、一度サーバ証明書と結合させ、`pfx`形式にしてからインポートを行います。

```bash:サーバー証明書と秘密鍵の結合
# openssl pkcs12 -password pass:Password -export -inkey privkey.pem -in cert.pem -out server.pfx
```

```bash:サーバー証明書と秘密鍵のインポート
# gsk8capicmd_64 -cert -import -db server.pfx -pw Password -target key.kdb -stashed
```

一度ここで鍵の中身を確認してみたいと思います。
```bash:
# gsk8capicmd_64 -cert -list -db key.kdb -stashed
証明書が見つかりました
* デフォルト, - 個人, ! トラステッド, # secret key
!       "CN=ISRG Root X1,O=Internet Security Research Group,C=US"
!       "CN=E5,O=Let's Encrypt,C=US"
-       CN=*.motuni.work
```

```bash:
# gsk8capicmd_64 -cert -details -db key.kdb -stashed -label "CN=*.motuni.work"
ラベル : CN=*.motuni.work
鍵サイズ : 256
バージョン : X509 V3
シリアル : 0338ea5602b51ddbbb286ab6eb654c37dadd
発行者 : "CN=E5,O=Let's Encrypt,C=US"
所有者 : CN=*.motuni.work
次の日付以降 : 2024年12月1日 22:25:10:JST

次の日付以前 : 2025年3月1日 22:25:09:JST
# 以下省略
```

ちゃんと表示できており問題ないですが、せっかくなのでラベル等も付与してわかりやすくしたいと思います。

```bash:
# gsk8capicmd_64 -cert -rename -db key.kdb -stashed -label "CN=*.motuni.work" -new_label ssl-cert-202412
```

```bash:
# gsk8capicmd_64 -cert -setdefault -db key.kdb -stashed -label ssl-cert-202412
```
無事ラベル名を変更し、デフォルトの証明書を変更できました。

```bash:
# gsk8capicmd_64 -cert -list -db key.kdb -stashed
証明書が見つかりました
* デフォルト, - 個人, ! トラステッド, # secret key
!       "CN=ISRG Root X1,O=Internet Security Research Group,C=US"
!       "CN=E5,O=Let's Encrypt,C=US"
*-      ssl-cert-202412
```
### 3-3-3. httpd.confの修正
最後に`httpd.conf`へ今作成したSSLの鍵情報の設定を行いたいと思います。
`httpd.conf`は以下にあります。

```bash:
# cd /opt/IBM/HTTPServer/conf;pwd
/opt/IBM/HTTPServer/conf

# ls -la httpd.conf
-rwxr-xr-x. 1 root root 30480 12月 29 00:19 httpd.conf
```
下記設定を`httpd.conf`に追加後、IHSを再起動します。

```diff_apache:httpd.conf
+ LoadModule rewrite_module modules/mod_rewrite.so

+ LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
+ Listen 443
  #SSLCheckCertificateExpiration 30
+ <VirtualHost *:443>
   #ServerName VM-RHEL01
+  SSLEnable
+  SSLServerCert ssl-cert-202412
   #Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
+ </VirtualHost>
+ KeyFile /opt/IBM/HTTPServer/ssl/key.kdb
+ SSLDisable
```
ドメインではなくIPアクセスなので証明書エラーになっていますが、ちゃんとSSL通信でアクセスできていることが確認できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/f119e950-fdef-22ce-b4b7-57542cacb717.png)

# 4. Pluginのインストール

インストール前にここでいうプラグインとはなんぞやという方もいるので少しだけ解説します。
名称は`IBM HTTP Server for WebSphere Application Server 用プラグイン`といい、現場では`WebSphere Plugin`と呼ばれたりしています。

IHS と WASの間でリクエストのルーティングを管理するためのモジュールという役割を担っているのが本プラグインとなります。
ちなみにですが、IHSやプラグインはあくまでWASのおまけという扱いのため単品でのサポートはしておらず、あくまでWASとセットで使うことが前提のMWとなっています。

## 4-1. インストール

インストールの流れはIHSと全く同じです。
`imcl listAvailablePackages`コマンドで同様にパッケージ名を確認します。

```bash:
# ./imcl listAvailablePackages \
   -repositories ${_REPO_URL} \
   -secureStorageFile ./credentials.stg \
   -masterPasswordFile ./master_password_file.txt

com.ibm.websphere.PLG.v90_9.0.0.20160526_1854
com.ibm.websphere.PLG.v90_9.0.1.20160906_0049
com.ibm.websphere.PLG.v90_9.0.2.20161108_1719
# 省略
com.ibm.websphere.PLG.v90_9.0.5020.20240605_1405
```

こちらは、`com.ibm.websphere.PLG.v90`がパッケージ名になります。
IHS同様にIBM Javaが必須ですので一緒にインストールを行います。

```bash:
# ./imcl install com.ibm.websphere.PLG.v90 com.ibm.java.jdk.v8 \
  -repositories ${_REPO_URL} \
  -secureStorageFile ./credentials.stg \
  -masterPasswordFile ./master_password_file.txt \
  -installFixes all \
  -acceptLicense \
  -showProgress
                 25%                50%                75%                100%
------------------|------------------|------------------|------------------|
............................................................................
/opt/IBM/WebSphere/Plugins ディレクトリーに com.ibm.websphere.PLG.v90_9.0.5020.20240605_1405 がインストールされました。
/opt/IBM/WebSphere/Plugins ディレクトリーに com.ibm.java.jdk.v8_8.0.8035.20241125_0150 がインストールされました。
警告: 8.5.5.24/9.0.5.16、それ以降の既知の副次的な悪影響を確認: "PH48747: 「 WebSphere ウェブサーバープラグインの証明書ホスト名への変更」 (https://www.ibm.com/support/pages/node/6982543)
```

IIM上からも確認をします。

```bash:
# ./imcl listInstalledPackages -long
/opt/IBM/InstallationManager/eclipse : com.ibm.cic.agent_1.10.1000.20241118_1329 : IBM Installation Manager : 1.10.1
/opt/IBM/HTTPServer : com.ibm.java.jdk.v8_8.0.8035.20241125_0150 : IBM SDK, Java Technology Edition, Version 8 : 8.0.8.35
/opt/IBM/HTTPServer : com.ibm.websphere.IHS.v90_9.0.5020.20240605_1405 : IBM HTTP Server for WebSphere Application Server : 9.0.5.20
/opt/IBM/WebSphere/Plugins : com.ibm.java.jdk.v8_8.0.8035.20241125_0150 : IBM SDK, Java Technology Edition, Version 8 : 8.0.8.35
/opt/IBM/WebSphere/Plugins : com.ibm.websphere.PLG.v90_9.0.5020.20240605_1405 : Web Server Plug-ins for IBM WebSphere Application Server : 9.0.5.20
```

プラグイン側の設定はLibertyインストール後に行うため一旦作業を終了します。

# 5. WAS Libertyのインストール
## 5-1. インストール

流れはLibertyもIHSなどと全く同じです。
`imcl listAvailablePackages`コマンドで同様にパッケージ名を確認します。

WASはトライアル版も含め様々な種類があります。
詳細は[こちら][Liberty]の記事に解説があるので見てみてください。

今回は`Base`を使用していきたいと思います。

```bash:
# ./imcl listAvailablePackages \
   -repositories ${_REPO_URL} \
   -secureStorageFile ./credentials.stg \
   -masterPasswordFile ./master_password_file.txt

com.ibm.websphere.liberty.BASE_16.0.2.20160526_2338
com.ibm.websphere.liberty.BASE_16.0.3.20160831_1733
com.ibm.websphere.liberty.BASE_16.0.4.20161113_0220
# 省略
com.ibm.websphere.liberty.BASE_24.0.6.20240603_2002
```

`com.ibm.websphere.liberty.BASE`のパッケージ名の物を使用します。
今回も`IBM Java`が必須ですのでインストールを行いますが、
インストールを実行するとエラーとなりました。
書いてある通りなのですが、IIM側で`IBM Java`が多数インストールされており困惑している模様です。

```bash:
# ./imcl install com.ibm.websphere.liberty.BASE com.ibm.java.jdk.v8 \
  -repositories ${_REPO_URL} \
  -secureStorageFile ./credentials.stg \
  -masterPasswordFile ./master_password_file.txt \
  -installFixes all \
  -acceptLicense \
  -showProgress
                 25%                50%                75%                100%
------------------|------------------|------------------|------------------|
............................................................................
CRIMA1105E エラー: com.ibm.java.jdk.v8 は複数のインストール・ディレクトリーにインストールされています。 新規ディレクトリーまたは以下のいずれかのディレクトリーとともに、-installationDirectory オプションを指定してください:
/opt/IBM/HTTPServer
/opt/IBM/WebSphere/Plugins
```

`-installationDirectory `オプションを使用し、明示的にパスの指定をして再度挑戦します。

```bash:
# ./imcl install com.ibm.websphere.liberty.BASE com.ibm.java.jdk.v8 \
  -repositories ${_REPO_URL} \
  -secureStorageFile ./credentials.stg \
  -masterPasswordFile ./master_password_file.txt \
  -installFixes all \
  -installationDirectory /opt/IBM/wlp \
  -acceptLicense \
  -showProgress
                 25%                50%                75%                100%
------------------|------------------|------------------|------------------|
............................................................................
/opt/IBM/wlp ディレクトリーに com.ibm.websphere.liberty.BASE_24.0.6.20240603_2002 がインストールされました。
/opt/IBM/wlp ディレクトリーに com.ibm.java.jdk.v8_8.0.8035.20241125_0150 がインストールされました。
警告: WebSphere Liberty での Java SE 7 および Java SE 7.1 の使用のサポートは終了しました。 Liberty カーネルは Java SE 7 および Java SE 7.1 で実行できなくなりました。
```

最後にIIM上からも確認をします。
こちらも想定通りです。

```bash:
# ./imcl listInstalledPackages -long
/opt/IBM/InstallationManager/eclipse : com.ibm.cic.agent_1.10.1000.20241118_1329 : IBM Installation Manager : 1.10.1
/opt/IBM/HTTPServer : com.ibm.java.jdk.v8_8.0.8035.20241125_0150 : IBM SDK, Java Technology Edition, Version 8 : 8.0.8.35
/opt/IBM/HTTPServer : com.ibm.websphere.IHS.v90_9.0.5020.20240605_1405 : IBM HTTP Server for WebSphere Application Server : 9.0.5.20
/opt/IBM/WebSphere/Plugins : com.ibm.java.jdk.v8_8.0.8035.20241125_0150 : IBM SDK, Java Technology Edition, Version 8 : 8.0.8.35
/opt/IBM/WebSphere/Plugins : com.ibm.websphere.PLG.v90_9.0.5020.20240605_1405 : Web Server Plug-ins for IBM WebSphere Application Server : 9.0.5.20
/opt/IBM/wlp : com.ibm.java.jdk.v8_8.0.8035.20241125_0150 : IBM SDK, Java Technology Edition, Version 8 : 8.0.8.35
/opt/IBM/wlp : com.ibm.websphere.liberty.BASE_24.0.6.20240603_2002 : IBM WebSphere Application Server Liberty : 24.0.0.6
```

## 5-2. Libertyサーバーの作成

まずはLibertyのサーバを作成します。
IHS同様にrootユーザの`~/.bash_profile`に以下の情報を追記します。
(変数の値はIHSと一緒にしても分けてもどちらでも良いです)

```bash:
export JAVA_HOME=/opt/IBM/wlp/java/8.0
export PATH=/opt/IBM/wlp/bin:/opt/IBM/wlp/java/8.0/bin:/opt/IBM/wlp/java/8.0/jre/bin:$PATH
```

続いて`server`コマンドでサーバを作成していきます。
今回は`test01`という名称で作成します。

```bash:
# server create test01

サーバー test01 が作成されました。
```

## 5-3. Libertyの起動停止
### 5-3-1. Libertyの起動

起動は`server start`を使用していきます。

```bash:
# server start test01

サーバー test01 を始動中です。
サーバー test01 がプロセス ID 54012 で始動しました。
```

起動状態は`server status`で確認できます。

```bash:
# server status test01

サーバー test01 はプロセス ID 54012 で稼働中です。
```

psコマンドで確認するとjavaのプロセスが起動しています。

```bash:
# ps -ef | grep java
root       54012       1 11 19:21 pts/0    00:00:22 /opt/IBM/wlp/java/8.0/jre/bin/java -javaagent:/opt/IBM/wlp/bin/tools/ws-javaagent.jar -Djava.awt.headless=true -Djdk.attach.allowAttachSelf=true -jar /opt/IBM/wlp/bin/tools/ws-server.jar test01
```

### 5-3-2. Libertyの停止

停止は`server stop`で行えます。

```bash:
# server stop test01

サーバー test01 を停止中です。
サーバー test01 は停止しました。
```

起動状態を確認すると停止しています。

```bash:
# server status test01

サーバー test01 は稼働していません。
```

## 5-4. サンプルアプリの起動

Libertyの動作確認のために、サンプルのwarファイルをデプロイしてみます。
[こちら][tomcat]のTomcatのサイトで配布されている`sample.war`をデプロイしてみたいと思います。

まずはダウンロードした`sample.war`を`/opt/IBM/wlp/usr/servers/test01/apps`へ格納します。

```bash:
# ls -l /opt/IBM/wlp/usr/servers/test01/apps/
合計 8
-rw-r--r--. 1 root root 4606 12月 29 19:31 sample.war
```

続いてアプリを起動させるための設定を、`/opt/IBM/wlp/usr/servers/test01`の`server.xml`にしていきます。
`sample.war`に直接関係ない設定もあり、後ほど紹介する`Admin Center`という機能のための設定もあります。

今回注目するべき箇所は、`<webApplication contextRoot="SAMPLE" location="sample.war" />`です。
まず、`webApplication`ですが、先ほどアップロードした`sample.war`が格納された`/opt/IBM/wlp/usr/servers/test01/apps`配下のアプリケーションをデプロイするための設定です。
`location="sample.war"`では対象のアプリのwarファイル名を指定します。
最後に`contextRoot="SAMPLE"`ですが、`sample.war`サーバーでホストされる際にアクセスするためのURLパスを指定します。
この場合、`http://ipアドレス:9080/SAMPLE`にアクセスすると、`sample.war`のWebコンテンツが表示されることになります。


```diff_xml:server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>webProfile-8.0</feature>
        <feature>adminCenter-1.0</feature>
        <feature>websocket-1.1</feature>
    </featureManager>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" >
        <accessLogging
            filePath="${server.output.dir}/logs/access.log"
            logFormat='"%h %u %{t}W "%r" %s %b"'
            maxFileSize="500"
            maxFiles="10"
        />
    </httpEndpoint>

    <virtualHost id="default_host">
        <hostAlias>*:80</hostAlias>
        <hostAlias>*:443</hostAlias>
        <hostAlias>*:9080</hostAlias>
        <hostAlias>*:9443</hostAlias>
    </virtualHost>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <webApplication contextRoot="SAMPLE" location="sample.war" />

    <basicRegistry>
       <user name="admin" password="admin" />
    </basicRegistry>
    
    <administrator-role>
       <user>admin</user>
    </administrator-role>

    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>

</server>
```

上記の設定を導入後Libertyを再起動します。
`/opt/IBM/wlp/usr/servers/test01/logs/messages.log`を確認すると、以下のような出力が存在しているかと思います。
それぞれ`sample.war`が正常にデプロイできたこと、test01が正常に起動できたことがログから読み取れます。
もし起動しない場合はこのログなどに色々情報が出てくるので確認してみてください。

```text:messages.log
[24/12/29 19:43:51:332 JST] 00000035 com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://vm-rhel01:9080/SAMPLE/
[24/12/29 19:43:52:018 JST] 0000002d com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0011I: test01 サーバーは、Smarter Planet に対応する準備ができました。test01 サーバーは 2.960 秒で始動しました。
```

`http://ipアドレス:9080`にアクセスするとLibertyの初期ページが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/340b67be-2ee0-0701-4640-a7a816a6bb49.png)

また、`http://ipアドレス:9080/SAMPLE`にアクセスするとアプリのページが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/6e961556-01c3-ab1d-a477-c38cd9d8ceac.png)

## 5-5. Admin Centerへのアクセスと使い方
### 5-5-1. server.xmlの修正

先ほど少し触れた`Admin Center`について解説します。
`Admin Center`とはLibertyをGUI上でのアプリの操作、定義の修正などが行える拡張機能になります。
`Admin Center`のより詳細な設定方法などは[こちら][admincernter]をご確認ください。

`Admin Center`を有効化するにはいくつか設定があります。
1つ目は、`adminCenter-1.0`および`websocket-1.1`のfeatureを有効にすること

```xml:server.xml
    <featureManager>
        <feature>adminCenter-1.0</feature>
        <feature>websocket-1.1</feature>
    </featureManager>
```

2つ目は、`httpsPort`ポートを有効にすること

```xml:server.xml
    <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" >
    </httpEndpoint>
```

3つ目は、`administrator`権限を持つユーザを作成することです。
今回はユーザ名、パスワードともに`admin`で作成します。

```xml:server.xml
    <basicRegistry>
       <user name="admin" password="admin" />
    </basicRegistry>
    
    <administrator-role>
       <user>admin</user>
    </administrator-role>
```

4つ目は必須ではないですが、この設定を有効化しておくと後ほど`Admin Center`から`server.xml`の修正をすることができます。(ファイルへの書き込み権限アクセスの追加)

```xml:server.xml
    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>
```

上記設定が有効になっている状態であれば、`messages.log`に以下の表示があるかと思います。

```text:messages.log
[24/12/29 20:02:34:337 JST] 0000003b com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://vm-rhel01:9080/adminCenter/
[24/12/29 20:02:35:352 JST] 0000002d com.ibm.ws.tcpchannel.internal.TCPPort                       I CWWKO0219I: TCP チャネル defaultHttpEndpoint-ssl が開始され、現在、ホスト *  (IPv6)、ポート 9443 の要求を listen しています。
[24/12/29 20:02:35:356 JST] 0000002d com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[adminCenter-1.0, appSecurity-2.0, appSecurity-3.0, beanValidation-2.0, cdi-2.0, distributedMap-1.0, ejbLite-3.2, el-3.0, jaspic-1.1, jaxrs-2.1, jaxrsClient-2.1, jdbc-4.2, jndi-1.0, jpa-2.2, jpaContainer-2.2, jsf-2.3, json-1.0, jsonb-1.0, jsonp-1.1, jsp-2.3, managedBeans-1.0, restConnector-2.0, servlet-4.0, ssl-1.0, webProfile-8.0, websocket-1.1]。
```

### 5-5-2. Admin Centerへのアクセス

エラーが出ていない場合、`https://ipアドレス:9443/adminCenter`にアクセスするとアプリのページが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/5dca16d4-407c-2436-7bd1-ba95923ab0f5.png)

先ほど設定したユーザ名、パスワードでログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/77d519be-1bc7-4951-02cc-ad8a8838a3e3.png)

### 5-5-3. Exploreによるアプリの起動停止とモニタリング

トップページの`Explore`へアクセスします。

左の`アプリケーション`タブでは起動中のアプリを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/82c955d9-b960-a9be-c94a-64f7bde62a7c.png)

下向きのマークをクリックするとアプリの起動停止、再起動などが行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/ccb9c611-dd49-e0e8-52db-86fbfea445de.png)

実際に停止すると以下のように確認できます。
ちなみにここで注意するポイントとして、アプリの停止=Libertyの停止ではない所です。
当然今GUIで見ているアプリなどは止まらないのでその点注意する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/c8750ff4-7ea2-bd22-6fc3-e62961620674.png)

続いて`モニター`タブでは起動中のアプリのモニタリングが行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/2e6e7538-a323-677d-db59-644f7b7177ea.png)

### 5-5-4. Server Configによるserver.xmlの修正

トップページの`Server Config`へアクセスします。
そうするとWeb上からxmlの構成を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/a2797a62-48b3-e1b0-b4d5-2eb8f8ce843a.png)

例えばfeatureを何か追加したい場合、`フィーチャー・マネージャー`から`子の追加`をクリックします。
そうすると子要素が追加され、画面上から追加するfeatureなどを選択することができます。
説明なども日本語で詳しく書かれておりかなり便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/a2d33905-3d2e-2eb8-6162-6a63955e32d5.png)

保存する場合は右上の保存ボタンをクリックすると保存可能です。

### 5-5-5. server.xml上のパスワードの暗号化

Admin Centerの解説は一旦終わりでいくつか備忘も兼ねた機能を紹介します。
先ほど`server.xml`にパスワードを直接書いていました。

```xml:server.xml
    <basicRegistry>
       <user name="admin" password="admin" />
    </basicRegistry>
```    

これではセキュリティ的に良くないので、Libertyとしてパスワードの暗号化などを用意しています。
`securityUtility`というコマンドで文字列を変換することができます。
公式ドキュメントは[こちら][securityUtility]になります。

例えば`admin`という文字列を`xor`でエンコードすると以下のようなコマンドになります。

```bash:
securityUtility encode --encoding=xor admin
```

こちらを実際にエンコードすると標準出力でエンコードされた文字列が出力されます。

```bash:
# securityUtility encode --encoding=xor admin
{xor}PjsyNjE=
```

この文字列を`server.xml`のパスワード部分に置き換えてLibertyを再起動します。

```diff_xml:server.xml
    <basicRegistry>
-      <user name="admin" password="admin" />
+      <user name="admin" password="{xor}PjsyNjE=" />
    </basicRegistry>
```

### 5-5-6. コマンドラインからのアプリの起動停止

先ほど`Admin Center`上からアプリを起動停止できると紹介しました。
今回は`sample.war`のみデプロイしていますが、他にも同一のサーバ上にアプリが載っている状態で`sample.war`を再起動したいといった時に、GUI上から再起動を行うかtest01単位での再起動となってしまいます。

WAS traditionalではPythonなどを使用すれば起動停止がコマンドで行えるらしいですが、Libertyではそういった機能はありません。
前者の場合は都度SEにより手動オペレーションが発生してしまい、後者の場合他のアプリも再起動に巻き込まれてしまいます。

そこで先ほど`Admin Center`でクリックしていた起動停止のボタンの機能をAPIで呼び出します。
`curl`でAPIを呼び出すための下調べから紹介していきます。

`Admin Center`を有効化している場合、`messages.log`に以下の表示があると思います。
(本番環境などで`Admin Center`を有効化しない場合は、別途`restConnector`などのfeatureを有効化する必要があります。)

```text:messages.log
[24/12/29 20:44:37:386 JST] 00000037 com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://vm-rhel01:9080/IBMJMXConnectorREST/
```

まずはここに`curl`でアクセスしてみます。
ここで`mbeans`というURLを確認します。

```bash:
# curl -k -u admin:admin -s https://localhost:9443/IBMJMXConnectorREST/ | jq
{
  "version": "6",
  "mbeans": "/IBMJMXConnectorREST/mbeans",
  "createMBean": "/IBMJMXConnectorREST/mbeans/factory",
  "mbeanCount": "/IBMJMXConnectorREST/mbeanCount",
  "defaultDomain": "/IBMJMXConnectorREST/defaultDomain",
  "domains": "/IBMJMXConnectorREST/domains",
  "notifications": "/IBMJMXConnectorREST/notifications",
  "instanceOf": "/IBMJMXConnectorREST/instanceOf",
  "fileTransfer": "/IBMJMXConnectorREST/file",
  "api": "/IBMJMXConnectorREST/api",
  "graph": "/IBMJMXConnectorREST/graph"
}
```

続いて`mbeans`のURLにアクセスします。
この際、`name`には起動停止したいアプリのwar名(今回は`sample`)を入力します。
すると更にURLが表示されます。

```bash:
# curl -k -u admin:admin -s https://localhost:9443/IBMJMXConnectorREST/mbeans/ | jq '.[] | select(.objectName | contains("name=sample"))'
{
  "objectName": "WebSphere:service=com.ibm.websphere.application.ApplicationMBean,name=sample",
  "className": "com.ibm.ws.app.manager.internal.ApplicationConfigurator$NamedApplication$2",
  "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean"
}
```

最後に上で表示されたURLにアクセスします。
そうすると、起動停止などを行えるURLが表示されます。

```bash:
# curl -k -u admin:admin -s https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean | jq '.operations[] | {name, URL}'
{
  "name": "stop",
  "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean/operations/stop"
}
{
  "name": "restart",
  "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean/operations/restart"
}
{
  "name": "start",
  "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean/operations/start"
}
```

実際にこちらのURLにアクセスしてみます。
今までは`GET`メソッドでしたが、起動停止などは`POST`メソッドを使用します。
また、`json`でアクセスしますが中身は空で送るため`-d '{}'`を入れています。

```bash:
curl -u admin:admin \
     -k \
     -H "Content-Type: application/json" \
     -X POST -d '{}' \
     https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean/operations/stop
```

実際にGUIで確認するとアプリが停止しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/7dad4e68-9be5-1e45-5d5d-faffc1587010.png)

同じく起動も投げてみます。

```bash:
# curl -u admin:admin \
     -k \
     -H "Content-Type: application/json" \
     -X POST -d '{}' \
     https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3Dsample%2Cservice%3Dcom.ibm.websphere.application.ApplicationMBean/operations/start
```
こちらも問題なさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/eba09d59-40e3-9311-b196-97a194d16825.png)

## 5-6. LibertyのSSL化
Admin Centerなどにアクセスする際既にSSL化されていますが、Libertyが発行したオレオレ証明書になっています。
IHSと同様に`Let's Encrypt`の証明書を設定してみます。
作業前にサーバは停止しておきましょう。

Libertyの鍵は`key.p12`という名称で、`/opt/IBM/wlp/opt/servers/test01/resources/security`に格納されています。

```bash
# cd /opt/IBM/wlp/usr/servers/test01/resources/security;pwd
/opt/IBM/wlp/usr/servers/test01/resources/security

# ls -l
合計 8
-rw-r-----. 1 root root 2738 12月 29 19:43 key.p12
-rw-------. 1 root root  897 12月 29 19:43 ltpa.keys
```

ここに`privkey.pem`と`fullchain.pem`を置いておきます。

```bash
# ls -l
合計 16
-rw-r--r--. 1 root root 2872 12月  1 23:23 fullchain.pem
-rw-r-----. 1 root root 2738 12月 29 19:43 key.p12
-rw-------. 1 root root  897 12月 29 19:43 ltpa.keys
-rw-r--r--. 1 root root  241 12月  1 23:23 privkey.pem
```

`key.p12`はデフォルトだとLibertyが自動生成したパスワードが設定されています。
パスワードは`/opt/IBM/wlp/usr/servers/test01`の`server.env`に自動で設定されています。
ここでは`_KEYSTORE_PASSWORD`変数に格納してしまします。

```bash:
# cat /opt/IBM/wlp/usr/servers/test01/server.env
keystore_password=fYGBJf8II3AtprK3WWymwZ7

# _KEYSTORE_PASSWORD=$(egrep "^keystore_password" /opt/IBM/wlp/usr/servers/test01/server.env | awk -F '=' '{print $2}')
```

一旦元ファイルは削除し、`openssl`コマンドで鍵をインポートします。

```bash:
# rm -f key.p12
# openssl pkcs12 -password pass:${_KEYSTORE_PASSWORD} -export -in fullchain.pem -inkey privkey.pem -out ./key.p12

# ls -l key.p12
-rw-------. 1 root root 2752 12月 29 21:15 key.p12
```

この状態でサーバを起動しブラウザで確認すると、証明書が設定した物になっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/0e63915c-6b12-458d-b6df-d091371b9bbd.png)

# 6. LibertyとIHSの接続

最後の章になります。
先ほど`http://ipアドレス:9080/SAMPLE`にアクセスするとアプリのページが確認できました。
ここではプラグインを設定し`https://ipアドレス/SAMPLE`にアクセスすると、アプリのページが表示できるようにしたいと思います。

## 6-1. プラグインの設定ファイルの準備

実はプラグイン用の`plugin-cfg.xml`ファイルはLiberty起動時に、`/opt/IBM/wlp/usr/servers/test01/logs/state`に自動で生成してくれています。

```text:messages.log
[24/12/29 21:16:47:409 JST] 0000003a com.ibm.ws.webcontainer.osgi.mbeans.PluginGenerator          I SRVE9103I: Web サーバー・プラグイン構成ファイルは、このサーバー用に、/opt/IBM/wlp/usr/servers/test01/logs/state/plugin-cfg.xml に自動的に生成されました。
```

場所はどこでも良いですが、このファイルをコピーします。
今回は`/opt/IBM/WebSphere/Plugins/config`に格納します。

```bash:
# ls -l /opt/IBM/wlp/usr/servers/test01/logs/state/plugin-cfg.xml
-rw-r-----. 1 root root 3423 12月 29 21:16 /opt/IBM/wlp/usr/servers/test01/logs/state/plugin-cfg.xml

# cp -p /opt/IBM/wlp/usr/servers/test01/logs/state/plugin-cfg.xml /opt/IBM/WebSphere/Plugins/config/

# ls -l /opt/IBM/WebSphere/Plugins/config/plugin-cfg.xml
-rw-r-----. 1 root root 3423 12月 29 21:16 /opt/IBM/WebSphere/Plugins/config/plugin-cfg.xml
```

また、以下のように編集していきます。
本来はIHSと鍵はきちんと分けるべきかと思いますが、今回はIHSと兼用してしまいます。
今回はIHSとLiberty間もHTTPSになるので、`Hostname`は証明書と紐づくドメイン名を記載しましょう。

```diff_xml:plugin-cfg.xml
-  <Log LogLevel="Error" Name="/opt/IBM/WebSphere/Plugins/logs/webserver1/http_plugin.log"/>
+  <Log LogLevel="Error" Name="/opt/IBM/WebSphere/Plugins/logs/http_plugin.log"/>

-        <Transport Hostname="vm-rhel01" Port="9080" Protocol="http"/>
+        <Transport Hostname="vm-rhel01.motuni.work" Port="9080" Protocol="http"/>
-        <Transport Hostname="vm-rhel01" Port="9443" Protocol="https">
+        <Transport Hostname="vm-rhel01.motuni.work" Port="9443" Protocol="https">
-           <Property Name="keyring" Value="/opt/IBM/WebSphere/Plugins/config/webserver1/plugin-key.kdb"/>
+           <Property Name="keyring" Value="/opt/IBM/HTTPServer/ssl/key.kdb"/>
-           <Property Name="stashfile" Value="/opt/IBM/WebSphere/Plugins/config/webserver1/plugin-key.sth"/>
+           <Property Name="stashfile" Value="/opt/IBM/HTTPServer/ssl/key.sth"/>
         </Transport>
```

また、自動生成されていれば大丈夫かと思いますが、以下の定義が存在しているか確認しましょう。
この定義によりIHSに来た`/SAMPLE/*`へのアクセスをLibertyへ送ってくれます。

```xml:plugin-cfg.xml
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/SAMPLE/*"/>
```

## 6-2. IHSの設定ファイルの修正

最後にIHS側へプラグインと連携する設定を入れます。
`LoadModule was_ap24_module`はプラグインをインストールしたディレクトリにある`mod_was_ap24_http.so`を指定。
`WebSpherePluginConfig`は先ほどコピーした`/usr/IBM/Plugins/config/plugin-cfg.xml`を指定します。

```diff_apache:httpd.conf
+ LoadModule was_ap24_module /opt/IBM/WebSphere/Plugins/bin/64bits/mod_was_ap24_http.so
+ WebSpherePluginConfig /opt/IBM/WebSphere/Plugins/config/plugin-cfg.xml
```

上記設定を行いIHSを再起動します。
この際事前にhostsやDNSで証明書に紐づくドメイン名を解決できるようにしておきましょう。
この状態で各サイトにアクセスします。

まずはIHSの初期ページが443で問題なくアクセスできています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/58955253-52fa-86bf-4672-f2ccae476cd1.png)

続いてLibertyの初期ページです。
こちらも問題なくアクセスできています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/c701f243-02b4-26db-1715-e1c1c4257e83.png)

最後にポート番号を意識させずにアプリのページへアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/45fb89d7-a8a1-882a-a7ee-dddf6aa89fe5.png)

手順外で試しに入れたGitbucketも同様にアクセスできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/ffdc29ab-57e6-23ea-536a-b7799276c4b3.png)

# 7.最後に
IBM製品として、MQ、IHS、WAS Libertyなどを紹介してきました。
一旦IBM製品については私の持ってる知識はアウトプットしきれましたので、IBM系の記事はこれで一旦の区切りとさせて貰います。

一応Db2なども個人では入れたことはあるのですが、あまり興味もないためそちらは本当に時間があればといつか書くかもしれないです。

## 参考サイト
・imcl コマンドを使用したパッケージのインストール
https://www.ibm.com/docs/ja/installation-manager/1.9.2?topic=line-installing-packages-by-using-imcl-commands

・コマンド行を使用した IBM HTTP Server のインストール
https://www.ibm.com/docs/ja/ibm-http-server/9.0.5?topic=manager-installing-http-server-by-using-command-line

・Admin Center のセットアップ
https://www.ibm.com/docs/ja/was-liberty/base?topic=center-setting-up-admin#twlp_ui_setup__uiconfserv

・securityUtility コマンド
https://www.ibm.com/docs/ja/was-liberty/base?topic=SSEQTP_liberty/com.ibm.websphere.wlp.core.doc/ae/rwlp_command_securityutil.htm

・WebSphere Application Server オファリングのオンライン製品リポジトリー
https://www.ibm.com/docs/ja/was/9.0.5?topic=installation-online-product-repositories-websphere-application-server-offerings

・IBM Installation Manager 1.9.1 on Windows Serverのインストール
https://qiita.com/spssfun2017/items/33ce4f9a0365e3bc44de

・Libertyの始め方
https://qiita.com/TTakakiyo/items/bb122f513a1bdf618adc

・WebSphere Liberty 導入・運用ガイド
https://community.ibm.com/community/user/wasdevops/viewdocument/websphere-liberty-1?CommunityKey=d6c93aa2-6e10-48da-96dc-3831da8ee185&tab=librarydocuments

[iimDownloadLink]: https://www.ibm.com/support/pages/fix-list-installation-manager
[root]: https://letsencrypt.org/certs/isrgrootx1.pem.txt
[Liberty]: https://qiita.com/TTakakiyo/items/35c59037a09639437066
[tomcat]: https://tomcat.apache.org/tomcat-6.0-doc/appdev/sample/
[admincernter]: https://www.ibm.com/docs/ja/was-liberty/base?topic=center-setting-up-admin#twlp_ui_setup__uiconfserv
[securityUtility]: https://www.ibm.com/docs/ja/was-liberty/base?topic=SSEQTP_liberty/com.ibm.websphere.wlp.core.doc/ae/rwlp_command_securityutil.htm