2012-03-26 11 views
8

Sto scrivendo una webaplicazione per un gruppo chiuso di utenti. Verrà pubblicato solo https. Il server dovrebbe verificare se l'utente è autorizzato ad accedere al server controllando il certificato ssl dell'utente. Preferirei avere una whitelist (ex campo con cert utente nel profilo utente), piuttosto che firmare le loro chiavi dalla mia CA. Poiché non ci sarebbe nessun utente/passaggio, il contenuto dipenderà dal certificato fornito dal cliente.autenticazione utente tramite ssl certs in django

So che posso solo fornire i loro certificati a apache/nginx, ma non mi piace questa soluzione perché avrei bisogno di mantenere questa lista in due punti: apache (accesso/negazione) e django: auth middleware (il contenuto dipende da quale certificato è stato fornito). Mantenere questo potrebbe essere un incubo.

C'è qualche altro bel modo per farlo? Forse dovrei lasciare che il django prenda la cosa di ssl?

risposta

10

ho creato un modulo di Django per questo, l'implementazione disponibile sotto licenza MIT su github. Fondamentalmente l'approccio è così che:

  1. nginx gestisce tutto lo SSL roba verifica & Certificato
  2. autenticazione Django backend mappa il (convalidati) certificati nome distinto a un modello qualunque User che si sta utilizzando.
+0

è possibile eseguire l'autenticazione del client utilizzando il pallone? – nishi

+0

Ho un'applicazione django e i client hanno i loro certificati digitali in chiavette usb come leggere i loro certificati con django –

0

Prima di tutto, si parla di due modi completamente diversi di utilizzare un certificato. Se si utilizza un certificato firmato dal server da una CA, l'utente eseguirà l'autenticazione prima del caricamento della pagina (quando si crea un canale protetto) e si saprà chi sono. L'altro modo in cui dici - memorizzando il certificato utente in UserProfile - intendi la memorizzazione del certificato privato ?? Questo è lontano dall'approccio sicuro. Cosa ti aspetti esattamente di mantenere nel profilo utente, che ti servirà per scopi di autenticazione? E se leggi questa cosa da UserProfile, allora in che modo l'utente si autentica effettivamente? Usando username + password? Quindi qual è lo scopo del certificato nel profilo?

Non farei la cosa SSL in Django. Un approccio migliore per gestire questo è quello di mantenere tutte le cose SSL in Apache utilizzando successivamente un'intestazione HTTP. Si rilascia un certificato all'utente, lo si aggiunge nei propri browser e quando ci si connette al sito - Django controlla il certificato ed estrae il nome utente associato alla richiesta. Quindi passa questo nome utente come intestazione HTTP all'app Django, ad es. HTTP_USER_NAME = some_user. Assicurati inoltre che Apache togli tutte le intestazioni di questo tipo dalla richiesta del cliente. Quindi la tua App Django non dovrebbe fare nient'altro - si baserà sul fatto che Apache ha già fatto il lavoro AUTH e otterrà il nome utente. (Funziona bene con Nginx, e sebbene non l'abbia usato in Apache - non vedo una ragione per cui non dovrebbe essere possibile anche con esso, forse avrai bisogno di un ulteriore mod di apache da installare).

Quindi l'unico svantaggio di questo approccio è che probabilmente dovrai fare del lavoro manuale con la firma/l'invio di certificati all'utente, ma se questa non è un'operazione ripetuta frequentemente, sembra essere OK in cambio della sicurezza offre.

UPDATE: Ecco un esempio di come fare l'autenticazione SSL in Apache: http://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start e per nginx: http://forum.nginx.org/read.php?5,226319

Problemi correlati