「安全な」Cookieを使用するアプリケーションがあり、複雑なSSL対応の開発サーバーをセットアップする必要なく、その機能をテストしたいと考えています。を使用して暗号化されていないリクエストをテストできるのと同じくらい簡単にこれを行う方法はあります./manage.py runserver
か?
「安全な」Cookieを使用するアプリケーションがあり、複雑なSSL対応の開発サーバーをセットアップする必要なく、その機能をテストしたいと考えています。を使用して暗号化されていないリクエストをテストできるのと同じくらい簡単にこれを行う方法はあります./manage.py runserver
か?
回答:
そうではありませんとして開発サーバで構築ような単純な、それは近く、ブラウザや開発サーバ間SSLifyingの仲介としてのstunnelを使って何かを得るためにあまりにも難しいことではありません。Stunnelを使用すると、構成されたポートで接続を受け入れ、SSLでそれらをラップし、他のサーバーに渡す軽量サーバーをマシンにセットアップできます。これを使用してstunnelポート(8443)を開き、受信したトラフィックをDjango runserverインスタンスに渡します。
まず、ここからダウンロードできるstunnelが必要です。または、プラットフォームのパッケージシステム(例:)によって提供される場合がありますapt-get install stunnel
。私はstunnelのバージョン4(例:/usr/bin/stunnel4
Ubuntu)を使用します。バージョン3も機能しますが、構成オプションが異なります。
まず、Djangoプロジェクトにディレクトリを作成して、必要な構成ファイルとSSLに関連するものを保持します。
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のバージョン、フォアグラウンドで実行すること、出力をログに記録すること、ポートでの接続を受け入れることを指定しています最後のパラメーター(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:8000を、HTTPSトラフィックの場合はhttps:// localhost:8443を指定するだけです。あなたがブラウザであることは、ほぼ間違いなく使用された証明書について不平を言うでしょう、そしてあなたは例外を追加するか、さもなければブラウザを続けるようにブラウザに明示的に指示することを要求することに注意してください。これは、ユーザーが独自の証明書を作成し、それが誰であるかについて真実を伝えることはブラウザによって信頼されていないためです。これは開発には問題ありませんが、本番用に削減することはできません。
残念ながら、私のマシンでは、Ctrl-Cを押しても、このrunserverスクリプトがうまく終了しません。プロセスを手動で強制終了する必要があります-誰かがそれを修正する提案を持っていますか?
request.is_secure()
がレポートすることを意味しますTrue
。あなたがそれを必要としないなら、あなたは正しいです-あなたはただ単一のインスタンスでstunnelを指すことができます。
"sslVersion = SSLv3": SSLv3 not supported
ます。
stunnel_pid=$1
は私にとってはうまくいきませんでしたが、stunnel_pid=$!
うまくいきました。どのようにstunnel_pid=$1
働きましたか?
django-sslserverパッケージの使用をお勧めします。
PyPIの現在のパッケージはDjangoバージョン1.5.5までしかサポートしていませんが、5d4664cを介してパッチがコミットされています。この修正により、システムは正常に動作し、https接続をテストするための非常にシンプルで簡単なソリューションになります。
更新:私の回答を投稿してから、上記のコミットがmasterブランチにマージされ、新しいリリースがPyPIにプッシュされました。したがって、その特定の修正に対して5d4664cコミットを指定する必要はありません。
あなたが使用することができ、sslserverジャンゴと同様にRunServerPlusをからのジャンゴ-拡張を
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にはたくさんの追加の機能が含まれているので、それらを使用すると、ドキュメントをすばやくフリックする価値があります。
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
インストールするだけ
sudo pip install django-sslserver
インストールされたapsにsslserverを含める
INSTALLED_APPS = (...
"sslserver",
...
)
今、あなたは走ることができます
python manage.py runsslserver 0.0.0.0:8888
https://ngrok.com/にサインアップします。httpsを使用してテストできます。これは、httpsをすばやくテストしたい人に役立つ場合があります。
端末で次のコマンドを発行します
ngrok http 8000
ngrokセッションを開始します。2つのURLがリストされます。1つはhttp:// localhost:8000にマップされます。2番目はhttps:// localhost:8000にマップされます。下のスクリーンショットを確認してください。どちらかのURLを使用します。ローカルサーバーにマップされます。
allowed_host
それはsocatで一行で行うことができます:
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
DjangoではなくNginxなどのプロキシを使用してSSL / TLSを処理します。Nginxは、ポート443でリッスンし、リクエストをDjango開発サーバー(通常はhttp://127.0.0.1:8000
)に転送するように設定できます。このためのNginx構成は次のようになります。
server {
listen 443 ssl;
server_name django-dev.localhost;
ssl_certificate /etc/ssl/certs/nginx_chain.pem;
ssl_certificate_key /etc/ssl/private/nginx.pem;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
}
}
また、マッピングする必要がありますdjango-dev.localhost
に127.0.0.1
して追加django-dev.localhost
するALLOWED_HOSTS
にはsettings.py
。Linuxでは、次の行をに追加する必要があります/etc/hosts
。
127.0.0.1 django-dev.localhost
その後https://django-dev.localhost
、ブラウザーでにアクセスして、開発サイトにアクセスできます(ブラウザーのセキュリティ警告をバイパスする必要があります)。