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接続を有効にする

Source: https://habr.com/ru/post/J188106/


All Articles