2

TLS / SSL上で実行されるDjangoアプリをデバッグするための最良の方法は何ですか?

バックグラウンド:

認証にX.509クライアント側証明書を使用するDjangoWebアプリがあります。Apacheで実行している場合、私のアプリにはHTTPS経由でのみアクセスできます。アプリに接続するクライアントは、Apacheが検証してから、環境変数でアプリに転送するクライアント側の証明書を提供します。アプリは証明書を解析し、アクセス制御されたコンテンツを提供します。

これまでのところ、「。/ manage.py runserver」を使用して、通常のHTTPでのみアプリをデバッグできました。デバッグモードで起動するカスタムビューハンドラミドルウェアを使用して、HTTPS接続をシミュレートしました。ビューハンドラーは、HTTPSで実行されたときに実際のクライアント側の証明書から解析される情報と同様に、要求に情報を追加します。

HTTPS経由で接続するときにクライアントが提供する実際のクライアント側の証明書を使用してデバッグできれば、デバッグがはるかに簡単になります。

4

2 に答える 2

4

Django の前で nginx を使用し、クライアント証明書をチェックします。NGINX は、SSL ターミネーション、クライアント証明書の検証、失効リストとの照合を行います。クライアント証明書フィールドは、ヘッダー変数で django アプリまで渡されます。

したがって、django アプリは証明書を受信せず、ヘッダー変数を確認するだけです。同じメカニズムがApacheにも当てはまると思います。

クライアントが開発サーバー (例: './manage.py runserver') にアクセスする場合、クライアントには特別なケースがあります。Python クライアントの例:

  if (proto == "https"):
    conn = http.client.HTTPSConnection( "cert."+webhost+":"+port,
                                        key_file = certfile, cert_file = certfile)
    headers = {}
  else:
    # fake client for local connections.  pass cert info in headers, as it would come
    # out of nginx
    conn = http.client.HTTPConnection( webhost+":"+port)
    headers = { 'X_SSL_CLIENT_S_DN':'/C=US/ST=California/O=yyyy/CN=zzzz',
                'X_SSL_CLIENT_I_DN':'/C=US/ST=California/O=xxxx/CN=wwww',
                'X_SSL_CLIENT_SERIAL':hex(serialnum),
                'USER_AGENT':"test client user agent",}

単体テストでは、Django テスト クライアントを使用して同じことを行います。

  from django.test.client import Client
  self.client = Client()
  response = self.client.get(url, data,
                **{
                'HTTP_X_SSL_CLIENT_S_DN':'/C=US/ST=California/O=yyyy/CN=zzzz',
                'HTTP_X_SSL_CLIENT_I_DN':'/C=US/ST=California/O=xxxx/CN=wwww',
                'HTTP_X_SSL_CLIENT_SERIAL':hex(serialnum),
                'HTTP_USER_AGENT':"test client user agent",
                })
于 2012-07-15T17:13:39.160 に答える
0

私にとってかなりうまくいく回避策を思いつきました。私はまだ HTTP でデバッグしていますが、HTTP ヘッダー経由でクライアント側の証明書を渡しています。そのため、HTTP を使用して Web アプリをデバッグするときは、クライアントにクライアント側の証明書を HTTP ヘッダーにコピーさせます。ビューに入る前に、Web アプリは証明書をヘッダーから、HTTPS を使用するときに Apache によって渡される通常の場所にコピーします。

クライアント側の証明書は PEM 形式であるため、それらを HTTP ヘッダーで渡すことができるようにするには、クライアントで改行を削除し、サーバーで再挿入するだけで済みます。

このアプローチを使用する場合、単一の HTTP ヘッダー フィールドのサイズに対する Apache のデフォルトの制限は、LimitRequestFieldSizeディレクティブで設定された 8190 バイトであることに注意してください。それより大きい証明書の場合、構成を変更するか、証明書を分割して複数のヘッダーに渡す必要があります。

于 2012-07-15T14:05:28.090 に答える