मैं Django के साथ आसानी से https कनेक्शन का परीक्षण कैसे कर सकता हूं क्योंकि मैं 'runserver' का उपयोग करके गैर-https कनेक्शन कर सकता हूं?


109

मेरे पास एक एप्लिकेशन है जो "सुरक्षित" कुकीज़ का उपयोग करता है और एक जटिल एसएसएल सक्षम विकास सर्वर स्थापित करने की आवश्यकता के बिना इसकी कार्यक्षमता का परीक्षण करना चाहता है। क्या ऐसा करने का कोई तरीका है जैसे कि मैं गैर-एन्क्रिप्टेड अनुरोधों का उपयोग करके परीक्षण कर सकता हूं ./manage.py runserver?


पोर्ट 443 पर सर्वर चलाने के लिए क्या आप केवल रनसर 443 निर्दिष्ट नहीं कर सकते?
22

@Furbeenator: दुर्भाग्य से नहीं - यह सिर्फ सर्वर HTTP को 443 पर बना देगा, जो मुझे चाहिए वह एक वास्तविक एसएसएल सर्वर है।
इवान ग्रिम

जवाबों:


109

यह बिल्ट इन डेवलपमेंट सर्वर की तरह सरल नहीं है, लेकिन अपने ब्राउजर और डेवलपमेंट सर्वर के बीच एक SSLizing बिचौलिया के रूप में stunnel का उपयोग करते हुए कुछ पास प्राप्त करना बहुत कठिन नहीं है। Stunnel आपको अपनी मशीन पर एक हल्का सर्वर सेट करने की अनुमति देता है जो एक कॉन्फ़िगर किए गए पोर्ट पर कनेक्शन स्वीकार करता है, उन्हें एसएसएल के साथ लपेटता है, और उन्हें किसी अन्य सर्वर पर भेजता है। हम इसका उपयोग एक स्टनलाइन पोर्ट (8443) खोलने के लिए और किसी भी ट्रैफ़िक के साथ इसे प्राप्त करने के लिए करेंगे जो कि एक Django रनवेस्टर उदाहरण के लिए प्राप्त होता है।

सबसे पहले आपको स्टनलाइन की आवश्यकता होगी जिसे यहां डाउनलोड किया जा सकता है या आपके प्लेटफॉर्म के पैकेज सिस्टम (जैसे :) द्वारा प्रदान किया जा सकता है apt-get install stunnel। मैं stunnel के संस्करण 4 का उपयोग कर रहा हूँ (उदाहरण के लिए: /usr/bin/stunnel4Ubuntu पर), संस्करण 3 भी काम करेगा, लेकिन विभिन्न कॉन्फ़िगरेशन विकल्प हैं।

आवश्यक कॉन्फ़िगरेशन फ़ाइलों और SSLish सामान को रखने के लिए पहले अपने Django प्रोजेक्ट में एक निर्देशिका बनाएँ।

mkdir stunnel
cd stunnel

आगे हमें SSL संचार के लिए एक स्थानीय प्रमाणपत्र और कुंजी बनाने की आवश्यकता होगी। इसके लिए हम ओप्सनल को चालू करते हैं।

कुंजी बनाएँ:

openssl genrsa 1024 > stunnel.key

इस कुंजी का उपयोग करने वाला प्रमाण पत्र बनाएं (यह आपको सूचना का एक गुच्छा देगा जो सर्टिफिकेट में शामिल किया जाएगा - जो भी आपको अच्छा लगे, उसके साथ उत्तर दें):

openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert

अब इन्हें एक सिंगल फाइल में संयोजित करें, जो stunnel अपने SSL संचार के लिए उपयोग करेगी:

cat stunnel.key stunnel.cert > stunnel.pem

निम्नलिखित सामग्री के साथ dev_https नामक stunnel के लिए एक विन्यास फ़ाइल बनाएँ:

pid=

cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log

[https]
accept=8443
connect=8001
TIMEOUTclose=1

यह फ़ाइल स्टनल को बताती है कि उसे क्या जानना है। विशेष रूप से, आप इसे पीआईडी ​​फ़ाइल का उपयोग नहीं करने के लिए कह रहे हैं, जहां प्रमाणपत्र फ़ाइल है, एसएसएल के किस संस्करण का उपयोग करना है, यह अग्रभूमि में चलना चाहिए, जहां इसे अपना आउटपुट लॉग करना चाहिए, और यह पोर्ट पर कनेक्शन स्वीकार करना चाहिए। 8443 और उन्हें 8001 पोर्ट करने के लिए शटल करें। अंतिम पैरामीटर (TIMEOUTclose) इसे बताता है कि 1 सेकंड के बाद कोई गतिविधि नहीं होने के बाद कनेक्शन को स्वचालित रूप से बंद कर दें।

