Apache-tomcatの環境にCloudflareで作成した証明書を使用する

:::note warn
個人メモ
:::

## 前提条件
+ Raspberry Pi上にapache/tomcatを稼働させている
+ オレオレ証明書を使用している
+ Cloudflareでドメイン名の取得、レコードの設定を行いドメイン名でアクセスできる
+ 今回作成する証明書はCloudflare経由でしか使用できません
  （普通にWEBサーバをhttpsで公開するなどの場合には使用できません）

## ０．環境確認

Cloudflareにログインし証明書を使用できる環境にあるか確認する

### [1/2]Proxy statusがProxiedになっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/c086b99c-4179-c539-5228-5bcb8a813c77.png)

:::note info
Proxyについて
通信経路は下記のようになっている
　ブラウザ　--(1)-->　Cloudflare　--(2)-->　サーバ
+ DNS onlyになっている場合
  通常のDNSとのやり取りと同じ
  ブラウザはCloudflareにて名前解決（ドメイン名→IPアドレス取得）し、
  以降は、取得したIPアドレスを使用してサーバと通信する
+ Proxiedになっている場合
  ブラウザは常にCloudflareとやり取りを行う
  ブラウザはCloudflareにて名前解決すると、CloudflareのIPアドレスを返却される
  このIPアドレスを使用して通信すると、Cloudflareがブラウザの代わりに
  サーバとやり取りを行い結果をブラウザに返却する
:::

### [2/2]SSL/TLS 暗号化モードが「Full(strict)」になっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/12f25507-8db6-cb0e-2d57-2ae7df5ca82c.png)

:::note info
暗号化モードについて
通信経路は下記のようになっている
　ブラウザ　--(1)-->　Cloudflare　--(2)-->　サーバ
+ Off
  (1)(2)どちらの経路もSSL（https）では通信しない
  ブラウザにてhttpsでアクセスした場合も、httpで通信する
  SSL証明書は不要
+ Flexible
  (1)のみhttp/httpsで通信可能
  (2)はhttp
  SSL証明書不要
+ Full
  (1)(2)ともにhttpsで通信
  ブラウザにてhttpでアクセスした場合も、httpsで通信する
  SSL証明書は必要だが、適当（オレオレ証明書等）でも問題なし
+ Full(strict)
  (1)(2)ともにhttpsで通信
  ブラウザにてhttpでアクセスした場合も、httpsで通信する
  SSL証明書は必要、CA認証された証明書か、Cloudflareで作成した証明書でないとエラーとなる
:::

## １．CloudflareでのSSL証明書生成の前準備

CloudflareにログインしHome画面を開き、対象のドメイン名をクリックし管理画面を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/b2851bff-a854-4f4f-c9de-5f74854e5903.png)

左メニューから、「SSL/TLS」＞「Origin Server」を選択し、下記画面を表示する
画面真ん中あたりの青いボタン「Create Certificate」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/07b199fc-1009-4d30-a8ba-393536541c1e.png)

オプションを選択し、「Create」ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/0423cfe5-e1af-5b3b-2d0f-829a541f7f90.png)

:::note info
オプションの内容
+ Generate private key and CSR with Cloudflare
  →　ここでキーとCSRを生成する、生成はRSA暗号(2028Byte)を使用する
+ Hostnames
  →　認証するホスト名を編集、デフォルトでOK
+ Select a validity period for your certificate
  →　有効期限の設定、デフォルトでは15年、有効期限前にCloudflare側で自動更新してくれる
:::

SSL証明書を生成するために必要なCSRとkeyが生成されるためコピーしておく
（Private keyはこの画面を閉じると見られなくなるので注意）

OKボタンを押すと最初の画面に戻る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/615e4192-4884-1242-286a-20ae6f9fcc05.png)

## ２．Cloudflareのルート証明書（中間証明書）の取得
:::note info
必要な理由
CA　→　Cloudflare　→　自サーバ　の流れで認証証明書を利用するため
Cloudflare自身の証明書も必要となる。
（オレオレ証明書の場合、生成した証明書自身がCAになるので中間証明書は不要だった）
:::

下記アドレスから、「Cloudflare Origin CAルート証明書」にある
「Cloudflare オリジン RSA PEM」をクリックして「origin_ca_rsa_root.pem」をダウンロードする
https://developers.cloudflare.com/ssl/origin-configuration/origin-ca#cloudflare-origin-ca-root-certificate


## ３．SSL証明書の設定
### 証明書ファイル、キーファイルの作成
Raspberry Piにsshで接続し下記コマンドを実行し証明書ファイルとキーファイルを格納するフォルダを作成する（すでにある場合は不要）
```shell:コマンド
$ sudo mkdir /etc/apache2/ssl（すでにフォルダがあれば不要）
```

証明書ファイルを作成する（既にファイルが格納されていれば削除等する）
```shell:コマンド
$ cd /etc/apache2/ssl
$ sudo vi server.pem（ファイル名はなんでもいい）
```

```text:server.pem
（手順１でコピーした「Original Certificate」の方を貼り付ける）
```

キーファイルを作成する（既にファイルが格納されていれば削除等する）
```shell:コマンド
$ sudo vi server.key（ファイル名はなんでもいい）
```

```text:server.key
（手順１でコピーした「Private Key」の方を貼り付ける）
```


手順２で取得したCloudflareの証明書「origin_ca_rsa_root.pem」を下記に保存し、
権限を他と合わせる
```shell:パス
$ sudo mv (保存パス) /etc/apache2/ssl（もしくはSFTPなどで保存）
$ sudo chmod 644 origin_ca_rsa_root.pem
```

### Apacheの設定
SSLの設定ファイルを開く（まだApacheのSSL対応をしていない場合は[こちら](https://qiita.com/ktrnet/items/e21e1a5f07dc5e8b8289)を参考に設定）
※人によってファイル名が異なるため注意
```shell:コマンド
$ sudo vi /etc/apache2/sites-available/default-ssl.conf
```

下記例では、すでにSSL証明書ファイルが設定されていたため記述を削除して追記している
```diff_conf:default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
        ～省略～
        SSLEngine on

-       SSLCertificateFile    /etc/apache2/ssl/server.crt
-       SSLCertificateKeyFile /etc/apache2/ssl/server.key
+       SSLCertificateFile      /etc/apache2/ssl/server.pem
+       SSLCertificateChainFile /etc/apache2/ssl/origin_ca_rsa_root.pem
+       SSLCertificateKeyFile   /etc/apache2/ssl/server.key
        
        ～省略～

        </VirtualHost>
</IfModule>
```

設定完了後、Apacheを再起動する
```shell:コマンド
$ sudo service apache2 restart
```


## ３．SSL証明書の確認

サイトにアクセスして下記画像のところから証明書を確認
（画像ではGoogle Chromeを使用）

アドレスバー左のアイコン→「この接続は保護されています」→「証明書は有効です」
から確認可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492164/fc40649a-91d8-b711-b42a-c32fdd6df0c0.png)

:::note warn
暗号化モードが、Full(strict)で証明書が間違ってる場合、エラー画面が表示される
ProxyがDNS onlyの場合、「保護されていない通信」と表示される
:::

以上