web-dev-qa-db-ja.com

Djangoでhttps接続をテストするには、「ru​​nserver」を使用してhttps以外の接続と同じくらい簡単にテストできますか?

「安全な」Cookieを使用するアプリケーションがあり、複雑なSSL対応の開発サーバーをセットアップする必要なく、その機能をテストしたい。 ./manage.py runserverを使用して暗号化されていないリクエストをテストできるのと同じくらい簡単にこれを行う方法はありますか?

93
Evan Grim

asのように組み込みの開発サーバーほど単純ではありませんが、ブラウザと開発の間のSSLifyingミドルマンとしてstunnelを使用して何かを近づけることはそれほど難しくありませんサーバ。 Stunnelを使用すると、構成済みのポートで接続を受け入れ、SSLでラップし、他のサーバーに渡す軽量マシンをマシンにセットアップできます。これを使用して、stunnelポート(8443)を開き、受信したトラフィックをDjango runserverインスタンスに渡します。

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

まず、Djangoプロジェクトにディレクトリを作成して、必要な設定ファイルとSSLishのものを保持します。

mkdir stunnel
cd stunnel

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

キーを作成します。

openssl genrsa 1024 > stunnel.key

このキーを使用する証明書を作成します(これにより、証明書に含まれる一連の情報が求められます。自分に合ったものを答えてください)。

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

これらを、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を開始し、作成した構成ファイルをポイントします。これにはポート8443でリッスンするstunnelがあり、受信した接続をSSLでラップし、ポート8001に渡します。
  • 2行目:通常のDjango runserverインスタンス(ポート8000​​上)を開始
  • 行3:別のDjango runserverインスタンス(ポート8001上))を開始し、すべての着信接続をHTTPSを使用して実行されているかのように処理するように構成します。

作成したばかりのrunscriptファイルを実行可能ファイルにします。

chmod a+x runserver

これで、開発サーバーを実行する場合は、./runserverプロジェクトディレクトリから。試すには、ブラウザで通常のHTTPトラフィックの場合は http:// localhost:80 を、HTTPSトラフィックの場合は https:// localhost:844 を指定するだけです。ブラウザーは使用されている証明書についてほとんど間違いなく文句を言うので、例外を追加するか、ブラウザーにブラウズを続けるよう明示的に指示する必要があることに注意してください。これは、独自の証明書を作成し、それが誰であるかについて真実を伝えることはブラウザによって信頼されていないためです。これは開発には問題ありませんが、明らかに本番環境では削減できません。

残念ながら、私のマシンでは、このrunserverスクリプトはCtrl-Cを押してもうまく終了しません。プロセスを手動で強制終了する必要があります。それを修正する提案はありますか?

参考資料については、Michael Gileの post およびDjango-weaveの wikiエントリ に感謝します。

104
Evan Grim

Django-sslserver パッケージを使用することをお勧めします。

PyPIの現在のパッケージは、Djangoバージョン1.5.5までしかサポートしていませんが、パッチは 5d4664c を介してコミットされています。この修正により、システムは正常に動作し、 https接続をテストするためのシンプルで簡単なソリューション。

更新:回答を投稿してから、上記のコミットは マージ がmasterブランチに、新しい リリース がPyPIにプッシュされました。そのため、その特定の修正に対して5d4664cコミットを指定する必要はありません。

75
devonbleibtrey

Django-sslserverと同様に、 RunServerPlus from Django-extensions を使用できます。

Werkzeug(したがって、優れたWerkzeugデバッガーにアクセスできます)およびpyOpenSSL(sslモードにのみ必要)に依存するため、インストールを実行するには:

pip install Django-extensions Werkzeug pyOpenSSL

プロジェクトのsettings.pyファイルのINSTALLED_APPSに追加します。

INSTALLED_APPS = (
    ...
    'Django_extensions',
    ...
)

次に、次のコマンドを使用してサーバーをSSLモードで実行できます。

./manage.py runserver_plus --cert /tmp/cert

これにより、/tmp/cert.crtに証明書ファイルが作成され、/tmp/cert.keyにキーファイルが作成され、将来のセッションで再利用できます。

Django-extensionsには多くの追加機能が含まれており、それらを使用すると、ドキュメントをすばやく確認する価値があります。

54
djsutho

インストールするだけ

Sudo pip install Django-sslserver

インストール済みアプリにSSLサーバーを含める

INSTALLED_APPS = (...
"sslserver",
...
)

今、あなたは走ることができます

 python manage.py runsslserver 0.0.0.0:8888
13

https://ngrok.com/ にサインアップします。 httpsを使用してテストできます。これは、httpsをすばやくテストしたいだけの人に役立つかもしれません。

12
Neil

デバッグ目的でstunnelオプションのフォアグラウンドバージョンを探している場合:

stunnel.pemは、Evan Grimmの上位投票回答のように生成された証明書です。

ポート443ですべてのローカルインターフェイスをリッスンし、ローカルホストのポート80に転送します

Sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443

Sudoは、1024未満の着信ポート(-d [Host:] port)にのみ必要です。

4
Micheal Lunny

Socatを使用すると1行で実行できます。

socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000

、8443は着信HTTPS接続をリッスンするポート、server.pemは自己署名サーバー証明書、localhost:8000は通常どおり起動されるデバッグHTTPサーバーです。

詳細: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html

1
uri.z