Symbol Dual を Nginx で SSL 化する


## Nginx と Certbot のインストール

```bash
sudo apt install nginx certbot
```

## バーチャルホストの設定

`/etc/nginx/sites-available`にファイルを作成します。ファイル名は分かりやすいようホスト名にすれば良いかと思います。

```bash
sudo vi /etc/nginx/sites-available/chroche_harvestasya_com
```

証明書を発行するための 80 ポート待ち受けを作成します。

```chroche_harvestasya_com
server {
        listen 80;
        server_name chroche.harvestasya.com;

        root /var/www/html;
        index index.html;

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/tnoce/;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }
}
```

何でもいいので、`/var/www/html/index.html`を作成します。

```bash
sudo vi /var/www/html/index.html
```

バーチャルホストを有効化します。

```bash
sudo ln -s /etc/nginx/sites-available/chroche_harvestasya_com /etc/nginx/sites-enabled
```

nginx の設定ファイルを再読み込みします。

```bash
sudo systemctl reload nginx
```

`/var/www/html/index.html`が表示されるか確認します。

```bash
curl -s http://chroche.harvestasya.com
```

ポートを開放しておきます。

```bash
sudo ufw allow 80
```

## 証明書の取得

ディレクトリの作成

```bash
sudo mkdir /var/www/tnoce
```

初回はアドレスを登録していないので`--email`オプションを付けてアドレスを設定してください。また、3 回ほど失敗すると数日取得出来なくなるので`--dry-run`を付けて必ず取得出来ることを確認してください。

```bash
sudo certbot certonly --webroot -w /var/www/tnoce -d chroche.harvestasya.com --email xxxxxxxxxxxxxxx@gmail.com --dry-run
```

`The dry run was successful.`が表示されれば問題ありません。`--dry-run`を外して実際に証明書を取得します。

```bash
sudo certbot certonly --webroot -w /var/www/tnoce -d chroche.harvestasya.com --email xxxxxxxxxxxxxxx@gmail.com
```

証明書は`/etc/letsencrypt/live`に作成されます。

## バーチャルホストに SSL の設定

```bash
sudo vi /etc/nginx/sites-available/chroche_harvestasya_com
```

```sakia_nis1_harvestasya_com
server {
        listen 80;
        server_name chroche.harvestasya.com;

        location / {
                return 404;
        }

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/tnoce/;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }
}

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

server {
        listen 3001 ssl http2;
        server_name chroche.harvestasya.com;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        location = /ws {
                proxy_pass                      http://localhost:3000;
                proxy_http_version              1.1;
                proxy_set_header Host           $host;
                proxy_set_header Upgrade        $http_upgrade;
                proxy_set_header Connection     $connection_upgrade;
                proxy_read_timeout              300s;
        }

        location / {
                proxy_pass http://localhost:3000;
        }

        ssl_certificate /etc/letsencrypt/live/chroche.harvestasya.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/chroche.harvestasya.com/privkey.pem;
}
```

nginx の設定ファイルを再読み込みします。

```bash
sudo systemctl reload nginx
```

## ポート開放

```bash
sudo ufw allow 3001
```

## Certbot の renew のタイミングで Nginx を再読み込み

```bash
sudo vi /lib/systemd/system/certbot.service
```

`ExecStart`の末尾に`--post-hook "systemctl reload nginx"`を追加します。

```certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://certbot.eff.org/docs
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew --no-random-sleep-on-renew --post-hook "systemctl reload nginx"
PrivateTmp=true
```

念のためデーモンリロードする。

```bash
sudo systemctl daemon-reload
```