1. ホーム
  2. django

[解決済み] Django で https 接続を非 https 接続と同じように簡単にテストするには 'runserver' を使うには?

2022-07-01 22:09:56

質問

私は "secure" Cookie を使用するアプリケーションを持っており、複雑な SSL 対応の開発サーバーをセットアップする必要なく、その機能をテストしたいと思っています。 これを、暗号化されていないリクエストを ./manage.py runserver ?

どのように解決するのですか?

これは として しかし、ブラウザと開発サーバーの間のSSL化仲介者としてstunnelを使うことで、近いものを得ることはそれほど難しくありません。 Stunnelは、設定されたポートで接続を受け入れ、SSLでそれらをラップし、他のサーバーにそれらを渡す、あなたのマシン上の軽量サーバーをセットアップすることを可能にします。 これを利用して、 stunnel ポート (8443) を開き、それが受け取るトラフィックを Django ランサーバインスタンスに渡します。

まず、 stunnel が必要です。 ここからダウンロードできます または、あなたのプラットフォームのパッケージシステムによって提供されるかもしれません (例: apt-get install stunnel ). 私はstunnelのバージョン4を使っています(例:: /usr/bin/stunnel4 Ubuntu上)、バージョン3も動作しますが、異なる設定オプションがあります。

まず、Django プロジェクトの中に、必要な設定ファイルや SSL 的なものを格納するためのディレクトリを作成します。

mkdir stunnel
cd stunnel

次に、SSL通信に使用するローカル証明書と鍵を作成する必要があります。 これにはopensslを使用します。

鍵を作成します。

openssl genrsa 2048 > stunnel.key

この鍵を使用する証明書を作成します (これは証明書に含まれる多くの情報を尋ねます。あなたが良いと思うものを選んで答えてください)。

openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert

さて、これらを1つのファイルにまとめ、stunnelがSSL通信に使用するようにします。

cat stunnel.key stunnel.cert > stunnel.pem

dev_httpsというstunnel用の設定ファイルを以下の内容で作成します。

pid=

cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log

[https]
accept=8443
connect=8001
TIMEOUTclose=1

このファイルは、stunnelが何を知る必要があるかを伝えます。 具体的には、pidファイルを使用しないこと、証明書ファイルがどこにあるか、使用するSSLのバージョン、フォアグラウンドで実行すること、出力をどこに記録するか、ポート8443で接続を受け付け、ポート8001に転送すること、などを伝えているのです。 最後のパラメータ(TIMEOUTclose)は、何もせずに1秒経過した後に自動的に接続を閉じるように指示します。

Django のプロジェクトディレクトリ (manage.py があるディレクトリ) に戻ってください。

cd ..

ここでは、stunnel と 2 つの django 開発サーバ (通常の接続用と SSL 接続用) を実行する runserver という名前のスクリプトを作成します。

stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001

これを一行ずつ分解してみましょう。

  • 1行目。stunnelを起動し、先ほど作成した設定ファイルを指定します。 これは、stunnelにポート8443をリッスンさせ、受け取ったコネクションをSSLでラップし、ポート8001に渡します。
  • 2行目。通常の Django ランサーバインスタンスを (ポート 8000 で) 起動します。
  • 3行目 別の Django ランサーバインスタンス (ポート 8001) を起動し、すべての着信接続を HTTPS を使用して実行されているかのように扱うように設定します。

で先ほど作成した runScript ファイルを実行可能な状態にします。

chmod a+x runserver

これで、開発用サーバを実行するときは、単に ./runserver を実行するだけです。 試しに、通常の HTTP トラフィックには http://localhost:8000 を、HTTPS トラフィックには https://localhost:8443 をブラウザに指定してみてください。 ブラウザは間違いなく、使用されている証明書について文句を言い、ブラウジングを続けるために例外を追加するか、ブラウザに明示的に指示することを要求することに注意してください。 これは、あなたが独自の証明書を作成し、それが誰であるかについて真実を語っていることをブラウザが信頼していないためです。 これは、開発には適していますが、実運用には適していないことは明らかです。

残念ながら、私のマシンでは、Ctrl-C を押したときに、この runserver スクリプトがうまく終了しません。 プロセスを手動で終了させなければなりません。

マイケル・ガイル氏の ポスト と django-weave の wiki エントリ を参照してください。