Linux恐怖症でもできるTomcat de HTTPSセットアップ with XServer VPS

- 筆者はこの分野に疎いため用語の使い方などが少しおかしい可能性がある。
- 筆者は別にXServerのまわし者ではない。(主にコスト面から)たまたま本番環境にXServerを選んだだけの者である。
# 前提条件
### この記事のスタート地点
プログラムが完成し`.war`ファイルが手元に存在していて、これからサーバーを契約する段階。
### 最終的にやりたいこと
・XServer VPSでサーバーを契約
・XServer Domainで独自ドメインを、SSLでSSL証明(Let's Encrypt)を取得
・Apache Tomcatを整備(Apache Http Serverは使わない)
・下記の開発環境で作った`.war`ファイルをデプロイ
・443ポートにてHTTPS通信を行いページを配信
・実行ユーザーはrootでいい (ホントは良くない、というか多分普通に良くない)
・HTTPSプロトコルを使用

### 開発環境
#### 手元のパソコン
・Windows11 (Professional)
・InteliJ IDEA (Community Edition**でない方**)
・Tomcat 10.1.23 (開発開始当時の最新Ver.)
・Java 21


#### VPSサーバー
・Ubuntu(=Debian系、なんのことかわからない人は予備知識編参照のこと)

:::note info
こういう背景で、本記事ではサーバー側をLinux、ローカル側をWindowsと呼ぶことがある。ローカル側もLinuxの方は適宜読み替えていただきたい。
:::

#### 想定読者
Javaはそこそこ分かるが**Linux及びサーバー構築の知識がほぼゼロ**の筆者のような人

# 手順概要(兼目次)
第1章 XServer VPSでVPSサーバーを契約
第2章 XServer Domainで独自ドメインを取得
第3章 独自ドメインのセットアップ(レコードの設定など)
第4章 ひとまずサーバーのセットアップ(HTTPS認証をするにはまずHTTP通信ができなきゃいけない)
第5章 Let's Encryptで認証を受ける
第6章 証明書をこねこねしてJKSファイルにまとめあげる
第7章 証明書を使ってHTTPSを有効化
第8章 `.war`ファイルのデプロイ(4以降いつでもいい)

# 第1章 XServer VPS契約編
[ここ](https://vps.xserver.ne.jp)からXServer VPSを契約する。会員登録をしてクレカ情報を打ち込めば契約できたはず。

:::note warn
**注意点**
- このページ通りにやるのならOS(イメージファイル)はUbuntuを選択すること
- SSHキーは新規に作る。rootユーザーでTomcatを本番運用する筆者もさすがに作るべきと考える
- ダウンロードしたSSH通信用秘密鍵(わからない人は予備知識編参照のこと)は大切に保管する
- Ubuntu、もといLinuxシステムのrootユーザーのパスワードを決める欄があるので忘れないこと
:::

# 第2章 独自ドメイン取得編
XServerVPS管理画面の「ドメイン取得」から必要事項を記入して申請する。
初回契約は1円でも、1年後の更新から1300円したりすることもあるので値段をよく確認すること。
# 第3章 ドメインセットアップ編
### 3-1 ネームサーバー設定
[公式マニュアル](https://www.xserver.ne.jp/manual/man_domain_namesever_setting.php)を参考にするとよい(手順3ではXServer VPSを選ぶこと)。

まず、右上の「サービス管理」「XServer Domain」 ページ、もしくはXServer VPS管理画面のドメイン欄の、3点メニューから、「ネームサーバー設定」を選択し、第2章で取得したドメインのネームサーバー設定画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/91c1d278-665a-13f7-3939-4c96e5dac3a6.png)
下の画面において、XServer VPSを選択し次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/7c7d7d79-5ec5-3530-6202-b5bb0ecc854c.png)
そして出てくるであろうOK的なものを押す。設定の反映まで数時間かかることもあるらしいので、お茶でもしながら待つ。

### 3-2 DNSレコード設定
**ここがややこしい。**
先ほど「ネームサーバー設定」を選ぶときに使った3点メニューにある「DNSレコード設定」**ではなく**、XServer VPS管理画面の左側のメニューにある「DNS設定」を選択。そこから対象ドメインの「選択する」を取得。
追加ボタンからAレコードを2個追加し、下のように表示されるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/980d983f-e74a-35f0-3851-533aa449784f.png)


