「runserver」を使用して非https接続と同じくらい簡単にDjangoでhttps接続をテストするにはどうすればよいですか?


109

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


runserver 443を指定して、サーバーをポート443で実行することはできませんか?
Furbeenator

@Furbeenator:残念ながらそうではありません-これは単に443でサーバーをHTTPにするだけなので、実際に実行しているSSLサーバーが必要です。
エヴァングリム

回答:


109

そうではありませんとして開発サーバで構築ような単純な、それは近く、ブラウザや開発サーバ間SSLifyingの仲介としてのstunnelを使って何かを得るためにあまりにも難しいことではありません。Stunnelを使用すると、構成されたポートで接続を受け入れ、SSLでそれらをラップし、他のサーバーに渡す軽量サーバーをマシンにセットアップできます。これを使用してstunnelポート(8443)を開き、受信したトラフィックをDjango runserverインスタンスに渡します。

まず、ここからダウンロードできるstunnelが必要です。または、プラットフォームのパッケージシステム(例:)によって提供される場合がありますapt-get install stunnel。私はstunnelのバージョン4(例:/usr/bin/stunnel4Ubuntu)を使用します。バージョン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

これを行ごとに分解してみましょう。

  • 1行目:stunnelを開始し、先ほど作成した構成ファイルを指すようにします。これは、ポート8443で待機し、SSLで受信した接続をラップして、ポート8001に渡します。
  • 2行目:通常のDjango runserverインスタンスを開始します(ポート8000​​)
  • 3行目:別のDjango runserverインスタンス(ポート8001)を起動し、すべての着信接続をHTTPSを使用して実行されているかのように処理するように構成します。

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

chmod a+x runserver

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

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

Michael Gileの投稿と参考資料のdjango-weaveのwikiエントリに感謝します


3
私はこの答えを偶然見つけました。いくつかの注釈:8001で別の開発インスタンスを実行する必要は必ずしもありません。ポート8000​​に接続させることもできます。stunnelを自動的に強制終了する場合は、関数と終了トラップを追加します:kill_stunnel(){ kill $ stunnel_pid} trap kill_stunnel exit stunnel4 stunnel / dev https&stunnel_pid = $ 1
Friek

2
2番目のインスタンスはHTTPS = 1で呼び出されます。これは、request.is_secure()がレポートすることを意味しますTrue。あなたがそれを必要としないなら、あなたは正しいです-あなたはただ単一のインスタンスでstunnelを指すことができます。
Evan Grim 2013年

stunnel fipsモードが実行された場合はサポートされません.... dev_httpsファイルにfips = noを追加してオフにします
yeahdixon

2
他の誰かが開発したプロジェクトでサイトワークの開発コピーをセットアップしようとしているので、これを試してみましたが、取得してい"sslVersion = SSLv3": SSLv3 not supportedます。
HenryM 2016

@Friek stunnel_pid=$1は私にとってはうまくいきませんでしたが、stunnel_pid=$!うまくいきました。どのようにstunnel_pid=$1働きましたか?
Utku、2017年

86

django-sslserverパッケージの使用をお勧めします。

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

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


5
これは有望に見えます-私はこれに関して受け入れられた答えを更新しなければならないかもしれません。他の誰かが量りたいですか?
エヴァングリム2014

3
これは、httpsで実行しないと機能しない非常に複雑なプロジェクトでしばらく使用され、問題がなかったため、受け入れられた答えになるはずです。
simone cittadini 2016年

2
うまく機能します...ありがとう!:)
nidHi

5
Python 3.6.2およびDjango 1.11.3以降で動作します。
フェニックス

2
Python 3.5およびDjango 1.11以降で動作
Hansel

64

あなたが使用することができ、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にはたくさんの追加の機能が含まれているので、それらを使用すると、ドキュメントをすばやくフリックする価値があります。


2
django-sslserverは新しいバージョンの自動再読み込みをサポートしていないため、実際にはDjango 1.6以降の最良の答え
Zat42

デバッグ+ SSLをアクティブ化するための最良の答え。
Yuda Prawira、2018年

なぜdockerコンテナー化されたアプリで機能しないのでしょうか
Roel

@Roelは簡単に試してみて、Hello Worldアプリで動作するようです。ベースイメージに必要な依存関係がない(たとえば-alpineを使用している場合)か、IP範囲を開く必要がある可能性があります。例./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
djsutho

FileNotFoundError:[Errno 2]そのようなファイルまたはディレクトリはありません: '/tmp\\cert.crt'
Mark Anthony Libres

38

インストールするだけ

sudo pip install django-sslserver

インストールされたapsにsslserverを含める

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

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

 python manage.py runsslserver 0.0.0.0:8888

2
最もクリーンなソリューション!
SexyBeast 2018

確かにクリーンなソリューションですが、何らかの理由で非常に遅いです
Bhanu Tez

Chromeから、証明書が無効であるという警告が表示されます。
-zerohedge

@zerohedgeは開発のためだけなので、重要ではありません。
Sharpless512

これは非常にエレガントですが、これを使用して安全な接続をテストするための解決策はありますか?たとえば、Facebook Graph APIに対してテストする場合は、 developers.facebook.com/docs/graph-api/webhooks#setup
frednikgohar

14

https://ngrok.com/にサインアップします。httpsを使用してテストできます。これは、httpsをすばやくテストしたい人に役立つ場合があります。


6
簡単なテストの場合、これは優れたソリューションです。何も登録する必要はありませんでした。./ngrokhttp 8000をダウンロードして実行するだけです。8000が私のローカルホストポートです。
GavKilbride 2016年

4

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

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

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

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

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


4
  1. ngrokをインストールします。ダウンロードリンク:https : //ngrok.com/download
  2. 端末で次のコマンドを発行します

    ngrok http 8000

ngrokセッションを開始します。2つのURLがリストされます。1つはhttp:// localhost:8000にマップされます。2番目はhttps:// localhost:8000にマップされます。下のスクリーンショットを確認してください。どちらかのURLを使用します。ローカルサーバーにマップされます。

ngrokセッションのスクリーンショットのサンプル


それを行う最も簡単な方法ですが、新しいhttpsのURLを忘れずにallowed_host
Roel

2

それは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


0

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.localhost127.0.0.1して追加django-dev.localhostするALLOWED_HOSTSにはsettings.py。Linuxでは、次の行をに追加する必要があります/etc/hosts

127.0.0.1   django-dev.localhost

その後https://django-dev.localhost、ブラウザーでにアクセスして、開発サイトにアクセスできます(ブラウザーのセキュリティ警告をバイパスする必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.