2012-03-26 13 views
8

私はクローズドユーザグループのWebAplicationを作成しています。 httpsのみが提供されます。サーバはユーザssl証明書をチェックしてサーバにアクセスすることが許可されているかどうかを確認する必要があります。私は自分のCAが自分の鍵に署名するよりも、ホワイトリスト(userprofileのユーザ証明書を持つフィールド)を持つ方が好きです。ユーザー/パスが存在しないため、コンテンツはクライアントによって提供された証明書によって異なります。djangoのssl certsによるユーザ認証

私はapache/nginxに証明書のリストを提供することができますが、私はこのリストを2つの場所に保存する必要があるため、この解決策が嫌いです。apache(アクセス/拒否)とdjango:authミドルウェア(内容は提供された証明書によって異なります)。これを維持することは悪夢になる可能性があります。

これを行うには他の方法がありますか?多分私はジャンゴにsslのことをさせるべきでしょうか?

答えて

10

私は、このためのDjangoのモジュールを作成して、上のMITライセンスの下で利用可能な実装github。 は、基本的なアプローチは、そのためです。

  1. nginxのは
  2. Djangoの認証バックエンドは、使用しているものは何でもUserモデルに(検証)証明書の識別名をマップし、すべてのSSL &証明書検証のものを処理します。
+0

フラスコを使用したクライアント認証が可能ですか? – nishi

+0

私はdjangoアプリケーションを持っていて、クライアントはUSBでデジタル証明書を持っています。djangoで証明書を読む方法 –

0

まず、証明書を使用する2つの全く異なる方法について説明します。 CAからのサーバー署名付き証明書を使用すると、ユーザーはページのロード前に(セキュアなチャネルを作成するときに)認証され、そのユーザーであることがわかります。あなたが言及する別の方法 - ユーザー証明書をUserProfileに保存する - あなたはプライベート証明書を格納することを意味しますか?これは安全なアプローチから遠いです。あなたは、認証目的のためにあなたに役立つであろう、あなたのユーザープロフィールにはどんなことを期待していますか?そして、もしあなたがUserProfileからこのことを読んだら、実際にどのようにユーザーが認証されるのでしょうか? username + passwordを使用していますか?プロファイル内の証明書の目的は何ですか?

私はDjangoでSSLをしません。これを処理するもっと良い方法は、後でHTTPヘッダーを使ってすべてのSSLをApacheに保存することです。ユーザーに証明書を発行し、ブラウザに追加し、サイトに接続すると、Djangoは証明書をチェックし、要求に関連付けられたユーザー名を抽出します。次に、このユーザー名をDjangoアプリケーションへのHTTPヘッダーとして渡します。 HTTP_USER_NAME = some_user。また、Apacheがクライアントの要求からそのようなヘッダーをすべて削除するようにしてください。それであなたのDjango Appは他に何もしてはいけません。それはApacheがすでにAUTHの仕事をしており、ユーザー名を取得することに依存します。 (これはNginxでうまく動作しますが、私はApacheで使っていませんが、これでは不可能な理由は見当たりません。インストールするにはApache modを追加する必要があります)。

このアプローチの唯一の欠点は、ユーザーに証明書を署名/送信することでおそらく手作業で作業する必要があるということですが、これが頻繁に繰り返される操作でない場合は、それは提供しています。

UPDATEhttp://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start とnginxのために:ここではApacheのSSL認証を行う方法の例である http://forum.nginx.org/read.php?5,226319