Back to Blog

FlaskをHTTPS化する方法について詳しく解説します!

flask

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の学習を始める