企業の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
を構成した結果として受け取った指示です。
ソフトウェア環境
- Ubuntu 12.04.1 LTS(x64)
- OpenSSL 1.0.1 2012年3月14日
- Python 2.7.3
- virtualenv 1.8.4
- Django 1.5.1
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サイトにはWindowsとAndroidのバージョンがあるので、これらのオペレーティングシステムで同様のスキームを構築してみてください。
ご清聴ありがとうございました。この情報が誰かに役立つことを願っています。
最後に、リンクのリストに加えて、私が自分で指摘した長所と短所をリストします。
メリット
+完全な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
...
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
...