अब अपने Django प्रोजेक्ट डायरेक्टरी में पॉप-अप करें (इसमें मैनेजमेक्स के साथ एक):

cd ..

यहां हम एक स्क्रिप्ट बनाएंगे जिसका नाम रनसर है जो स्टनलाइन और दो डेंजो डेवलपमेंट सर्वर (सामान्य कनेक्शन के लिए एक, और एसएसएल कनेक्शन के लिए एक) चलाएगा:

stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001

आइए इसे तोड़ते हैं, लाइन-बाय-लाइन:

  • पंक्ति 1: स्टनलाइन शुरू करता है और इसे कॉन्फ़िगरेशन फ़ाइल में इंगित करता है जिसे हमने अभी बनाया है। इसमें पोर्ट 8443 पर स्टनलाइन श्रवण है, एसएसएल में इसे प्राप्त होने वाले किसी भी कनेक्शन को लपेटें, और उन्हें 8001 पोर्ट पर पास करें
  • पंक्ति 2: एक सामान्य Django रनवेस्टर आवृत्ति (पोर्ट 8000 पर) प्रारंभ करता है
  • पंक्ति 3: एक और Django रनअवर इंस्टेंस (पोर्ट 8001 पर) शुरू करता है और इसे आने वाले सभी कनेक्शनों के इलाज के लिए कॉन्फ़िगर करता है जैसे कि वे HTTPS का उपयोग करके किए जा रहे थे।

रनस्क्रिप्ट फ़ाइल बनाएं जिसे हमने अभी-अभी निष्पादन योग्य बनाया है:

chmod a+x runserver

अब जब आप अपना डेवलपमेंट सर्वर चलाना चाहते हैं तो ./runserverअपने प्रोजेक्ट डायरेक्टरी से निष्पादित करें। इसे आज़माने के लिए, बस अपने ब्राउज़र को HTTP: // localhost: 8000 पर सामान्य HTTP ट्रैफ़िक के लिए इंगित करें , और HTTPS ट्रैफ़िक के लिए https: // localhost: 8443 । ध्यान दें कि आप ब्राउज़र का उपयोग किए गए प्रमाणपत्र के बारे में लगभग निश्चित रूप से शिकायत करेंगे और आपको अपवाद जोड़ने की आवश्यकता होगी या अन्यथा ब्राउज़र को ब्राउज़िंग जारी रखने के लिए स्पष्ट रूप से निर्देश दें। ऐसा इसलिए है क्योंकि आपने अपना प्रमाण पत्र बनाया है और यह ब्राउज़र द्वारा विश्वसनीय नहीं है कि वह किसके बारे में सच कह रहा है। यह विकास के लिए ठीक है, लेकिन जाहिर है कि यह उत्पादन के लिए कटौती नहीं करेगा।

दुर्भाग्य से, मेरी मशीन पर यह रनसर स्क्रिप्ट स्क्रिप्ट से बाहर नहीं निकलती है, जब मैं Ctrl-C मारता हूं। मुझे मैन्युअल रूप से प्रक्रियाओं को मारना होगा - किसी को भी इसे ठीक करने का सुझाव है?

संदर्भ सामग्री के लिए माइकल गिले के पोस्ट और django- बुनाई की विकी प्रविष्टि के लिए धन्यवाद ।


