django

2012-03-26 14 views
8

में एसएसएल certs के माध्यम से उपयोगकर्ता प्रमाणीकरण मैं एक बंद उपयोगकर्ता समूह के लिए एक वेबप्लिकेशन लिख रहा हूँ। इसे केवल https पर ही सेवा दी जाएगी। सर्वर को यह जांचना चाहिए कि उपयोगकर्ता को एसएसएल प्रमाण पत्र की जांच करके सर्वर तक पहुंचने की अनुमति है या नहीं। मैं अपने सीए द्वारा अपनी चाबियों पर हस्ताक्षर करने के बजाय, सिर्फ श्वेतसूची (उपयोगकर्ता प्रोफाइल में उपयोगकर्ता प्रमाण के साथ पूर्व फ़ील्ड) करना पसंद करूंगा। चूंकि कोई उपयोगकर्ता/पास नहीं होगा, सामग्री इस बात पर निर्भर करेगी कि ग्राहक द्वारा कौन सा प्रमाण पत्र प्रदान किया गया था।django

मुझे पता है कि मैं सिर्फ अपने certs को apache/nginx में सूचीबद्ध कर सकता हूं, लेकिन मुझे यह समाधान पसंद नहीं है क्योंकि मुझे इस सूची को दो स्थानों पर रखना होगा: अपाचे (एक्सेस/इनकार) और django: auth middleware (सामग्री इस बात पर निर्भर करती है कि कौन सा प्रमाण प्रदान किया गया था)। इसे बनाए रखना एक दुःस्वप्न हो सकता है।

क्या ऐसा करने का कोई और अच्छा तरीका है? शायद मुझे डीजेंगो को एसएसएल चीज लेनी चाहिए?

उत्तर

10

मैं इस के लिए एक Django मॉड्यूल बनाया है, एमआईटी पर लाइसेंस के तहत कार्यान्वयन उपलब्ध github। मूल रूप से दृष्टिकोण ताकि है:

  1. nginx सभी SSL & प्रमाणपत्र सत्यापन सामान संभालती
  2. Django प्रमाणीकरण बैकएंड एक जो कुछ User मॉडल आप उपयोग कर रहे हैं (मान्य) प्रमाण पत्र विशिष्ट नाम मैप करता है।
+0

क्या फ्लास्क का उपयोग कर क्लाइंट प्रमाणीकरण करना संभव है? – nishi

+0

मेरे पास एक django अनुप्रयोग है और ग्राहकों के पास यूएसबी में डिजिटल प्रमाणपत्र हैं जो django के साथ अपने प्रमाणपत्रों को पढ़ना है –

0

सबसे पहले - आप प्रमाण पत्र का उपयोग करने के दो पूरी तरह से अलग तरीकों के बारे में बात करते हैं। यदि आप किसी CA से सर्वर-हस्ताक्षरित प्रमाणपत्र का उपयोग करते हैं, तो उपयोगकर्ता पृष्ठ लोड (सुरक्षित चैनल बनाते समय) से पहले प्रमाणित करेगा, और आप जान लेंगे कि वे कौन हैं। दूसरा तरीका आप उल्लेख करते हैं - उपयोगकर्ता प्रोफाइल में उपयोगकर्ता प्रमाण संग्रहीत करना - क्या आपका मतलब निजी प्रमाणपत्र संग्रहीत करना है ?? यह सुरक्षित दृष्टिकोण से बहुत दूर है। आप उपयोगकर्ता प्रोफ़ाइल में वास्तव में क्या रखने की उम्मीद करते हैं, जो प्रमाणीकरण उद्देश्य के लिए आपकी सेवा करेगा? और यदि आप UserProfile से यह चीज़ पढ़ते हैं, तो उपयोगकर्ता वास्तव में कैसे प्रमाणित करेगा? उपयोगकर्ता नाम + पासवर्ड का उपयोग करना? तो प्रोफ़ाइल में प्रमाण का उद्देश्य क्या है?

मैं Django में एसएसएल चीज नहीं करता। इसे संभालने का एक और बेहतर तरीका यह है कि बाद में HTTP शीर्षलेख का उपयोग करके सभी एसएसएल सामान अपाचे में रखें। आप उपयोगकर्ता को प्रमाण पत्र जारी करते हैं, वे इसे अपने ब्राउज़र में जोड़ते हैं, और साइट से कनेक्ट होने पर - Django प्रमाण पत्र की जांच करता है और अनुरोध के साथ जुड़े उपयोगकर्ता नाम निकालता है। फिर Django ऐप को इस उपयोगकर्ता नाम को HTTP शीर्षलेख के रूप में पास करें, उदा। HTTP_USER_NAME = some_user। यह भी सुनिश्चित करें कि अपाचे क्लाइंट के अनुरोध से ऐसे सभी शीर्षलेखों को स्ट्रिप्स करता है। फिर आपके Django ऐप को और कुछ नहीं करना चाहिए - यह भरोसा करेगा कि अपाचे ने पहले से ही नौकरी की नौकरी की है और उपयोगकर्ता का नाम प्राप्त होगा। (यह Nginx के साथ ठीक काम करता है, और हालांकि मैंने इसे अपाचे में उपयोग नहीं किया है - मुझे कोई कारण नहीं दिख रहा है कि इसे इसके साथ भी संभव नहीं होना चाहिए, शायद आपको इंस्टॉल करने के लिए कुछ अतिरिक्त अपाचे मोड की आवश्यकता होगी)।

तो इस दृष्टिकोण का एकमात्र नुकसान यह है कि आपको शायद उपयोगकर्ता को प्रमाण पत्र हस्ताक्षर/भेजने के साथ कुछ मैन्युअल कार्य करना होगा, लेकिन यदि यह अक्सर दोहराने वाला ऑपरेशन नहीं होता है, तो सुरक्षा की वापसी में ठीक लगता है यह ऑफर।

अद्यतन: http://www.zeitoun.net/articles/client-certificate-x509-authentication-behind-reverse-proxy/start और nginx के लिए: यहाँ एक उदाहरण में Apache एसएसएल प्रमाणन करना है http://forum.nginx.org/read.php?5,226319