\ ポイント最大11倍! /

【Django + Let’s Encrypt】CerbotでHTTPS化するための手順

  • ブラウザで警告が表示されてる
  • 暗号化されていないので不安
  • ユーザー管理しているのでちゃんとしておきたい

サイトを公開後にまず取り組むべきは、HTTPS化です。

HTTPS化しない場合のデメリットは次の通り。

  • SEOの評価が下がる
  • セキュリティが脆弱
  • ブラウザで『保護されていない通信』と表示

特にブラウザの警告メッセージのインパクトは大きく、訪問者は不安を感じて離脱することも多いです。

そのため、現代のWebアプリケーションではHTTPS化は必須

本記事では、Certbotという無料証明書を取得してHTTPS化する方法をご紹介します。

【Let’s Encrypt】Cerbotを使ってHTTPS化するための手順

本記事は以下が終わっている方を対象にしています。

  • VPSの契約
  • VPSへのSSH接続
  • デプロイ

これらがまだの方は、別記事を参考に進めてみて下さい。

1. Cerbotのインストール

Certbotを使って、Let’s Encryptという認証局から無料でSSL認証書を発行します。

ついでにWebサーバー側の設定も自動でやってもらいましょう。

まずはCertbotのインストールから。

sudo apt-get install certbot python3-certbot-nginx

Nginxを停止しておきます。

sudo apt-get install certbot python3-certbot-nginx

2. Certbotの実行

続いてCertbotを実行します。

sudo certbot certonly --standalone -d example.com

すると、いくつか質問が表示されるので答えていきましょう。

メールアドレス

メールアドレスの登録が必須なので、適当なものを登録しておきましょう。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

規約への同意

利用規約を確認して、同意します。

You must agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:

メール受信設定

案内メールの受信をしたいかどうかを聞かれます。

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot?

すべて終わるとCongratulations!と表示され、証明書とキーの保存場所が表示されます。

3. Nginxの設定変更

HTTPSに対応するよう、Nginxの設定ファイルを修正しましょう。

sudo vi /etc/nginx/conf.d/mysite.conf

内容は例えば以下のようにします。

server {
    listen 80;
    listen [::]:80;
    server_name ドメイン;
    return 301 https://$host$request_uri;
}
 
server {
    listen  443 ssl;
    server_name ドメイン;
 
    ssl on;
    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://127.0.0.1:8000;
        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;
    }
}

止めておいたNginxを起動します。

sudo systemctl start nginx

4. ファイアウォールのHTTPSポートを開放

Ubuntuのファイアウォール(ufw)で、HTTPS用の443番ポートを開放します。ポートを開放します。

sudo ufw allow https

設定が成功したか、以下のコマンドで確認しましょう。

ufw status

設定を反映させるため、Nginxをリロードして下さい。

sudo systemctl reload nginx

5. SSL証明書の自動更新

Let’s EncryptのSSL証明書は期限が3ヶ月です。

Certbotには自動更新機能が付いているので、基本は何もする必要はありません。

ちゃんと設定できているかだけ、確認しておきましょう。

sudo systemctl status certbot.timer

以下の用にactiveが表示されていれば、自動更新になっています。

● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset:>
Active: active (waiting) since Fri 2023-03-10 14:24:13 JST; 39min ago
Trigger: Sat 2023-03-11 00:44:22 JST; 9h left
Triggers: ● certbot.service

確認が終わったら、qを押して抜けましょう。

6. アプリケーションサーバーの起動

Gunicornの場合は、以下のコマンドで立ち上げます。

gunicorn config.wsgi:application --bind 127.0.0.1:8000 --daemon

トラブル時のチェックポイント

Certbotの設定後にうまく動かない場合は、以下の設定を見直して下さい。

Nginxの設定ファイルが正しいかを確認

以下のコマンドでNginxの設定ファイルに誤りがないかを確認しましょう。

sudo nginx -t

Nginxが正常に動作しているかを確認

以下のコマンドでNginxの動作状態を確認できます。

sudo systemctl status nginx

もし正常に動作して以下なったら、以下のコマンドでログを確認しましょう。

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

Nginxをリロード

試しにリロードしてみましょう。これだけで治ることもあります。

sudo systemctl reload nginx

アプリケーションサーバーは正常に動作しているか

Gunicornの動作確認用コマンドは以下の通り。

必要なポートは解放されているか確認

以下のコマンドでポートが解放されているか確認できます。

sudo netstat -tuln | grep nginx

ポートが開いていなければ、解放しておきましょう。

まとめ

以上の手順でDjangoサイトをHTTPS化することができました。

HTTPS化はセキュリティ向上だけでなく、ユーザー信頼の確保やSEO対策にもつながります。

デプロイ後には必ず設定を行いましょう!

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)