「安全な」Cookieを使用するアプリケーションがあり、複雑なSSL対応の開発サーバーをセットアップする必要なく、その機能をテストしたい。 ./manage.py runserver
を使用して暗号化されていないリクエストをテストできるのと同じくらい簡単にこれを行う方法はありますか?
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
これを行ごとに分けましょう。
作成したばかりのrunscriptファイルを実行可能ファイルにします。
chmod a+x runserver
これで、開発サーバーを実行する場合は、./runserver
プロジェクトディレクトリから。試すには、ブラウザで通常のHTTPトラフィックの場合は http:// localhost:80 を、HTTPSトラフィックの場合は https:// localhost:844 を指定するだけです。ブラウザーは使用されている証明書についてほとんど間違いなく文句を言うので、例外を追加するか、ブラウザーにブラウズを続けるよう明示的に指示する必要があることに注意してください。これは、独自の証明書を作成し、それが誰であるかについて真実を伝えることはブラウザによって信頼されていないためです。これは開発には問題ありませんが、明らかに本番環境では削減できません。
残念ながら、私のマシンでは、このrunserverスクリプトはCtrl-Cを押してもうまく終了しません。プロセスを手動で強制終了する必要があります。それを修正する提案はありますか?
参考資料については、Michael Gileの post およびDjango-weaveの wikiエントリ に感謝します。
Django-sslserver パッケージを使用することをお勧めします。
PyPIの現在のパッケージは、Djangoバージョン1.5.5までしかサポートしていませんが、パッチは 5d4664c を介してコミットされています。この修正により、システムは正常に動作し、 https接続をテストするためのシンプルで簡単なソリューション。
更新:回答を投稿してから、上記のコミットは マージ がmasterブランチに、新しい リリース がPyPIにプッシュされました。そのため、その特定の修正に対して5d4664cコミットを指定する必要はありません。
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には多くの追加機能が含まれており、それらを使用すると、ドキュメントをすばやく確認する価値があります。
インストールするだけ
Sudo pip install Django-sslserver
インストール済みアプリにSSLサーバーを含める
INSTALLED_APPS = (...
"sslserver",
...
)
今、あなたは走ることができます
python manage.py runsslserver 0.0.0.0:8888
https://ngrok.com/ にサインアップします。 httpsを使用してテストできます。これは、httpsをすばやくテストしたいだけの人に役立つかもしれません。
デバッグ目的で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)にのみ必要です。
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