# 第4章 サーバーセットアップ編
### 4-1ポート開放
#### 4-1-1XServer側の設定
**トラップその1。** これをしておかないと、後々ファイアウォールを開放してもポートに繋がらない沼にハマる。
VPSサーバーの下のような管理画面を開き、右のメニューからパケットフィルター設定を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/291397d0-affc-2e6c-9a2f-c292f38e8f25.png)
パケットフィルター設定をオフにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/114020b5-48c3-36e1-3f9f-b8328f39c438.png)
多分ページ下部のフィルタールール設定から許可するポートを追加できるのだが、試行錯誤の邪魔であったため筆者はオフにした。

#### 4-1-2Linux側の設定
VPSパネルの「コンソール」ボタンを開き、ブラウザ上でのコンソール画面を起動する。
ログインを求められるのでログインする。ユーザー名は`root`、パスワードはサーバー契約時、もといシステムインストール時に決めたもの。ログインできればrootユーザーでのターミナルが起動する。
以下、Linuxのコマンドはすべてrootユーザーで実行するものとする。(つまり実はsudoいらないけどノリでついてる時がある)。

初手、ファイアウォール設定の有効化。
```bash:サーバー側
ufw enable
```
第2手、下の2行の**どちらかを実行する(どちらでも同じ)。**
```bash:サーバー側
ufw allow ssh
ufw allow 22/tcp
```
これで22番ポートを開放し、**SSH通信への準備が整った。**(意味がわからない人は予備知識編参照のこと)

第3手、次のコマンドを**すべて実行**し、各ポートを開放する。
```bash:サーバー側
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8080/tcp
ufw allow 8443/tcp
```
今回HTTPS通信は443ポートで行うため、8443ポートのオープンは実は不要。

第4手、ファイアウォール設定の状況を確認する。
```bash:サーバー側
ufw status
```
`80`,`443`,`8080`,`8443`のすべてのポートとそのv6がallowになっていればOK。
### 4-2 手元のWindowsからSSH接続
ブラウザ上のターミナルは操作性が悪い。そのため、WindowsからSSh接続を行い、以降Windowsのコマンドプロンプトから制御を行う。ここでサーバー契約時もといシステムインストール時にダウンロードしたさーばーのSSH接続用秘密鍵を使う。
```console:手元にあるWindowsのコマンドプロンプト
C:\Users\ユーザー名> ssh -i SSH秘密鍵のパス.pem root@xxx.xx.xx.xx
```
xxxはVPSサーバーのIPアドレス。秘密鍵を持ってる時点で本人であることが確定するので、パスワードは聞かれない。
これでコマンドプロンプトがLinuxターミナルに早変わりする。ブラウザ版のときと同じように扱える。なぜかコマンドのコピペはできない。
### 4-3 WinSCPをインストール & セットアップ
WinSCPとは...WIndows側のファイルをLinux側にアップロードしたり、その逆でLinux側のファイルをWindows側にダウンロードしたりという作業がGUIで楽々できちゃうWindowsアプリケーション。**この後SSL認証用ファイルやSSL認証証明書、`.war`ファイルをデプロイするために使う。** ファイルの送受信を行わなくてもディレクトリの構造を見たり所有者や権限をみたりと色々な作業が楽にできるので今のうちにいれることをおすすめする。
[ここ](https://winscp.net/eng/download.php#google_vignette)からダウンロード・インストールを行う。
大変申し訳無いがインストールスタイルをWindowsスタイルにしたかもう1つのものにしたか覚えていない。おそらくWindows風...？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/02697b55-5ce8-50d0-ecfc-308edbbd314f.png)

