Let's Encryptを使用したSSL証明書の発行方法

## 概要

Let's EncryptでSSL証明書の発行をする際に、手順書などがなく、その都度調べる必要がありました。そのため、手順の明確化を図り、作業の効率を上げるために作成します。

## 目次

1. [SSL証明書とは](https://www.notion.so/Let-s-Encrypt-SSL-579864b5962142cdbcab9e6c17218d87?pvs=21)
2. [事前準備](https://www.notion.so/Let-s-Encrypt-SSL-579864b5962142cdbcab9e6c17218d87?pvs=21)
3. [手順](https://www.notion.so/Let-s-Encrypt-SSL-579864b5962142cdbcab9e6c17218d87?pvs=21)
4. [SSL証明書の更新方法](https://www.notion.so/Let-s-Encrypt-SSL-579864b5962142cdbcab9e6c17218d87?pvs=21)
## １．SSL証明書とは

SSL証明書は「認証局」と呼ばれる第三者機関によって発行される**電子証明書**です。

「このドメインはちゃんと実在しており、管理者も定められているよ」ということを、第三者機関が確認・証明してくれるものであり、通常は、証明機関から年単位で有償で購入する形になるのですが、Let's Encryptというサービスを使うとSSL証明書を無料で取得することが出来ます。

ただし、有効期間は発行日から３か月となりますので、注意が必要です。

## ２．事前準備

①ドメインの確認
更新したいドメイン名を確認しておくこと。
作成されていない場合は、作成できる人に頼むか、自身で作成を行ってください。

②ファイアウォール設定の確認
通常のhttpでは、通信は「80番」という通信ポートを使用するのに対し、httpsの通信は「443番」という通信ポートを使用します。

ファイアウォールの設定によっては、443ポートが閉じられていることがありますので、その場合は解放するようにしましょう。

現在の設定の確認

```
 firewall-cmd --list-all
```

設定されていなかった場合のポート開放方法

```
 firewall-cmd --zone=public --add-port=ポート番号/tcp --permanent
 firewall-cmd --reload
```

③サーバーのポート設定の確認
サーバー自体にもファイアウォールと同じようにポートの設定項目があるので、httpとhttpsを許可しておきましょう。

## ３．手順

**①certbotのインストール**

```
yum install epel-release
yum install certbot python-certbot-apache
```

**②certbotのテスト実行**

```
certbot certonly --agree-tos --webroot -w ドキュメントルート -d ドメイン名　--dry-run

オプションの意味
--agree-tos　利用規約に同意
-w ドキュメントルートを指定
-d ドメインを指定
--dry-run テスト実行
```

`※テスト実行は必ず行いましょう。`
`テストを行わず、作成に何度か失敗すると、１週間証明書の作成ができなくなります。`

上記コマンドを入力すると次に、メールアドレスを入力するように求められます。 

証明書の有効期限が近づいた際にお知らせしてくれたりすることなどに利用されます。

※２回目以降は１回目に入力したメールアドレスが自動的に入力されます。

```
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): メールアドレスを入力
```

成功した場合下記のようなメッセージが表示されます。

```
IMPORTANT NOTES:
 - The dry run was successful.
```

**③certbotの本番実行**

```
certbot certonly --webroot -w ドキュメントルート -d ドメイン名
```

証明書の取得に成功した場合、**`/etc/letsencrypt/live/ドメイン名/`** ディレクトリに証明書ファイルが保存されます。

**④Apacheへの設定**

`/etc/httpd/conf.d/`配下に任意の名前で設定ファイルを作成し、下記のように設定を追記します。

```
<VirtualHost *:443>
        ServerName ドメイン名:443
        DocumentRoot /var/www/html/プロジェクト名/public
        <Directory /var/www/html/プロジェクト名4/public>
                AllowOverride All
                Order Allow,Deny
                Allow from All
        </Directory>
        ErrorLog /var/log/httpd/error-プロジェクト名.log
        SSLEngine on
        #SSLProtocol all -SSLv2

        SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem
</VirtualHost>
```

⑤Apacheの再起動

```
systemctl restart httpd
```

⑥サイトの確認

https://[ドメイン名]/ にアクセスし、URLの欄に鍵マークがついていれば

 Let’s Encrypt での証明書の設定は終了です。
![https確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841176/d560b1f9-95a1-1291-32b5-a1d64b45b516.png)

⑦証明書期限の確認方法

「鍵マーク」→「この接続は保護されています」→「証明書は有効です」の順に進んでいく。証明書ビューアが表示されます。そこで、有効期限の確認が出来ます。

![証明書メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841176/9926142b-b551-345c-5662-f8a2b8531af1.png)
![証明書の有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841176/3cdab421-b367-af3f-7a66-f09851e9b3b5.png)
![証明書ビュアー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841176/9549cd15-e445-5786-17e2-3d7715b22218.png)

## ４．SSL証明書の更新方法

無料で SSL/TLS 証明書を発行できる Let’s Encrypt の証明書有効期限は3ヶ月間です。

有効期限が近づくと Let’s Encrypt からその旨をお知らせするメールが届くわけですが、毎回手作業で certbot renew コマンドを実行するのは面倒です。 

ここでは、Let’s Encrypt の証明書の更新を cron で自動化する手順について解説します。

①crontabを開く

```
crontab -u root -e
```

②編集画面が開いたら下記内容を追記し、保存する

```
0 0 1 * * certbot renew && systemctl restart httpd
```

cron にこのように設定すると、定期的に自動で証明書を更新してくれます。 
ここでは例として、毎月1日の深夜0:00に証明書を更新するようにします。

③設定の適用を行う

```
systemctl restart crond
```

以上で設定は終了となります。


- おまけ）cronについて
    
    cronの基本
    
    cronは「* * * * *」の5箇所を指定して、起動時間を設定します。
    
    左から「分」「時」「日」「月」「曜日」を指定します。
    
    ```
    # cronの起動時間設定
    * * * * * （起動したい処理）
    | | | | |
    | | | | |- 曜日
    | | | |--- 月
    | | |----- 日
    | |------- 時
    |--------- 分
    ```
    
    上記5箇所に値を設定することで、様々なタイミングで処理を起動できます。