Let's EncryptでNginx + Djangoを使ったブログのSSL証明書を取得した話

2020年5月14日

Django
サーバー
Nginx

Let's EncryptにてNginxで動くブログのSSL証明書を取得する方法

どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!

今回はDjango + Nginxで作成したブログにLet's EncryptのSSL証明書を取得した方法を解説して行きたいと思います。
全て順調に行けば10分程度で終わってしまいます。

ブログサイトやHPを作成された方は必ず通る道だと思っていますが、ウェブサイトは信頼性がとても重視されています。

新しく公開するウェブサイトを閲覧してくれる人たちに対して、「セキュアで安全ですよ。」「安心してアクセスしてください。」と知ってもらう必要があります。 

セキュリティーが確保されていないウェブサイトに接続するのは怖いですよね?
あなたは「このサイトは安全ではありません」と表示されるサイトにアクセスしたいですか?

いいえ、少なくとも私はしたくありません。

Yuki

そんな時に安心してインターネット上の人々から安心して自分のサイトにアクセスしてもらえるようにhttps化する必要があるのです。

https化って何??

通常インターネットはHTTPという通信でサイトにアクセスしたりしています。
そのhttp通信をより安全に行うために、httpsという通信方法が誕生しました。

ではどうやって実現させるんでしょうか?


方法は簡単で、サイトを公開する者が、運営するサイトの安全性を証明するためのSSL証明書 というものを取得することで、アクセスしてくれる人たちの通信の安全性を確保することによって実現します。

SSL証明書には有料と無料のものがあり、無料のものでも十分問題ありません。
今回はその無料のSSLを取得出来る「Let's Encryptというものを使ってhttps化する方法を紹介していきます。

記事を読み終わる時には、あなたのサイトのhttps化も完了です! では早速取り掛かりましょう!!!


また、これまでの記事では当ブログを作成した時の手順について説明しています。

▽▽▽ サーバーを用意した時のお話し ▽▽▽


▽▽▽ Djangoでブログを構築した時のお話し ▽▽▽


では早速やっていきましょう!!

前提:
1.取得したいドメインがDNSで名前解決できる
2.Nginxが既に導入されている

[ 目次 (開く) ]

Let's Encryptで無料のSSL証明書を取得するまでの手順

今回の環境:
1. VPS(CentOS8)
2. Nginx(1.16.1)
3. Django(3.0.2)

補足:
分かりやすいように、基本コマンドを叩く際はフルパスで記載します。
※一部を除く

Let's Encryptをインストール

1.前準備をしよう!(Nginx編)

現在: /(ルート)
まず最初に、Nginxが起動している場合は停止させておきましょう。

# systemctl stop nginx

Nginxのステータスは下記のコマンドで確認出来ます。

# systemctl status nginx

2.前準備をしよう!(Port編)

現在: /(ルート)
次に、httpとhttpsのポートを開けておきましょう。

# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https --zone=public
# firewall-cmd --reload ←反映

3.Certbotをインストールしよう!

現在: /(ルート)

# yum install epel-release
# sudo yum install certbot

↓↓↓エラーが出る場合は --skip-broken をつけて試してください。↓↓↓
# sudo yum install certbot --skip-broken

Let's EncryptのSSL証明書を作成

1.SSL証明書を作成しよう!

現在: /(ルート)
メールアドレスなど、いくつか質問があるので回答しましょう。

# certbot certonly --standalone -d example.com(自分のドメイン名)

無事に成功すると下記のメッセージの表示とともに、2つのファイルが生成されます。

.
.
.
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/*.com/fullchain.pem
...続く
【生成されたファイル】
/etc/letsencrypt/live/example.com/fullchain.pem;
/etc/letsencrypt/live/example.com/privkey.pem;


2.Nginxの設定をしよう!

httpアクセス時とhttpsへリダイレクトする設定をしておきましょう。 また、先ほど生成された証明書をここで指定します。

/etc/nginx/conf.d/myBlog.conf
server {
    listen 80;
    listen [::]:80;
    charset utf-8;
    client_max_body_size 75M;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen  443 ssl;
    server_name           example.com;
    charset utf-8;
    client_max_body_size 75M;
    ssl_certificate       /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key   /etc/letsencrypt/live/example.com/privkey.pem;
}

3.Nginxを再起動して確認しよう!

現在: /(ルート) 最後に下記のコマンドでNginxを再起動したら、https://example.com にアクセスしてみましょう。

# systemctl start nginx

おまけ SSL証明書を自動で更新

Let's Encryptは3か月で証明書が切れるので、そのたびに更新する必要があります。
なので、cronで定期的な自動更新を行うと良いです。

1.cronを登録しよう!

現在: /(ルート) このコマンドでファイルを開いてから...

# crontab -e

今回は毎月1日のAM2時に実行するよう設定しています。

--pre-hookで、更新処理の前に1度だけ実行されます。
--post-hookで、更新処理の後に1度だけ実行されます。
ここでは、Nginxを更新前に停止、更新後に起動させています。

00 2 1 * * certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

さいごに

以上ですべての作業が終了です。

今回は、DjangoブログをNginxで稼働させているケースにおいてのSSL証明書の取得方法を紹介しました。
意外と簡単と出来ましたね。
Webサーバーを停止させずに証明書を更新する方法もあるので、興味のある方は調べてみてください。

お疲れ様でした!