DjangoプロジェクトのSSL化

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

サーバー情報

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

OS

CentOS7 x86_64

インストール

         Python:3.6.8
                pip:9.0.3
                 git:1.8.3.1
                sql:9.2.24
PostgreSQL:9.2.24
           Nginx:1.16.1

仮想環境

   Django: 3.1.4

Gunicorn: 20.0.4

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

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

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

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

手順1.

Nginxを停止させます。

systemctl stop nginx

Nginxを停止させます。

systemctl status nginx

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

手順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からダウンロードを行います。

手順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!”と表示されれば成功!

手順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/▼▼▼/

手順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番を開放しておいて下さい。

手順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です。

手順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)を指定しています。

手順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)を指定しています。