3
मैं बस इस जवाब पर अड़ गया। कुछ टिप्पणियां: आपको जरूरी नहीं कि 8001 पर एक अलग विकास आवृत्ति चलाने की आवश्यकता है, आप इसे 8000 पोर्ट से कनेक्ट करने की अनुमति दे सकते हैं। यदि आप चाहते हैं कि स्टनलाइन को स्वचालित रूप से मार दिया जाए, तो एक फ़ंक्शन और एक निकास जाल जोड़ें: kill_stunnel () { $ stunnel_pid को मारें। trap kill_stunnel से बाहर निकलें stunnel4 stunnel / dev https और stunnel_pid = $ 1
Friek

2
दूसरा उदाहरण HTTPS = 1 के साथ लागू किया गया है जिसका अर्थ है कि request.is_secure()रिपोर्ट करेगा True। यदि आपको इसकी आवश्यकता नहीं है, तो आप सही हैं - आप केवल एक ही उदाहरण पर स्टनलाइन को इंगित कर सकते हैं।
इवान ग्रिम

यदि आप stunnel fips मोड में चलते हैं तो समर्थित नहीं हैं .... fips = no को dev_https फ़ाइल में इसे बंद करने के लिए जोड़ें
yeahdixon

2
मैंने अभी-अभी यह कोशिश की है क्योंकि मैं किसी और द्वारा विकसित परियोजना पर साइट के काम की एक विकास प्रति स्थापित करने की कोशिश कर रहा हूं, लेकिन मुझे मिल रहा है "sslVersion = SSLv3": SSLv3 not supported
हेनरीएम डेस

@ फ़्रीक stunnel_pid=$1ने मेरे लिए काम नहीं किया लेकिन stunnel_pid=$!किया। आपके लिए कैसे stunnel_pid=$1काम किया ?
उत्के

86

मैं django-sllserver पैकेज का उपयोग करने की सलाह दूंगा

PyPI पर वर्तमान पैकेज केवल Django संस्करण 1.5.5 तक का समर्थन करता है, लेकिन 5d4664c के माध्यम से एक पैच किया गया है । इस फिक्स के साथ सिस्टम अच्छी तरह से चलता है और https कनेक्शन के परीक्षण के लिए एक बहुत ही सरल और सीधा समाधान है।

अद्यतन: जब से मैंने अपना उत्तर पोस्ट किया है, ऊपर दिए गए वचन को मास्टर शाखा में विलय कर दिया गया है और एक नई रिलीज़ को PyPI में धकेल दिया गया है। तो उस विशिष्ट फिक्स के लिए 5d4664c कमिट निर्दिष्ट करने की कोई आवश्यकता नहीं होनी चाहिए।


5
यह आशाजनक लग रहा है - मुझे इस पर स्वीकृत उत्तर को अपडेट करना पड़ सकता है। किसी और में तौलना चाहते हैं?
इवान ग्रिम

3
यह स्वीकृत उत्तर बन जाना चाहिए, एक काफी जटिल परियोजना में थोड़ी देर के लिए उपयोग किया जाता है जो केवल https पर चलने के बिना काम नहीं कर सकता है और कभी भी समस्या नहीं थी।
सिमोन सीतादिनी

2
अच्छी तरह से काम करता है ... धन्यवाद! :)
nidHi

5
अजगर के रूप में काम करता है 3.6.2 और Django 1.11.3।
फीनिक्स

2
Python 3.5 और Django 1.11 के रूप में काम करता है
Hansel

64

Django-sslserver के समान आप django- एक्सटेंशन से RunServerPlus का उपयोग कर सकते हैं

यह Werkzeug पर निर्भरता है (ताकि आप उत्कृष्ट Werkzeug डिबगर तक पहुँच प्राप्त करें) और pyOpenSSL (केवल ssl मोड के लिए आवश्यक) ताकि रन स्थापित किया जा सके:

pip install django-extensions Werkzeug pyOpenSSL

इसे अपनी परियोजनाओं सेटिंग्स फ़ाइल में INSTALLED_APPS में जोड़ें:

INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)

तब आप सर्वर को ssl मोड में चला सकते हैं:

./manage.py runserver_plus --cert /tmp/cert

यह एक प्रमाणित फ़ाइल बनाएगा /tmp/cert.crtऔर एक महत्वपूर्ण फ़ाइल /tmp/cert.keyजिस पर फिर से भविष्य के सत्रों के लिए पुन: उपयोग किया जा सकता है।

Django- एक्सटेंशन में शामिल अतिरिक्त सामानों का एक समूह है जो आपको उपयोग करने के लिए मिल सकता है, इसलिए यह डॉक्स के माध्यम से त्वरित झटका देने के लायक है।


2
वास्तव में Django 1.6+ के लिए सबसे अच्छा जवाब django-sllserver नए संस्करण के लिए ऑटो-रीलोड का समर्थन नहीं करता है
Zat42

डीबगिंग + सक्रिय एसएसएल के लिए सबसे अच्छा जवाब।
Yuda Prawira

मुझे आश्चर्य है कि यह docker कंटेनरीकृत ऐप में काम क्यों नहीं करता है
Roel

@ रोएल ने इसे एक त्वरित प्रयास बताया और यह एक हैलो वर्ल्ड ऐप के लिए काम करता है। हो सकता है कि आपकी आधार छवि पर निर्भरता की आवश्यकता न हो (जैसे यदि आप -alpine का उपयोग करते हैं) या आपको अपनी IP रेंज खोलने की आवश्यकता हो सकती है जैसे./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
djsutho

FileNotFoundError: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं है: '/tmp\\cert.crt'
मार्क एंथोनी

38

बस स्थापित करें

sudo pip install django-sslserver

स्थापित अप्स में sslserver शामिल करें

INSTALLED_APPS = (...
"sslserver",
...
)

अब तुम दौड़ सकते हो

 python manage.py runsslserver 0.0.0.0:8888

2
सबसे साफ समाधान!
सेक्सीबीस्ट

वास्तव में एक साफ समाधान है, लेकिन किसी कारण के लिए, यह बहुत धीमा है
भानु तेज

