【Centos7】【Let’sEncrypt】Nginxを入れてSSLを有効にするまで

Centos7でNginxをインストールして、Let’sEncryptによる無料証明書を発行して適用するところまで書きます。

Nginxのデフォルトのドキュメントルートは `usr/share/nginx/html/`ですが、今回は `/var/www/html`に変更します。
特に深い理由は無いですが、デフォルトのドキュメントルートが階層が深くてめんどくさいというのが、大きな理由です。あとApacheのドキュメントルートに慣れているので。

また今回はCentos7を使っていますが、Ubuntuであれば`yum`を`apt`に変えれば大抵のことは大丈夫だと思います。

Oracle Cloudを使用している人は、ファイヤーウォールの設定などをする必要があります。
必要に応じてぐぐってください

**当然ながら独自ドメインも必要です。**

# 動作環境

* MacOS 10.15.6
* Centos7
* Nginx 1.16.1


ホストOSはWindowsでも大丈夫です。VMなのであまり関係ないです。

# Nginx

## インストール

Nginxをインストールします

```shell
$ sudo yum -y install nginx
```

`-y`オプションは途中で聞かれる、インストールしても良いですか？ってやつを自動で入力してくれるやつです。

インストールが終わったら起動と、自動起動の設定を行います
自動起動の設定をしていないと、OSをシャットダウンや再起動した時にまた手動で起動しなければならないので、めんどくさいです。


```shell
$ sudo systemctl start nginx //起動
$ sudo systemctl enable nginx //自動起動
```

この時点でブラウザで自分のIPアドレスにアクセスすると、Nginxが動いているのが確認できます。

## ドキュメントルート変更

Nginxの設定ファイルを変更してドキュメントルートを変更します。

まずは今回設定したいディレクトリが`/var/www/html`なのでそのディレクトリを作ります。

```
$ sudo mkdir -p /var/www/html
```

次に設定ファイルをいじります。
場所は環境によるかもしれませんが、私の場合は `/etc/nginx/nginx.conf`です
設定ファイルを変更する前には必ずバックアップを取る癖をつけましょう

```shell
$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_org
```

変更していきます。
私の環境では38行目くらいからhttpの設定項目だったので、そこの`root`のディレクトリを変更します。
念の為コメントアウトして書き足します。

```shell
$ sudo vim /etc/nginx/nginx.conf

 38     server {
 39         listen       80 default_server;
 40         listen       [::]:80 default_server;
 41         server_name  _;
 42         #root         /usr/share/nginx/html;
 43         root         /var/www/html;
```

設定ファイルを変更したら再読み込みします。
この再読み込みが失敗するときはなにかしら間違っているときです。

```
$ sudo systemctl reload nginx
```

この段階でブラウザで確認しても、何もひょうじされないか、404になると思います。
それもそのはず、`/var/www/html`にはなにもないからです。
もともとあったデフォルトのぺージをコピーしましょう


```
$ sudo cp /usr/share/nginx/html/index.html /var/www/html/index.html
```

これでOKなはずですが、アクセスするとなぜかエラーが出ます。

# SELINUX

SELINUXというセキュリティ機能が邪魔をしてきます。
正しく設定すればいいヤツなのでしょうが、これのせいで意図した挙動にならないことが多々あるので、思い切ってOFFにします\\


```
$ sudo cp  /etc/selinux/config /etc/selinux/config_org //バックアップ
$ sudo vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
### Disalbe SELINUX begin
##SELINUX=enforcing
SELINUX=disabled
### Disalbe SELINUX end
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

`SELINUX=disabled`を追記します

書き直したら、再起動しましょう

```
$ sudo reboot
```


これでブラウザにアクセスすると閲覧できるようになります。


# ドメインの設定

これはお名前ドットコムなど購入した先のサービスでいろいろあると思います。
AWSであれば、Route53などですね。さまざまなので割愛します

# Let’sEncrypt

現状はこのように`保護されていません`と表示されると思います。

![スクリーンショット 2020-09-04 20.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492847/318b85ff-37c5-88d3-e1ed-9a424c74d1ce.png)


このままだといろいろ問題があるので、`http://~~`から`https://~~`にします

# Let’sEncrypt

## インストール


certbotをインストールします

```shell
$ sudo yum -y install certbot
```

証明書を発行します
`-w`の後ろはドキュメントルート、 `-d`の後ろはドメイン名、`--email`はメールアドレスを入力します


```shell
sudo certbot certonly --webroot -w /var/www/html -d hoge.example.com --email hoge@example.com
```

その後は利用規約に同意するか聞かれるので、`y`
Issueなどのお知らせメールを送ってもいいかきかれるので、よければ`y`、嫌なら`n`を入れます

`Congratulations!`と表示されたら成功です。

## 設定ファイルの変更

以下を追記します。
3箇所変更する項目があるので、注意してください

```
server {
listen  443 ssl;
server_name     hoge.example.com;
ssl_certificate         /etc/letsencrypt/live/hoge.example.com/fullchain.pem;
ssl_certificate_key     /etc/letsencrypt/live/hoge.example.com/privkey.pem;
root   /var/www/html;
}
```

これでNginxを再起動すれば完了です。

```
$ sudo systemctl restart nginx
```

## 301リダイレクト

現状だと`http://~~`と`https://~~`でどちらもアクセスできてしまいます。
`http://~~`の方にアクセスさせる必要はないので、`http`でアクセスしてきた時にリダイレクトする処理を書いてあげます

301リダイレクトとは、恒久的なリダイレクトを意味します

設定ファイルに追記します

```
$ sudo vim /etc/nginx/nginx.conf

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        #root         /usr/share/nginx/html;
        root         /var/www/html;
        return 301 https://hoge.example.com/$request_uri; //追記
}
```


このようにすればリダイレクトされます！


## 証明書の自動更新

Let’sEncryptは無料が故に、90日で期限が切れます。
なので、自動更新できるように、`cron`で設定します。

```
$ sudo crontab -e

00 04 01  * * certbot renew --force-renew --webroot-path /var/www/html/ --post-hook "systemctl reload nginx"
```

これで一通り完了です

# 参考

[CentOS7 SELinuxの無効化手順](https://qiita.com/mattsun/items/470581ff34f87c7eb21d)
[CentOS7 の Nginx で Let's Encrypt を使う](https://qiita.com/ekzemplaro/items/15bceed7c5612fe039d5)
[cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)