2012-09-07 15 views
6

安全なAPIアクセスのためにX509クライアント認証を使用したいと考えています。Nginxプロキシの背後にあるDjangoアプリケーションでX509認証をどのように管理しますか?

X509証明書はCA(memberca)によって生成されています。我々は、証明書を使用して取り消されていないことを確認し

  1. クライアントが
  2. 当社membercaから有効なX509証明書を持つ人々をSSLを使用してAPIを接続
  3. それにアクセスすることができます。

    目的はということですが、 CRL。

私はNginxの設定で直接管理できると思います。 どうすればいいですか?

Djangoで行うことはできますか?どうすればいいですか? 証明書をユーザーに解決することができますか?

例えば、NginxはWSGIヘッダーでいくつかの証明書データをマップできますか?

+0

これを実装するにはhttp://github.com/novapost/django-x509を開始しました。 – Natim

答えて

5

私はすでに同様の設定を行っています。

まず、Apache2を使用してユーザーを認証しました。

あなたはmod_sslのを有効にして、(グローバル)を定義する必要がありますする必要があります。

  • SSLCertificateFile:あなたのPEMエンコードされたサーバ証明書へのポイント。
  • SSLCertificateKeyFile:PEMエンコードされたサーバーキーを指します。
  • SSLCertificateChainFile:CA証明書のPEMリストを指します。
  • SSLCACertificatePath:すべてのPEM CA証明書を含むフォルダを指します。
  • SSLCACertificateFile:CA証明書を指します(SSLCertificateChainFileと同じ値にする必要があります)。
  • SSLCARevocationPath:すべてのCRLを含むフォルダを指します。
  • SSLCARevocationFile:失効した証明書のリスト(ca-bundle.crl)
  • SSLCARevocationCheckチェーン。

これで、サーバーはクライアントX.509証明書を確認する準備が整いました。

apache2をフロントWebサーバーとして使用したくない場合は、mod_proxyを有効にすることで、逆プロキシとして構成できます。

あなたはちょうどこのようなバーチャルホストを定義する必要があります。

<VirtualHost *:443> 
    ServerName test.example.com:443 
    ServerAdmin [email protected] 

    RequestHeader set Front-End-Https "On" 

    # Here I define two headers, Auth-User and Remote-User 
    # They will contain the key SSL_CLIENT_S_DN_CN which is the name of the 
    # client certificate's owner. 
    <If "-n %{SSL_CLIENT_S_DN_CN}"> 
     # If the key doesn't exist, it means that the certificate wasn't sent or 
     # it was revoked. 

     RequestHeader set Auth-User "%{SSL_CLIENT_S_DN_CN}s" 
     RequestHeader set Remote-User "%{SSL_CLIENT_S_DN_CN}s" 
    </If> 

    # Now enable SSL, and SSL via the proxy 
    SSLEngine on 
    SSLProxyEngine on 

    ## Require a client certificate 
    # SSLVerifyClient require 
    ## NB: I prefer set it to optional, in order to allow the user 
    ##  to connect to my application with a degraded mode (login+password) 
    ##  It's easy to detect if the user was authenticated by apache by looking 
    ##  at HTTP_AUTH_USER or HTTP_REMOTE_USER 

    SSLVerifyClient optional 

    # Maximum depth of CA Certificates in Client Certificate verification 
    SSLVerifyDepth 4 

    # Now, I pass all of this to my application, which is runned in nginx for example : 
    <Location /> 
     ProxyPass http://<applciation host> 
     ProxyPassReverse http://<applciation host> 
     ProxyPreserveHost on 
     # Send all informations about the client/server certificates to the application 
     SSLOptions +StdEnvVars +ExportCertData 
    </Location> 
</VirtualHost> 

そして今、ジャンゴで、あなただけのhereを説明するようにリモート認証バックエンドを有効にする必要があります。

クライアント証明書から抽出されたすべての情報がアプリケーションに送信されるため、要求オブジェクト(およびミドルウェア)を使用してそれらを使用できます。

あなたのお役に立てば幸いです。

+0

これは本当に面白いです、ありがとうございます。 Nginxで同様の解決策が可能かどうかを確認します。 – Natim

1

mod_sslに証明書の検証と失効のチェックをさせることで、Apacheでこれを行います。証明書が有効で無効になっていない場合は、証明書のCNをHTTPヘッダーに置き、Djangoで取得し、ユーザーデータベースと照合しています。