ホスト名にVPSサーバーのIPアドレスを入力、パスワードには何も入力せずに、
設定→SSH→認証
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/149801f5-3b04-0636-7a7b-f629c3814c1c.png)
秘密鍵にSSHサーバー用秘密鍵を選択するのだが、XServerのWEBサイトから入手できる`.pem`ファイルはいきなり選択できないので、ファイル選択ウィンドウでファイルの種類をすべての秘密鍵ファイルにし、XServerのWEBサイトからダウンロードした`.pem`ファイルを選択すると、`.ppk`ファイルに変換するか効かれるので変換する。できたらOKを押して、保存を押して設定を保存してから「ログイン」を押す。
すると、左側にはWindowsの、右側にはLinuxのディレクトリの構造がそれぞれWindowsのエクスプローラー風に表示される。これでファイルのアップロード・ダウンロードがドラッグアンドドロップで楽にできる。

### 4-4 テキストエディタをインストール
本稿ではテキストエディタに`nano`を使う。
以下のコマンドを順番通りに実行する。
```bash:サーバー側
apt update
apt install nano
```
これで、以降
```bash:サーバー側
nano ファイル名
```
でファイルの編集ができる。
保存は`Ctrl + O`からファイル名を決めて`Enter`、`Ctrl + X`でnanoを閉じる。

### 4-5Javaをインストール
Linux側ではTomcatと`.war`に入っている`.jar`の実行ができればよいのでJREのみをいれればよい...と言いたいところなのだが、後でSSL認証の鍵をJKSファイルというものにまとめるときに1回だけJDKにしか含まれていないファイル(`cacerts`)を使用することがある。選択肢は2つ存在している。
・LinuxにはJREのみをインストールして、必要なファイルだけWindows等手元の開発環境のJDKから持ってくる。
・LinuxにJDKごと入れてしまう
筆者は前者を選択したため、前者の方法を紹介する。
以下のコマンドを順番に打っていくだけである。
```bash:サーバー側
apt update
apt install openjdk-21-jre
```
これができたら、
```bash:サーバー側
java -version
```
などでインストールに成功しているか確認すると良い。

### 4-6 Apache Tomcatをインストール
`opt/apache-tomcat-{バージョン名}/`にインストールしたい。
`opt`ディレクトリはインストールするユーザーのホームに作った方が良いかもなのだが、今回はrootで実行してしまうのでrootに作る。
ひとまず次のコマンドでTomcatを入れるディレクトリを作っておく。
```bash:サーバー側
mkdir opt
```
最新バージョンをインストールするときはaptコマンドでもいいらしいのだが、筆者の場合開発環境で使っていた、開発開始時の最新バージョン10.1.23はもう最新バージョンではなくなっていた。
そのため、[アーカイブ保管ページ](https://archive.apache.org/dist/tomcat/tomcat-10/)から圧縮ファイルを取ってくる。
該当バージョンをクリックし得た下の画面から`bin`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/f71639c7-18c9-9275-4305-1624bb591472.png)

ここから2通り方法がある。
**方法1.リンクからwgetコマンドでダウンロード**
そこから、`apache-tomcat-{バージョン}.tar.gz`のリンクをコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368194/b3073950-3ab3-e917-5375-d22e92bffbd3.png)

こんなリンクを得る。
```
https://archive.apache.org/dist/tomcat/tomcat-10/v10.1.23/bin/apache-tomcat-10.1.23.tar.gz
```

そのリンクを使って圧縮ファイルをダウンロードする。
```bash:サーバー側
wget https://archive.apache.org/dist/tomcat/tomcat-10/v10.1.23/bin/apache-tomcat-10.1.23.tar.gz
```

**方法2.Windowsを経由する**
同様のリンクをコピーするのではなく、クリックしてtar.gzファイルを一度Windowsにダウンロードして、WinSCPで該当フォルダにコピーする。リンクを手打ちしなくて良い分こちらのほうが楽かも。

### 4-7 1回起動

1回起動を試みる。
以下、Tomcatのバージョンは10.1.23とするのでこの数字は適宜打ち替えること。
カレントディレクトリが`opt`だとして、
```bash:サーバー側
cd apache-tomcat-10.1.23
bin/startup.sh
```
これでTomcatが起動できるはず。
お手元のPCのブラウザに以下のいずれかのリンクを打ち込んで、Tomcatのウェルカムページが表示されるか試すとよい。(httpの後のコロンを全角にしてあるため、半角に直すこと)
- http：//{VPSサーバーのIPアドレス}:8080/
- http：//example.com:8080/

