Apache2でフリーのSSL(Let's Encrypt)を導入する

## 概要
ウェブのSSL化を簡単かつ無料行えるLet's Encryptの導入方法をまとめる。

## 環境
OS: Ubuntu 16.04.7 LTS

## Certbotのインストール
```bash
$ sudo install certbot
```

## 証明書の初回作成
```bash
$ certbot certonly --agree-tos --non-interactive -d [ドメイン名] --webroot -w [ドキュメントルートのパス] --email [管理者のメールアドレス]
```
ドメイン名の例 ：www.example.com
ドキュメントルートのパスの例：/var/www/html

## 作られたファイルの一覧
証明書類の場所：**/etc/letsencrypt/live/[ドメイン名]**

|ファイル名|種類|説明|
| :-- | :-: |:-:|
|cert.pem|SSLCertificateFile|サーバ証明書|
|chain.pem|SSLCertificateChainFile|中間CA証明書|
|fullchain.pem|SSLCertificateFile|サーバ証明書＋中間CA証明書を結合したもの|
|privkey.pem|SSLCertificateKeyFile|サーバ証明書の秘密鍵|

## SSLモジュールとバーチャルホストの有効化
```bash
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart
```
## nmapで通信ポートの確認
```
$ nmap localhost
Starting Nmap 7.01 ( https://nmap.org ) at 2021-01-20 15:39 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00014s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
21/tcp  open  ftp
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
```
確認出来たらブラウザを開いてhttpsでアクセスし動作確認する。

### httpsでアクセスできない場合は以下を試す

ufwで443を許可する

```bash
$ sudo ufw status
    Status: active
    To                         Action      From
    --                         ------      ----
    20                         ALLOW       Anywhere
    21                         ALLOW       Anywhere
    22                         ALLOW       Anywhere
    80                         ALLOW       Anywhere
    20 (v6)                    ALLOW       Anywhere (v6)
    21 (v6)                    ALLOW       Anywhere (v6)
    22 (v6)                    ALLOW       Anywhere (v6)
    80 (v6)                    ALLOW       Anywhere (v6)

$ sudo ufw allow 443
    Status: active
    To                         Action      From
    --                         ------      ----
    20                         ALLOW       Anywhere
    21                         ALLOW       Anywhere
    22                         ALLOW       Anywhere
    80                         ALLOW       Anywhere
    443                        ALLOW       Anywhere      ← https
    20 (v6)                    ALLOW       Anywhere (v6)
    21 (v6)                    ALLOW       Anywhere (v6)
    22 (v6)                    ALLOW       Anywhere (v6)
    80 (v6)                    ALLOW       Anywhere (v6)
    443 (v6)                   ALLOW       Anywhere (v6) ← https

$ sudo ufw reload
```
**※この段階ではhttpsでアクセスしても保護されていない通信となる。**

## Apache2の設定
```bash
$ cd /etc/apache2/sites-available/
$ sudo nano default-ssl.conf
```

下記部分を修正

```default-ssl.conf
SSLCertificateFile       /etc/letsencrypt/live/[ドメイン名]/cert.pem
SSLCertificateKeyFile    /etc/letsencrypt/live/[ドメイン名]/privkey.pem
SSLCertificateChainFile  /etc/letsencrypt/live/[ドメイン名]/chain.pem  ←コメントアウトして編集
```

## 設定ファイルをチェックしApacheを再起動
```bash
$ sudo apache2ctl configtest
$ sudo service apache2 restart
```
## 証明書の更新設定
Let's Encryptが発行する証明書の有効期限は90日間と短い為、自動で更新されるように設定する。

```bash
$ cd /etc/letsencrypt
$ sudo nano letsencrypt-renew.sh
```
```letsencrypt-renew.sh
#!/bin/sh
certbot renew -q --no-self-upgrade --post-hook "service apache2 restart"
```

```bash
$ sudo chmod 0700 letsencrypt-renew.sh
$ sudo crontab -e

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
```
エディターは2を選択する。

```letsencrypt-renew.sh
# 一番最後の行に追加する
# 毎日3時に更新チェックを実行する
0 3 * * * /etc/letsencrypt/letsencrypt-renew.sh
```

# 常時SSL化する
httpからhttpsへ自動的にリダイレクトされるようにする。
apache2.confで.htaccessの利用を許可する。

```bash
$ sudo nano /etc/apache2/apache2.conf
```
```apache2.conf
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All     <-- NoneからAllへ変更
        Require all granted
</Directory>
```
.htaccessでリダイレクトさせる。

```bash
$ sudo nano /var/www/html/.htaccess
```
```.htaccess
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{HTTPS} off
  RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
```

## 最後にApache2を再起動する
```bash
$ sudo service apache2 restart
```

## リファレンス
https://qiita.com/ariaki/items/5680cb6da6223844af4e
https://www.yokoweb.net/2018/06/01/ubuntu-18_04-server-apache-ssl/