2012-09-07 9 views
6

मैं एक सुरक्षित एपीआई एक्सेस के लिए X509 क्लाइंट प्रमाणीकरण का उपयोग करना चाहता हूं।आप एक Nginx प्रॉक्सी के पीछे Django ऐप पर X509 प्रमाणीकरण का प्रबंधन कैसे करेंगे?

X509 प्रमाणपत्र हमारे सीए (सदस्यका) द्वारा उत्पन्न होते हैं।

  1. क्लाइंट SSL का उपयोग कर हमारे memberca से एक वैध X509 प्रमाण पत्र के साथ
  2. लोग यह
  3. उपयोग कर सकते हैं हम जाँच करें कि प्रमाण पत्र का उपयोग नहीं रद्द किया जा चुका है एपीआई कनेक्ट:

    उद्देश्य यह है कि एक सीआरएल

मुझे लगता है कि, मैं इसे सीधे Nginx कॉन्फ़िगरेशन में प्रबंधित करने में सक्षम हो सकता हूं। मुझे यह कैसे करना चाहिए?

क्या मैं इसे Django के साथ कर सकता हूं? तो मुझे तब कैसे करना चाहिए? क्या मैं किसी उपयोगकर्ता को प्रमाणपत्र के समाधान के साथ माच कर सकता हूं?

उदाहरण के लिए Nginx WSGI शीर्षलेख के साथ कुछ प्रमाणपत्र डेटा मानचित्र कर सकता है ताकि मैं अपने उपयोगकर्ता से मेल खा सकूं?

+0

बस इसे लागू करने के लिए http://github.com/novapost/django-x509 शुरू किया। – Natim

उत्तर

5

मैंने पहले से ही एक समान सेटअप कॉन्फ़िगर किया है।

सबसे पहले, मैंने उपयोगकर्ता को प्रमाणीकृत करने के लिए अपाचे 2 का उपयोग किया।

आप mod_ssl सक्षम करें, और परिभाषित करने के लिए (विश्व स्तर पर) की आवश्यकता है:

  • SSLCertificateFile: अपने PEM एन्कोड सर्वर प्रमाणपत्र को अंक;
  • SSLCertificateKeyFile: आपके पीईएम एन्कोडेड सर्वर कुंजी को इंगित करता है;
  • SSLCertificateChainFile: सीए प्रमाणपत्रों की आपकी पीईएम सूची को इंगित करता है;
  • SSLCACertificatePath: आपके सभी पीईएम सीए प्रमाण पत्र वाले फ़ोल्डर को इंगित करता है;
  • SSLCACertificateFile: आपके सीए प्रमाणपत्र को इंगित करें (SSLCertificateChainFile के समान मूल्य होना चाहिए);
  • SSLCARevocationPath: आपके सभी सीआरएल वाले फ़ोल्डर को इंगित करता है;
  • SSLCARevocationFile: निरस्त प्रमाणपत्रों (आपकी सीए-बंडल.crl)
  • SSLCARevocation चेक श्रृंखला की सूची को इंगित करता है।

अब आपका सर्वर क्लाइंट X.509 प्रमाणपत्र सत्यापित करने के लिए तैयार है।

यदि आप अपाचे 2 सर्वर के रूप में apache2 का उपयोग नहीं करना चाहते हैं, तो आप इसे 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> 

और अब Django के साथ, तुम बस के रूप में वर्णित here रिमोट प्रमाणीकरण बैकएंड सक्षम करने के लिए:

आप सिर्फ इस तरह एक वर्चुअलहोस्ट परिभाषित करने की जरूरत।

क्लाइंट प्रमाण पत्र से निकाली गई सभी सूचनाएं एप्लिकेशन को भेजी जाती हैं, इसलिए अनुरोध ऑब्जेक्ट (और/या मध्यवर्ती के साथ) का उपयोग करके आप उनका उपयोग कर सकते हैं।

मुझे आशा है कि इससे आपकी मदद मिलेगी।

+0

यह वास्तव में दिलचस्प है, बहुत बहुत धन्यवाद। मैं जांच करूंगा कि Nginx के साथ एक समान समाधान संभव है या नहीं। – Natim

1

हम modache को प्रमाणीकरण सत्यापन और निरस्तीकरण जांच का ख्याल रखने के द्वारा अपाचे के साथ ऐसा कर रहे हैं। अगर प्रमाण पत्र वैध है और निरस्त नहीं किया गया है, तो हम केवल प्रमाणपत्र के सीएन को एक HTTP शीर्षलेख में डालते हैं और हम Django के साथ पुनः प्राप्त कर रहे हैं और हमारे उपयोगकर्ता डेटाबेस के साथ मेल खाते हैं।

संबंधित मुद्दे