【WebSphere Liberty Hints & Tips】HTTPサーバー＋クラスター環境でSSLを構成する方法


## はじめに
Webサーバー（ここではApacheベースのIBM HTTP Server）とLiberty間をSSL化する方法がマニュアルに記載されつつも、少し手こずってしまったので備忘録のためStep-By-Stepでまとめておきます。なおここではサーバー証明書は自己署名証明書を使います。
公開されている最新情報をもとに検証しているつもりですが、誤植・より良い方法などございましたらご指摘ください。

## 前提環境
* RHEL 7.3
* WebSphere Liberty 17.0.0.2（以下Liberty)
* IBM HTTP Server 9.0.0.2 （以下IHS）
* WebSphere Plugins 9.0.0.2（以下Plugin）
* IBM JDK 8

## 構成
* クライアント => IBM HTTP Server(Plugin) => Liberty x2
	* IHSがバックエンドの2台のLibertyにラウンドロビンで割り振る
		* この構成（シンプル・クラスター）方法については[こちら](http://qiita.com/rinaxsumomo/items/41ec21d82393b16ac8cd)をご参照ください
	* クライアントとIHS、IHSとLibertyの間の通信がSSL

## 方法
### クライアント => IHS間のSSL構成
1. CMS鍵ストアを作成し、デフォルト・トラステッドCA証明書を格納します。以下は例です。

```gskcapicmd.command
<IHSROOT>/bin/gskcapicmd -keydb -create -db /opt/IBM/HTTPServer/key.kdb -pw password -stash
```

```gskcmd.command
<IHSROOT>/bin/gskcmd -cert -populate -db /opt/IBM/HTTPServer/key.kdb -pw password
```

2. サーバー証明書を入手します。ここでは自己署名証明書を作成します。以下は作成例です。

```gskcmd.command
<IHSROOT>/bin/gskcapicmd -cert -create -db /opt/IBM/HTTPServer/key.kdb -pw password -dn "cn=www.example.com" -label default -size 2048 -expire 365

```

３. httpd.confでSSLを設定します。以下は設定例です。

``` IHSROOT/conf/httpd.conf
# Example SSL configuration
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443
<VirtualHost *:443>
 ServerName YourHostName
 SSLEnable
 SSLClientAuth None
 SSLServerCert default
 KeyFile /opt/IBM/WebSphere/HTTPServer/key.kdb
</VirtualHost>
SSLDisable
```

４. IHSを再起動してhttpd.confを読み込みます。

```restart.command
<IHSROOT>/bin/apachectl stop
<IHSROOT>/bin/apachectl start
```
５. https://IHSHostname にアクセスできることを確認します。

いわゆるオレオレ証明書なので警告が出ますが受け入れて続行します。
![Kobito.x5LJTs.png](https://qiita-image-store.s3.amazonaws.com/0/129662/7616db3c-6c01-875f-69cb-f4b7a3996983.png "Kobito.x5LJTs.png")

![Kobito.jjRHjT.png](https://qiita-image-store.s3.amazonaws.com/0/129662/cdb0d964-1645-f91f-885c-4ee8a1edcadb.png "Kobito.jjRHjT.png")


### IHS => Liberty間のSSL構成
1. 各LibertyでJKS鍵ファイルを作成します。サーバー構成ファイルに以下を追記して起動します。

```server.xml共通
<featureManager>
  <feature>ssl-1.0</feature>
</featureManager>
```

```server.xml1つ目
<keyStore id="defaultKeyStore"
      location="key1.jks"
      type="JKS" password="password" />

```

```start.command
<LibertyROOT>/bin/server start server1

```

```server.xml2つ目
<keyStore id="defaultKeyStore"
      location="key2.jks"
      type="JKS" password="password" />

```

```start.command
<LibertyROOT>/bin/server start server2

```

\<serverName>/resources/security/ディレクトリに自動生成されたjksファイルがあることを確認します。以下は例です。

![Kobito.8aFBGn.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c4a1e309-3f4f-dad1-6eb2-ab037f60085e.png "Kobito.8aFBGn.png")



２. 上記のjksファイル2点をIHSの任意の場所にコピー
以下は例です。

![Kobito.7eZH1z.png](https://qiita-image-store.s3.amazonaws.com/0/129662/fc16ba74-edb1-fdba-c804-f7a707f07fe9.png "Kobito.7eZH1z.png")



３. gskcmdコマンドを使ってそれぞれのjksファイルをkdbファイルに変換

```gskcmd.command
./gskcmd -keydb -convert -pw Liberty -db /opt/IBM/WebSphere/HTTPServer/conf/key1.jks -old_format jks -target /opt/IBM/WebSphere/HTTPServer/conf/plugin-key1.kdb -new_format cms -stash
```

```gskcmd.command
./gskcmd -keydb -convert -pw Liberty -db /opt/IBM/WebSphere/HTTPServer/conf/key2.jks -old_format jks -target /opt/IBM/WebSphere/HTTPServer/conf/plugin-key2.kdb -new_format cms -stash
```

以下は例です。

![Kobito.amyOxZ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/5a49810e-d83a-b82e-6a3f-5692dd07b4cd.png "Kobito.amyOxZ.png")



４. 上記ファイルをプラグイン構成ファイル内でServerClusterエレメントを更新しIHSを再起動
以下は例です。

```plugin-cfg.xml
<ServerCluster CloneSeparatorChange="false" GetDWLMTable="false" IgnoreAffinityRequests="true" LoadBalance="Round Robin" Name="Cluster1" PostBufferSize="0" PostSizeLimit="-1" RemoveSpecialHeaders="true" RetryInterval="60" ServerIOTimeoutRetry="-1">
      <Server CloneID="abcd-efgh-1234-5678-90xx" ConnectTimeout="5" ExtendedHandshake="false" LoadBalanceWeight="20" MaxConnections="-1" Name="server1" ServerIOTimeout="900" WaitForContinue="false">
         <Transport Hostname="YourLibertyHostName1" Port="9080" Protocol="http"/>
         <Transport Hostname="YourLibertyHostName1" Port="9443" Protocol="https">
            <Property Name="keyring" Value="/opt/IBM/WebSphere/HTTPServer/conf/plugin-key1.kdb"/>
            <Property Name="stashfile" Value="/opt/IBM/WebSphere/HTTPServer/conf/plugin-key1.sth"/>
         </Transport>
      </Server>
<Server CloneID="1234-5678-90yy-abcd-efgh" ConnectTimeout="5" ExtendedHandshake="false" LoadBalanceWeight="20" MaxConnections="-1" Name="server2" ServerIOTimeout="900" WaitForContinue="false">
         <Transport Hostname="YourLibertyHostName2" Port="9080" Protocol="http"/>
         <Transport Hostname="YourLibertyHostName2" Port="9443" Protocol="https">
            <Property Name="keyring" Value="/opt/IBM/WebSphere/HTTPServer/conf/plugin-key2.kdb"/>
            <Property Name="stashfile" Value="/opt/IBM/WebSphere/HTTPServer/conf/plugin-key2.sth"/>
         </Transport>
      </Server>

</ServerCluster>
```

５. https://IHSHostname/App などLibertyにデプロイされているアプリにHTTPSでアクセスできることを確認します。
以下は例です。

![Kobito.ibJkL4.png](https://qiita-image-store.s3.amazonaws.com/0/129662/81b595bd-8394-dd44-3a6d-2e7f229d1402.png "Kobito.ibJkL4.png")


## まとめ
以上でIBM HTTP ServerとWebSphere Libertyのクラスター環境において、全コンポーネント間でSSL化する方法をまとめました。

## 参考資料
* http://www.redbooks.ibm.com/redbooks/pdfs/sg248170.pdf
* https://www.ibm.com/support/knowledgecenter/ja/SS7JFU_8.5.5/com.ibm.websphere.ihs.doc/ihs/cihs_certmgmt.html
* http://public.dhe.ibm.com/software/dw/jp/websphere/was/ihs7_guide/IHSV7Guide_03SSL.pdf
* http://download.boulder.ibm.com/ibmdl/pub/software/dw/jdk/security/60/iKeyman.8.User.Guide.pdf
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.0.0/com.ibm.websphere.ihs.doc/info/ihs/ihs/tihs_selfsigned.html
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/rwlp_sec_keystores.html

* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.base.doc/ae/twsv_configsimplelb.html
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/twlp_admin_webserver_plugin.html
* https://www.ibm.com/support/knowledgecenter/ja/SS7K4U_liberty/com.ibm.websphere.wlp.zseries.doc/ae/twlp_generate_plugin_cfg_xml_util.html
* https://stackoverflow.com/questions/26122809/websphere-issue-merging-plugin-cfg-xml-for-load-balancing