- ブラウザで警告が表示されてる
- 暗号化されていないので不安
- ユーザー管理しているのでちゃんとしておきたい
サイトを公開後にまず取り組むべきは、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対策にもつながります。
デプロイ後には必ず設定を行いましょう!
コメント