**以下、`opt/apache-tomcat-10.1.23`にカレントディレクトリを移す作業を`cd CATALINA_HOME`と書く。(コピペして実行できるわけではない。最もパス通せば行けるとは思う)**

### 4-8 80番ポートへの切り替え(HTTP通信の有効化)
アドレスバーに8080と打ち込まなければならないのは見栄えが悪いので消したいところ。そもそも、**8080なしでアクセスできるようにしないと後でSSL証明書を受け取るときの認証ができない。**
この状況は、Tomcatがデフォルトでは8080ポートでHTTP通信を行うのに、ブラウザはHTTPプロトコルで通信を行う場合デフォルトでアクセスするポートが80だから、わざわざ「8080ポートにアクセスしてね～」と教えてやらなくてはいけないことに起因している。そのため、こちらがHTTP通信を行うポートを80ポートに変えればよい。リンクのポート表記を省略できる。

次のコマンドで`server.xml`ファイル(予備知識編参照のこと)を編集する。
```bash:サーバー側
cd CATALINA_HOME
nano conf/server.xml
```

```xml:server.xml
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />
```

の`8080`を`80`に打ち替えこうする。
```xml:server.xml
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />
```

`Ctrl + O`で保存して`Ctrl + X`で`nano`を閉じたら、
Tomcatを再起動する。
```bash:サーバー側
cd CATALINA_HOME
bin/shutdown.sh
bin/startup.sh
```

これで、お手元のWindowsのブラウザから
- http：//{VPSサーバーのIPアドレス}/
- http：//example.com/

で先程と同様のページにアクセスできるはず。

