Django開発サーバーとHTTPSテスト

こんにちはコミュニティ、



企業のWebサイトを開発するためにDjangoフレームワークを選択した後、組み込みのWebサーバーを使用してHTTPSプロトコルを使用し動作をテストする問題に遭遇しました。 Djangoで安全な接続使用するためのサポートにもかかわらず、バンドルされているWebサーバーはHTTPS要求を処理しません。



最初に思いついたのは、開発とテストのために本格的なWebサーバー(たとえばApache )を上げることでしたが、Django組み込みWebサーバーの利便性と使いやすさを放棄したくない場合はどうでしょうか?



インターネットで「django + https」を検索すると、 2009年2012年のいくつかの記事が返されました。これは、 stunnelを使用してHTTPSをテストすることを示唆しています。



この記事は、Ubuntu 12.04.1 LTS x64上のDjango開発環境用にstunnel



を構成した結果として受け取った指示です。





ソフトウェア環境







stunnelをインストールして構成する



まず、 stunnel



をインストールする必要があります(バージョン4.x、ブランチ3.xはサポートされなくなりました):



 $ sudo apt-get install stunnel4
      
      





基本的なstunnel



設定は、 /etc/default/stunnel4







 # /etc/default/stunnel # Julien LEMOINE <speedblue@debian.org> # September 2003 # Change to one to enable stunnel automatic startup ENABLED=0 # Configuration file loacation mask FILES="/etc/stunnel/*.conf" OPTIONS="" # Change to one to enable ppp restart scripts PPP_RESTART=0
      
      





私たちの場合、 stunnel



は開発とテストの期間中のみDjango Webサーバーと組み合わせて使用​​されるため、変更を加える必要はありません。



しかし、必要なのはX.509証明書です。



証明書の生成



stunnelマニュアルでは、次の証明書要件を指定しています。

... SSL対応の各デーモンは、有効なX.509証明書をピアに提示する必要があります。 また、着信データを復号化するために秘密鍵が必要です。 証明書とキーを取得する最も簡単な方法は、無料のOpenSSLパッケージでそれらを生成することです...



... .pemファイルのコンテンツの順序は重要です。 最初に暗号化されていない秘密鍵を含み、次に署名済み証明書(証明書要求ではない)を含める必要があります。 また、証明書と秘密キーの後に空の行があるはずです。 生成された証明書の上部に追加されたプレーンテキストの証明書情報は破棄する必要があります。 したがって、ファイルは次のようになります。



----- RSAプライベートキーの開始-----

[エンコードされたキー]

----- RSAプライベートキーの終了-----

[空行]

-----証明書の開始-----

[エンコードされた証明書]

-----証明書の終了-----

[空行]


秘密鍵と証明書を生成するには、OpenSSLを使用します(Ubuntu 12.04.1に存在する必要があります)。



 $ cd ~ $ openssl genrsa -out private.key $ openssl req -new -x509 -key private.key -out stunnel.cert -days 365
      
      





生成中に、所有者に関する情報を入力する必要があります(便宜上、 国コード )。



出力では、結合する必要がある2つのprivate.key



およびstunnel.cert



を取得し、テンプレートに従って空の行を追加します。



 $ (cat private.key ; echo ; cat stunnel.cert ; echo) > stunnel.pem
      
      





次に、トンネルの構成ファイルを作成します。



構成ファイル



stunnel.conf-sample



構成ファイルstunnel.conf-sample



/usr/share/doc/stunnel4/examples/



にあり、パラメーターの説明はman stunel4



またはドキュメントにあります 。 さらに、プログラムWebサイトのFAQセクションには、いくつかの役立つヒントが含まれています。



ホームディレクトリに構成ファイルを作成します。



 $ cd ~ $ vim stunnel.conf
      
      





