FlaskをHTTPS化する方法について詳しく解説します!
2024年8月8日
こんにちは!
今回の記事では、FlaskをHTTPS化する方法について詳しく解説します。
HTTPSとは、HTTPにSSL/TLSプロトコルを組み合わせた通信プロトコルです。通信のセキュリティを強化しています。
本番環境へリリースする際には、HTTPS化するのが一般的です。
今回の記事では、FlaskをHTTPS化する方法をハンズオン形式で詳しく解説します。
HTTPSとは?
まずは、HTTPSについて理解を深めましょう。
HTTPSは、HTTPにSSL/TLSプロトコルを組み合わせた通信プロトコルです。
HTTPは、Webサーバーとブラウザ間でデータを送受信するためのプロトコルですが、HTTPSはこれにSSL/TLSによる暗号化を加えることで、通信のセキュリティを強化しています。
SSL/TLSの役割
SSL(Secure Sockets Layer)とTLS(Transport Layer Security)は、インターネット上でデータを暗号化するプロトコルです。
これにより、データの盗聴や改ざんを防ぐことができます。TLSは、SSLの後継プロトコルであり、現在ではTLSが主流です。
なぜHTTPSが重要なのか?
なぜHTTPS化が重要なのでしょうか?
HTTPSを使用することで、Webサーバーとクライアント(ブラウザ)間の通信が暗号化され、第三者によるデータの盗聴や改ざんを防ぐことができます。
特に、パスワードやクレジットカード情報などの機密データを扱うサイトでは、HTTPSは必須です。
また、HTTPS化はSEO対策としても有効です。HTTPS対応のサイトを優先的に検索結果に表示する傾向があります。
FlaskをHTTPS化する方法
FlaskをHTTPS化するためには、NginxというWebサーバーを準備します。Flask+Gunicorn+Nginxを連携させて動作させます。
Flask + Gunicornを構築する
まずは、Flask + Gunicorn + Nginxの環境を構築します。
FlaskとGunicornをインストールします。
pip install Flask Gunicorn
Flaskは、以下のように簡単なアプリケーションが動作するようにします。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
続いて、Gunicornコマンドを使って、Flaskを起動させます。
gunicorn -w 4 -b 127.0.0.1:8000 app:app
上記のコマンドを実行すると、GunicornがFlaskアプリケーションを実行し、指定されたアドレスとポート(http://127.0.0.1:8000)でリクエストを待ち受けます。
【関連】FlaskやDjangoで使われるGunicornとは何か?
Nginxを準備する
続いて、Nginxを準備します。
以下のコマンドで、Nginxをインストールします。
apt-get update
apt-get install nginx
nginxの設定ファイルを以下のように設定します。
events {}
http {
server {
listen 80;
server_name localhost;
location / {
return 301 https://$host$request_uri; # HTTPリクエストをHTTPSにリダイレクト
}
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/certs/cert.pem;
ssl_certificate_key /etc/nginx/certs/key.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# SSL設定
proxy_ssl_session_reuse off;
proxy_ssl_verify off;
}
}
}
上記の設定ファイルでは、server{ ~ }の部分で、HTTPとHTTPSのプロトコルの設定をしています。
1つ目のserver{ ~ }の部分では、HTTPにアクセスがあった場合に、HTTPSにリダレクトする設定を行なっています。このようにすることで、ユーザーは常にHTTPSを利用することになります。
2つ目のserver{ ~ }の部分では、SSL通信に使用する証明書と秘密鍵のファイルパスを指定しています。これにより、HTTPS通信が暗号化されます。
また、location / { ~ }の部分では、リクエストをローカルホストのポート8000で実行されているFlaskアプリケーションにプロキシしています。
【関連】Flask+Nginx+Gunicornの環境をDockerで構築する方法
サーバー証明書を準備する
続いて、サーバー証明書を準備します。
サーバー証明書は、Certbotを使うと便利です。以下のコマンドを実行して、Certbotをインストールします。
apt-get update
apt-get install certbot python3-certbot-nginx
次に、Certbotを使用してLet’s Encrypt証明書を取得します。以下のコマンドを実行します。[ドメイン名]は、実際のドメイン名に置き換えてください。
certbot --nginx -d [ドメイン名]
コマンドを実行すると、ドメインを所有しているかどうかの確認をする必要があります。ドメインの名前解決ができるDNSサーバーへTXTレコードの設定などを行います。
コマンドを実行すると、/etc/letsencrypt/live/ディレクトリに証明書と鍵が作成されます。
つづいて、nginxの設定ファイルの以下の部分に鍵のパスを指定します。
ssl_certificate /etc/letsencrypt/live/[ドメイン名]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[ドメイン名]/privkey.pem;
最後にnginxを再起動して完了です。
これで、https://[ドメイン名]でFlaskのアプリケーションへアクセスできるようになります。
まとめ
今回の記事では、FlaskをHTTPS化する方法について詳しく解説しました。
HTTPSの概要から、FlaskとGunicornの準備、Nignxの設定、証明書の作成の方法を解説しました。
HTTPSでWebサイトを公開したい方は参考にしてください。
ここまでお読みいただきありがとうございました。
Pythonの基礎から応用まで学べる
Python WebAcademy
Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。
Pythonの学習を始めるインフラの学習はInfraAcademy
おすすめの記事