DjangoプロジェクトのSSL化

サーバー情報

【さくらのVPS】
メモリ:8GB
ストレージ:SSD 400GB
CPU:6コア

OS

CentOS7 x86_64

インストール

Python:
pip:
git:
psql:
PostgreSQL:
Nginx:

3.6.8
9.0.3
1.8.3.1
9.2.24
9.2.24
1.16.1

仮想環境

Django:
Gunicorn:

3.1.4
20.0.4

Webアプリケーションで必須のSSL化を実施します。

今回は無料版として好評な「Let’s Encrypt」を利用します。

1.「Let's Encrypt」のインストール

手順1.

Nginxを停止させます。

systemctl stop nginx

Nginxを停止させます。

systemctl status nginx

停止していることを確認します。

手順2.

「Let’s Encrypt」を半自動で設定してくれる Certbot のプログラムを GitHub からダウンロードします。

cd /user/local

ダウンロードに備えてディレクトリを移動します。

git clone https://github.com/certbot/certbot

GitHubからダウンロードを行います。

手順3.

ダウンロード実施後に、証明書の発行などの設定を行います。

./certbot-auto certonly --standalone -d ▼▼▼ -m (メールアドレス) --agree-tos -n

certonly --standalone

証明書の発行を実施

-d

設定するドメイン名

-m

メールアドレス

--agree-tos

利用規約に同意

-n

プログラム実行時に “Yes or No” を尋ねない

“Congratulations!”と表示されれば成功!

手順4.

作成された証明書をNginxに設定します。

cd /etc/letsencrypt

「Let’s Encrypt」のディレクトリを移動します。

ls -l

「live/」ディレクトリが存在することを確認します。

ll live

「▼▼▼/」(ドメイン)のディレクトリが存在することを確認します。

ls live/▼▼▼

「fullchain.pem」、「privkey.pem」が存在することを確認します。

※SSLの設定で必要なキーファイルの保存場所:/etc/letsencrypt/live/▼▼▼/

手順5.

作成された証明書をNginxに設定します。

vi /etc/nginx/conf.d/☆☆☆.conf

Nginxの設定ファイルを編集します。

≪SSL化前≫

server {
 listen 80;
 server_name ▼▼▼(ホスト名);

 location /static {
  alias /usr/share/nginx/html/static;
 }

 location /media {
  alias /usr/share/nginx/html/media;
 }

 location / {
  proxy_pass http://unix:/home/☆☆☆/☆☆☆.sock;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_set_header X-Forwarded-Proto $scheme;
 }
}

≪SSL化対応≫

server {
 listen 443 ssl;
 server_name ▼▼▼(ホスト名);

 ssl_certificate   /etc/letsencrypt/live/▼▼▼/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/▼▼▼/privkey.pem;

 location /static {
  alias /usr/share/nginx/html/static;
 }

 location /media {
  alias /usr/share/nginx/html/media;
 }

 location / {
  proxy_pass http://unix:/home/☆☆☆/☆☆☆.sock;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_set_header X-Forwarded-Proto $scheme;
 }
}

ポート番号をSSL化用の443(HTPS)に変更します。

※実施前にファイアウォールにおいて443番を開放しておいて下さい。

手順6.

Nginxを再起動させます。

systemctl restart nginx

Nginxを再起動させます。

systemctl status nginx

起動状況を確認します。

「https://▼▼▼」にアクセスし、SSLマークがついていればOKです。

手順7.

SSL証明書は一定期限ごとに更新が必要になるので、更新作業を自動化します。

3ヶ月更新が多いですが、今後90日ごとの更新に変更になります。

そのため、今回はSSL証明書の有効期限(1ヶ月ごと)の証明書更新を自動化設定します。

※更新期限の1か月前に実施しても無効化されるため、更新期間は慎重に決めましょう。

crontab -u root -e

crontabは定期的にジョブを実行するようスケジュールするcronを設定するコマンドです。

crintabのオプション一覧は以下の通りです。

-e

cronを設定します

-l

設定されているcronを表示します

-r

設定されているcronを削除します

-u

cronを設定するユーザーを指定します

00 04 01 * * ./certbot-auto renew && systemctl restart nginx

00 04 01(hhMMdd):登録したcronを実行する時間を指定します。

この場合だと、「毎月1日の4時00分に実行する」という設定となります。

日時の後には実行したいコマンド(systemctl restart nginx)を指定しています。