この場合、次の内容が含まれています。



 ; Certificate & Key cert = ./stunnel.pem ; Use SSL version 3, which is more secure sslVersion = SSLv3 ; If next argument is empty, then no pid file will be created pid = ; if 'yes' stay in foreground (don't fork) and log to stderr instead of via syslog foreground = no ; Performance tweak from FAQ (https://www.stunnel.org/faq.html) socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 ; Enable compression compression = zlib ; Debugging - emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), or debug (7) debug = 7 output = /var/log/stunnel4/stunnel.log ; HTTPS service section [https] ; Port to listen incoming client connections accept = 8443 ; Port which Django development server listens to connect = 8000 ; Tweak for MSIE (see FAQ or manual) TIMEOUTclose = 0
      
      





何が起こったかを確認しましょうか?



トンネルを作成してWebサーバーを起動する



テストプロジェクト用にstunnel



と組み込みのDjango Webサーバーを実行します(空のプロジェクト、 django-admin.py startproject



直後)。



 $ cd ~ $ stunnel4 stunnel.conf $ source django/bin/activate (django)$ cd django/projects (django)$ django-admin.py startproject testone (django)$ cd testone/ (djanho)$ HTTPS=on python manage.py runserver
      
      





DjangoでHTTPSを正しくシミュレーションするには、環境変数HTTPS = onが必要です。これがないと、request.is_secure()メソッドはFalseを返します。



「リスニング」ポートを確認します。

 $ netstat –an
      
      





 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State ... tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN ...
      
      





トンネルが正常に作成されましたstunnel



はポート8443ですべての外部インターフェースをリッスンし、Webサーバーはポート8000​​でローカル接続をリッスンします。



トンネルをkillall



は、 killall



コマンドが適切です。



 $ ps -e | grep stunnel4
      
      





 12530 pts/1 00:00:00 stunnel4 12531 pts/1 00:00:00 stunnel4 12532 pts/1 00:00:00 stunnel4 12533 pts/1 00:00:00 stunnel4 12534 pts/1 00:00:00 stunnel4 12535 ? 00:00:00 stunnel4
      
      





 $ killall stunnel4
      
      







作業確認



http://



代わりにhttps://



を使用して、ブラウザでサーバー上の既存のURLを開きます。 最初のリクエストで、信頼できない証明書に関する警告が表示されるはずです。 認定センター(認証局)ではなく、私たちが個人的に署名したものです。 セキュリティ例外を確認した後、HTTPSプロトコル経由で受信したリクエストされたページが表示されます。





だった





になっています



おわりに



その結果、完全なWebサーバーを維持することなく、HTTPSを使用してDjangoプロジェクトの作業をデバッグする機会が得られます。



stunnel



WebサイトにはWindowsAndroidのバージョンがあるので、これらのオペレーティングシステムで同様のスキームを構築してみてください。



ご清聴ありがとうございました。この情報が誰かに役立つことを願っています。



最後に、リンクのリストに加えて、私が自分で指摘した長所と短所をリストします。



メリット


+完全なWebサーバーをインストールする必要はありません。

+複数のDjango Webサーバー用のトンネルを構築する機能。

+ビルトインWebサーバーの利点の使用。



短所


-これは、HTTPSをサポートする本格的なWebサーバーではありません。

-追加のソフトウェアをインストールおよび構成する必要性。

-実際、Django WebサーバーはHTTPリクエストを処理します(以下のログを参照)。



Webサーバーのログ
モデルの検証...



0個のエラーが見つかりました

2013年7月26日-10:06:33

Djangoバージョン1.5.1、設定 'testone.settings'を使用

開発サーバーは127.0.0.1で実行されています:8000 /

CONTROL-Cでサーバーを終了します。

...

[2013年7月26日10:07:25]「GET / HTTP / 1.1」200 1955

[2013年7月26日10:07:30] GET / HTTP / 1.1 200 1955

...





素材



  1. ジャンゴのセキュリティ
  2. Djangoの開発サーバーでHTTPSをテストする
  3. スタンネルマニュアル
  4. HTTPS経由でDjango(またはその他の)開発インスタンスを実行する
  5. Pan NewsreaderでStunnelをインストールしてSSL接続を有効にする



All Articles