# 第5章 SSL認証編
### 5-1 XServer側で申請
XServer VPS管理画面右上の「サービス管理」から「XServer SSL」もしくはXServerVPS管理画面のSSL証明書欄の追加申し込みから、SSL証明書申し込み画面へ移動する。
利用したいSSLのブランドを選び(今回はコストを抑えたいので無料のLet's Encrypt)、証明書を付与してほしいドメインを入力するのだが、例えば`example.com`の場合、`www.example.com`と、必ず`www`をつけて申請すること。XServer側も警告を出してくれるが、
`www.example.com`で申請すれば`www.example.com`と`example.com`の両方に証明書が付与される一方、
`example.com`で申請すると`example.com`にしか証明書が付与されない。
### 5-2 WEB認証の準備
認証方法を選ぶ画面になるので、WEB認証を選択する。2つのファイルを指定のURLでアクセスできるようにすることを求められる。WinSCPを用いて、新規にディレクトリを作りながら`opt/apache-tomcat-10.1.23/webapps/.well-known/acme-challenge/`にその2つのファイルを置く。
.well-knownのような.から始まるディレクトリは隠しディレクトリとして扱われるため、WinSCPにおいてはじめは表示されない。右下に「隠しディレクトリを非表示にしている」旨のアイコンがあるので、そこを押して表示させる。
設置が完了したらTomcatを再起動し、XServerからWEBページで指定されたリンクを開いてファイルの内容が表示されるかを検証する。
```bash:サーバー側
cd CATALINA_HOME
bin/shutdown.sh
bin/startup.sh
```

### 5-3 証明書3種の神器の入手
準備ができたらXserverのページでいい感じに「次へ」を押すと「SSL証明書」「中間証明書」「秘密鍵」をダウンロードするページに移動できる。SSH接続の証明書と異なり何回でもダウンロードが可能。
それぞれダウンロードして、
SSL証明書を`client.crt`
中間書を`server.crt`
秘密鍵を`client.key`
となるようにリネームする。
できたら、それらのファイルをWinSCPを用いて`opt/apache-tomcat-10.1.23/conf`に配置する。
次章でこれらをTomcatが使える形に加工する。

# 第6章 証明書セットアップ編
この章は[ここ](https://ponsanlabo.com/how-to-create-jks-file/)をベースに書かせていただいている。
この記事の`client.key`,`client.crt`,`server.crt`がそれぞれXServerでいうところの秘密鍵、SSL証明書、中間証明書に対応しているわけである。
### 6-1 JKSファイルのタネを入手
ここだけJDKが必要である。筆者は手元のWindowsから必要なファイルだけコピーして使用したので、その方法を記述するが、LinuxにJDKごとインストールした人はそこにあるファイルを使えば良い。
何らかの方法で、`{JAVA_HOME}/lib/security/cacerts`(拡張子がないファイル)を、Linux側の`CATALINA_HOME/conf/`の中にいれる。このファイルにはHTTPSプロトコルを使用するうえでの主要なルート証明書情報が含まれている(by [Oracle公式ドキュメント](https://docs.oracle.com/javase/jp/1.5.0/tooldocs/solaris/keytool.html))のでありがたく拝借する寸法である。

以下、この章の作業は`conf`ディレクトリで行う。
```bash:サーバー側
cd CATALINA_HOME/conf
```

### 6-2 ベースのJKSファイルを作る
```bash:サーバー側
cp cacerts mycacerts.jks
```
でJKSファイルを作る。
このファイルのデフォルトパスワードは`changeit`なので、次のコマンドでお望み通り変えてあげる。
```bash:サーバー側
keytool -storepasswd -keystore mycacerts.jks
今のパスワード> changeit
新しいパスワード> <新しいパスワード>
確認のため再入力> <新しいパスワード>
```
これでベースのJKSファイルができた。ここに3つの証明書をインポートする。
### 6-3 PKCSファイルの作成
いきなり全部インポートするのではなく、秘密鍵とSSL証明書を一度PKCSファイル(拡張子`.p12`)という別形式の鍵ファイルにインポートしてから、PKCSファイルをJKSファイルにインポートし、そのJKSファイルに中間証明書もインポートするという手順で行う。

```bash:サーバー側
openssl pkcs12 -export -in client.crt -inkey client.key -out client_certs.p12 -name mycacerts
```
ここでもパスワードを設定するよう求められる。JKSファイル作成時と違うものでもいいらしいが、ややこしいしどうせ最後はJKSファイルにインポートするのだから同じものにする。
これで秘密鍵とSSL証明書をPKCSファイルにまとめることができた。
### 6-4 PKCSをJKSにインポート
```bash:サーバー側
keytool -importkeystore -srckeystore client_certs.p12 -srcstoretype pkcs12 -destkeystore mycacerts.jks -deststoretype jks -srcstorepass <PKCSのパスワード> -deststorepass <JKSのパスワード>
```
これでJKSに秘密鍵とSSL証明書がインポートされた状態になった。最後に中間証明書をインポートする。

### 6-5 中間証明書のインポート
```bash:サーバー側
keytool -importcert -trustcacerts -file server.crt -keystore mycacerts.jks
```

これでTomcatに与える鍵ファイルの完成である。


# 第7章 証明書適用編
`server.xml`を開く
```bash:サーバー側
cd CATALINA_HOME
nano conf/server.xml
```

まず、
```xml:server.xml
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />
```
の`8443`を`443`に打ち替え
```xml:server.xml
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443"
               maxParameterCount="1000"
               />

```
こうする。

次に、以下の`Connector`タグを追加する。

```xml:server.xml
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true"
               maxParameterCount="1000">
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/mycacerts.jks" certificateKeystorePassword="JKSのパスワード"
                         type="RSA" />
        </SSLHostConfig>
</Connector>
```
そしてサーバーを再起動する。
```bash:サーバー側
cd CATALINA_HOME
bin/shutdown.sh
bin/startup.sh
```

これでHTTPSプロトコルの使用が可能になり、お手元のWindowsのブラウザから
- http**s**：//{VPSサーバーのIPアドレス}/
- http**s**：//example.com/

で先程と同様のページにアクセスできるはず。

# 第8章 `.war`ファイルデプロイ編
### 8-1 Tomcatを止める
```bash:サーバー側
cd CATALINA_HOME
bin/shutdown.sh
```
### 8-2 `.war`ファイルをデプロイ
WinSCPを用いる。Linux側で、`opt/apache-tomcat-10.1.23/webapps`を開き、そこに対象の`.war`ファイルをWindowsのエクスプローラーからドラッグアンドドロップする。これでデプロイは完了。
### 8-3 Tomcat起動
```bash:サーバー側
cd CATALINA_HOME
bin/shutdown.sh
```
Tomcatはwebappsディレクトリ内の変化を常に見張っていて、新しい`.war`ファイルを見つけると自動で展開して適切に配備してくれる。(だから本当はTomcatを止める必要もない)

これで、
これで、お手元のWindowsのブラウザから
- https：//{VPSサーバーのIPアドレス}/{`.war`ファイルの名前}/{開きたいページのファイル名やURLパターン}
- https：//example.com/{`.war`ファイルの名前}/{開きたいページのファイル名やURLパターン}

で任意のページを開くことができるようになる。**目標達成**である。


# 予備知識編
### デプロイとは
サーバーに配信したいデータをアップロードすること。
### Debian系, CentOS系
Linuxには２つ大きな系統があるそう。Debian系とCentOS系である。どちらもLinuxだからほぼ同じことができるが、コマンド名が異なることもしばしば。
### VPSサーバーとは
レンタルサーバーのようなもの。
違いとして、VPSサーバーにはroot権限があり(=Linuxなりなんなりのコンソールを自在に扱える)、使えるシステムに制限がない点が挙げられる。WordPressのみ、などではなくTomcatでもなんでも使うことができる。

### SSH通信とは
手元にあるパソコンのターミナル(例えばWindowsのコマンドプロンプトやPowerShell)と手元にないパソコンのターミナル(VPSサーバーのLinuxのターミナル)を安全に接続する通信。手元のパソコンに秘密鍵(`.pem`ファイルや`.ppk`ファイルなどの形式)が必要。

### DNSレコードとは
ドメインとIPアドレスを結びつけるための設定のこと。
とりあえず今回見かけるレコードたちを紹介。
- **SOAレコード**
権威サーバーというものを指し示すそう。使わない。
- **NSレコード**
おそらく読みはネームサーバーレコード。ドメインを登録するDNSサーバーを指し示すそう。使わない。
- **Aレコード**
自分のドメインとそのIPアドレスを結びつけるレコード。今回はこいつを設定していく。

### SSL認証とは
これがないとHTTPプロトコルになる。セキュリティが弱い。良くない。見栄えが悪い。
適切な認証局で認証を受け、貰い受けた証明書を使えばWEBサイトの通信を暗号化し、HTTPSプロトコルというセキュリティ強めな通信ができるようになる。見栄えもいい。社会的な信用を基に成り立っているというこのセキュリティシステムの性質上、しっかりした認証局での認証は高額だが、個人のために**Let's Encrypt**という無料で認証を受けられるサービスがある。ありがたい。[このサイト](https://wa3.i-3-i.info/word17016.html)を見るといろいろ分かっていいと思う。

### 有名なポート一覧
- **22番**
SSH通信を行うポート。向こうのパソコンの22番ポートをオープンしとかないとSSH通信はできない。
- **80番**
HTTP通信を行う標準的なポート。アドレスバーでポート番号を指定しない限りHTTP通信をしたいブラウザはここにアクセスしてくる。
- **443番**
HTTPS通信を行う標準的なポート。アドレスバーでポート番号を指定しない限りHTTPS通信をしたいブラウザはここにアクセスしてくる。

**上記の1024番以下のポートは(少なくともLinuxでは)特権ポートと呼ばれ、rootユーザーしか使えない。(AuthBindっていうパッケージをaptで持ってくれば使える。[ここ](https://note.com/modern_ferret431/n/n744e2da36bd7)を見るとよい)**

- **8005番**
TomcatがSHUTDOWNコマンドをリッスンしてるポート。Tomcatが稼働しているときにこのポートへアクセスして「SHUTDOWN」と送るとTomcatが停止するそう。しかし8005番ポートをファイアウォールで通さなければ大丈夫。
- **8080番**
世間一般的にはHTTP通信を行うための代替ポート。デフォルトのTomcatはここでHTTPをリッスンする。
- **8443番**
世間一般的にはHTTPS通信を行うための代替ポート。デフォルトのTomcatはここでHTTPSをリッスンする。

### `server.xml`とは
Tomcatフォルダの中のconfフォルダの中にある、Tomcatの設定ファイルの一種。ここで使用するポートを指定したりできる。詳しい仕様は[公式リファレンス](https://tomcat.apache.org/tomcat-10.0-doc/config/http.html)をチェック！ここでは特に重要ないくつかのタグや属性を紹介する。
- **Serverタグの中にネストさせるタグ：Connector**
基本となるタグ。このタグ1つにつき1つのTomcatの出入り口を定義できる。複数個定義することもできる。というかそれが普通。

- **Connectorタグの属性：port (ポート番号)**
対象のConnectorタグと指定したポート番号を結びつけることができる。

- **Connectorタグの属性：enableLookups (true or false)**
デフォルトはfalse。trueにすると、アクセスしてきたクライアントのIPアドレスから、DNSサーバーを参照(=Look up)し、ホスト名を調べてくれる。使わない。

- **Connectorタグの属性：SSLEnabled (true or false)**
デフォルトはfalse。HTTPSプロトコルを使うConnectorではtrueにする。

- **Connectorタグの属性：redirectPort (ポート番号)**
そのConnectorがSSLに対応していなくて(=HTTPプロトコル用で)、でもHTTPSプロトコルでのリクエストが来た場合に、この属性で指定したポートにリダイレクトさせることができる。

- **Connectorタグの属性：protocol (下記の3つから選べる)**
org.apache.coyote.http11.Http11NioProtocol
org.apache.coyote.http11.Http11Nio2Protocol
org.apache.coyote.http11.Http11AprProtocol
の中から使うプロトコルを選べる。いずれもHTTP1.1仕様と思われる。HTTP2を使うには`UpgradeProtocol`タグの記述が必要。

- **Connectorタグの中にネストさせるタグ：UpgradeProtocol**
下のように使うことで対象のConnectorタグが使う通信規格をHTTP2に格上げできる。
```xml:server.xml
<Connector>
  <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
```

- **Connectorタグの中にネストさせるタグ：SSLHostConfig**
`secure`属性がtrueのConnectorタグは、最低でも1つのSSLHostConfigタグを子タグとして持っていなくてはならない。ここでSSL(HTTPSプロトコル)の定義を行う。


- **SSLHostConfigタグの中にネストさせるタグ：Certificate**
SSLHostConfigタグは少なくとも1つのCertificateタグを子タグとして持っていなくてはならない。
ここでは紹介しないが、passwordを指定する系の属性がいくつかあり、使うのものを間違えないように注意が必要である。間違えるとTomcatの起動に失敗したりHTTPSが繋がらなかったりして、ログ(`logs/catalina.out`)にて"Password was incorrect"などの少しズレたエラーを返される。

また、これらもここでは紹介しないが、`Connector`タグの`scheme`属性、`secure`属性は知っていてもよいだろう。


# 便利なLinuxコマンド編
- 新しいパッケージをインストール(aptコマンド)
``` bash:サーバー側
apt update
apt isntall パッケージ名
```

- カレントディレクトリにあるディレクトリ一覧
```bash:サーバー側
ls -d */
```
- 空のファイルを作る
```bash:サーバー側
sudo touch ファイル名
```
- リッスンしてるポート一覧
```bash:サーバー側
sudo netstat -tuln
```
- N番ポートのファイヤウォール開放
```bash:サーバー側
sudo ufw allow N/tcp
```
- ファイアウォール状況確認
```bash:サーバー側
sudo ufw status
```

- メモリ使用量を確認(どちらでもよい)
```bash:サーバー側
top
free -m
```

- Tomcatのログ(`opt/apache-tomcat-10.1.23`は読み替えて)
```bash:サーバー側
cat opt/apache-tomcat-10.1.23/logs/catalina.out
```

# 参考文献編
- [Xserver公式マニュアル-ネームサーバー設定](https://www.xserver.ne.jp/manual/man_domain_namesever_setting.php)
- [Apache Tomcat公式リファレンス-server.xmlの仕様](https://tomcat.apache.org/tomcat-10.0-doc/config/http.html)
- [Oracle公式ドキュメント - keytool - 鍵と証明書の管理ツール](https://docs.oracle.com/javase/jp/1.5.0/tooldocs/solaris/keytool.html)
- [【Java】JKSファイル(Javaキーストア)の作り方](https://ponsanlabo.com/how-to-create-jks-file/)
- [HTTPS通信とは-「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word17016.html)