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",
})