हम्म, क्रोम एक चेतावनी दे रहा है कि प्रमाणपत्र अमान्य है।
ज़ेरोहेजे १३'१

@ इसके विकास के लिए बस इसका उपयोग करें, इसलिए यह महत्वपूर्ण नहीं है।
शरप्लस 512

यह बहुत ही सुरुचिपूर्ण है - लेकिन क्या सुरक्षित कनेक्शन का परीक्षण करने के लिए इसका उपयोग करने का कोई समाधान है? पूर्व के लिए, यदि आप Facebook ग्राफ़ API के विरुद्ध परीक्षण करना चाहते हैं? Developers.facebook.com/docs/graph-api/webhooks#setup
frednikgohar

14

Https://uprok.com/ पर साइनअप करें । आप परीक्षण करने के लिए https का उपयोग कर सकते हैं। यह उन लोगों की मदद कर सकता है जो बस जल्दी से https का परीक्षण करना चाहते हैं।


6
एक त्वरित परीक्षण के लिए यह एक महान समाधान है। और मुझे किसी भी चीज़ के लिए साइनअप नहीं करना पड़ा, बस डाउनलोड करें और चलाएं। http: // 8000 8000, 8000 मेरा लोकलहोस्ट पोर्ट है।
गावकिलब्राइड

4

डिबगिंग प्रयोजनों के लिए स्टनेल विकल्प के अग्रभूमि संस्करण की तलाश करने वालों के लिए:

stunnel.pem इवान ग्रिम के शीर्ष मतदान जवाब के रूप में उत्पन्न एक प्रमाण पत्र है।

पोर्ट 443 पर सभी स्थानीय इंटरफेस को सुनें और लोकलहोस्ट पर पोर्ट 80 पर फॉरवर्ड करें

sudo stunnel -f -p stunnel.pem -P ~/stunnel.pid -r localhost:80 -d 443

1024 के तहत आने वाले बंदरगाहों (-d [होस्ट:] पोर्ट) के लिए sudo ही आवश्यक है


4
  1. एनरोक स्थापित करें। डाउनलोड लिंक: https://ngrok.com/download
  2. टर्मिनल पर निम्नलिखित आदेश जारी करें

    ngrok http 8000

यह एनजीआरओ सत्र शुरू करेगा। यह दो url को सूचीबद्ध करेगा। एक को http: // localhost: 8000 पर मैप किया जाता है । दूसरे को https: // localhost: 8000 पर मैप किया जाता है । कृपया नीचे स्क्रीनशॉट देखें। या तो यूआरएल का उपयोग करें। यह आपके स्थानीय सर्वर पर मैप करेगा।

नमूना ngrok सत्र स्क्रीनशॉट


इसे करने का सबसे आसान तरीका लेकिन नया https urlallowed_host
Roel

2

यह समाज के साथ एक पंक्ति में किया जा सकता है:

socat openssl-listen:8443,fork,reuseaddr,cert=server.pem,verify=0 tcp:localhost:8000

, जहां 8443 आने वाले HTTPS कनेक्शन के लिए सुनने के लिए एक बंदरगाह है, server.pem एक स्व-हस्ताक्षरित सर्वर प्रमाणपत्र और लोकलहोस्ट है: 8000 सामान्य रूप से लॉन्च किया गया एक डीबग HTTP सर्वर है।

अधिक जानकारी: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html


0

Django के बजाय Nginx जैसे प्रॉक्सी के साथ SSL / TLS को हैंडल करें। पोर्ट 443 पर सुनने के लिए नगीनेक्स की स्थापना की जा सकती है और फिर अपने Django देव सर्वर (आमतौर पर http://127.0.0.1:8000) के लिए अनुरोधों को आगे बढ़ाया जा सकता है । इसके लिए एक Nginx कॉन्फ़िगरेशन निम्न की तरह लग सकता है:

server {
    listen 443 ssl;
    server_name django-dev.localhost;

    ssl_certificate /etc/ssl/certs/nginx_chain.pem;
    ssl_certificate_key /etc/ssl/private/nginx.pem;    

    location / {
        proxy_pass http://127.0.0.1:8000/;
        proxy_set_header Host $host;
    }
}

तुम भी मैप करने के लिए की आवश्यकता होगी django-dev.localhostकरने के लिए 127.0.0.1और जोड़ने django-dev.localhostके लिए ALLOWED_HOSTSमें settings.py। लिनक्स पर, आपको निम्न पंक्ति को इसमें जोड़ना होगा /etc/hosts:

127.0.0.1   django-dev.localhost

फिर आप https://django-dev.localhostअपने ब्राउज़र में जाकर अपने देव स्थल तक पहुँच सकेंगे (आपको अपने ब्राउज़र की सुरक्षा चेतावनी को दरकिनार करना होगा)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.