ฉันจะทดสอบการเชื่อมต่อ https กับ Django ได้อย่างง่ายดายเหมือนกับการเชื่อมต่อที่ไม่ใช่ https โดยใช้ 'รันเนอร์เวอร์' ได้อย่างไร


109

ฉันมีแอปพลิเคชันที่ใช้คุกกี้ "ปลอดภัย" และต้องการทดสอบการทำงานโดยไม่จำเป็นต้องตั้งค่าเซิร์ฟเวอร์การพัฒนาที่เปิดใช้งาน SSL ที่ซับซ้อน มีวิธีการทำเช่นนี้เป็นเพียงฉันสามารถทดสอบคำขอที่ไม่ใช่การเข้ารหัสโดยใช้ใด ๆ./manage.py runserver?


คุณไม่สามารถระบุรันเนอร์เวอร์ 443 เพื่อให้เซิร์ฟเวอร์รันบนพอร์ต 443 ได้หรือไม่?
Furbeenator

@Furbeenator: ไม่น่าเสียดาย - นี่จะทำให้เซิร์ฟเวอร์ HTTP บน 443 สิ่งที่ฉันต้องการคือเซิร์ฟเวอร์ SSL ที่ใช้งานได้จริง
Evan Grim

คำตอบ:


111

มันไม่ได้เป็นง่ายๆเป็นที่สร้างขึ้นในเซิร์ฟเวอร์การพัฒนา แต่ก็ไม่ยากเกินไปที่จะได้รับสิ่งที่ใกล้เคียงกับการใช้ stunnel เป็นคนกลาง SSLifying ระหว่างเบราเซอร์และเซิร์ฟเวอร์การพัฒนาของคุณ Stunnel ช่วยให้คุณสามารถตั้งค่าเซิร์ฟเวอร์ที่มีน้ำหนักเบาบนเครื่องของคุณซึ่งยอมรับการเชื่อมต่อบนพอร์ตที่กำหนดค่าไว้ห่อด้วย SSL และส่งต่อไปยังเซิร์ฟเวอร์อื่น ๆ เราจะใช้สิ่งนี้เพื่อเปิดพอร์ต Stunnel (8443) และส่งต่อการรับส่งข้อมูลใด ๆ ที่ได้รับไปยังอินสแตนซ์ของรันเนอร์เวอร์ Django

ครั้งแรกที่คุณจะต้อง stunnel ซึ่งสามารถดาวน์โหลดได้ที่นี่หรืออาจจะให้โดยระบบแพคเกจแพลตฟอร์มของคุณ (เช่น: apt-get install stunnel) ฉันจะใช้ Stunnel เวอร์ชัน 4 (เช่น/usr/bin/stunnel4บน Ubuntu) เวอร์ชัน 3 ก็ใช้ได้เช่นกัน แต่มีตัวเลือกการกำหนดค่าที่แตกต่างกัน

ขั้นแรกให้สร้างไดเร็กทอรีในโปรเจ็กต์ Django ของคุณเพื่อเก็บไฟล์คอนฟิกูเรชันที่จำเป็นและข้อมูล SSLish

mkdir stunnel
cd stunnel

ต่อไปเราจะต้องสร้างใบรับรองในเครื่องและคีย์เพื่อใช้สำหรับการสื่อสาร SSL สำหรับสิ่งนี้เราหันไปใช้ openssl

สร้างคีย์:

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

สร้างไฟล์กำหนดค่าสำหรับ Stunnel ชื่อ dev_https โดยมีเนื้อหาต่อไปนี้:

pid=

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

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

ไฟล์นี้บอกสิ่งที่จำเป็นต้องรู้ Stunnel โดยเฉพาะอย่างยิ่งคุณกำลังบอกว่าอย่าใช้ไฟล์ pid โดยที่ไฟล์ใบรับรองคือ SSL เวอร์ชันใดที่จะใช้ว่าควรทำงานในเบื้องหน้าที่ซึ่งควรบันทึกเอาต์พุตและควรยอมรับการเชื่อมต่อบนพอร์ต 8443 และส่งไปยังพอร์ต 8001 พารามิเตอร์สุดท้าย (TIMEOUTclose) บอกให้ปิดการเชื่อมต่อโดยอัตโนมัติหลังจากผ่านไป 1 วินาทีโดยไม่มีกิจกรรมใด ๆ

ตอนนี้ป๊อปสำรองไปยังไดเร็กทอรีโครงการ Django ของคุณ (อันที่มี Manage.py อยู่ในนั้น):

cd ..

ที่นี่เราจะสร้างสคริปต์ชื่อรันเนอร์เวอร์ที่จะรัน Stunnel และเซิร์ฟเวอร์การพัฒนา django สองตัว (หนึ่งตัวสำหรับการเชื่อมต่อปกติและอีกอันสำหรับการเชื่อมต่อ SSL):

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

มาทำลายสิ่งนี้ทีละบรรทัด:

  • บรรทัดที่ 1: เริ่มต้น Stunnel และชี้ไปที่ไฟล์กำหนดค่าที่เราเพิ่งสร้างขึ้น สิ่งนี้มีฟังก์ชั่น Stunnel บนพอร์ต 8443 ตัดการเชื่อมต่อที่ได้รับใน SSL และส่งต่อไปยังพอร์ต 8001
  • บรรทัดที่ 2: เริ่มต้นอินสแตนซ์ Django รันเนอร์เวอร์ปกติ (บนพอร์ต 8000)
  • บรรทัดที่ 3: เริ่มต้นอินสแตนซ์ Django รันเนอร์เวอร์อื่น (บนพอร์ต 8001) และกำหนดค่าให้จัดการกับการเชื่อมต่อขาเข้าทั้งหมดราวกับว่ากำลังดำเนินการโดยใช้ HTTPS

สร้างไฟล์ runscript ที่เราเพิ่งสร้างปฏิบัติการด้วย:

chmod a+x runserver

ตอนนี้เมื่อคุณต้องการเรียกใช้เซิร์ฟเวอร์การพัฒนาของคุณเพียงแค่ดำเนินการ./runserverจากไดเรกทอรีโครงการของคุณ หากต้องการทดลองใช้เพียงแค่ชี้เบราว์เซอร์ของคุณไปที่http: // localhost: 8000สำหรับการรับส่งข้อมูล HTTP ปกติและhttps: // localhost: 8443สำหรับการรับส่งข้อมูล HTTPS โปรดทราบว่าเบราว์เซอร์ของคุณเกือบจะบ่นอย่างแน่นอนเกี่ยวกับใบรับรองที่ใช้และกำหนดให้คุณต้องเพิ่มข้อยกเว้นหรือสั่งให้เบราว์เซอร์เรียกดูต่อไปอย่างชัดเจน นี่เป็นเพราะคุณสร้างใบรับรองของคุณเองและเบราว์เซอร์ไม่ได้รับความไว้วางใจให้บอกความจริงว่าเป็นใคร นี่เป็นสิ่งที่ดีสำหรับการพัฒนา แต่เห็นได้ชัดว่าจะไม่ตัดมันเพื่อการผลิต

น่าเสียดายที่ในเครื่องของฉันสคริปต์ runerver นี้ไม่ได้ออกอย่างดีเมื่อฉันกด Ctrl-C ฉันต้องฆ่ากระบวนการด้วยตนเอง - ใครมีข้อเสนอแนะในการแก้ไขหรือไม่

ขอบคุณโพสต์ของ Michael Gile และรายการวิกิพีเดียของ django -oven สำหรับข้อมูลอ้างอิง


4
ฉันเพิ่งสะดุดกับคำตอบนี้ ข้อสังเกตบางประการ: คุณไม่จำเป็นต้องเรียกใช้อินสแตนซ์การพัฒนาแยกต่างหากใน 8001 คุณอาจปล่อยให้มันเชื่อมต่อกับพอร์ต 8000 เช่นกันหากคุณต้องการให้ Stunnel ถูกฆ่าโดยอัตโนมัติให้เพิ่มฟังก์ชันและ exit trap: kill_stunnel () { kill $ stunnel_pid} กับดัก kill_stunnel exit stunnel4 stunnel / dev https & stunnel_pid = $ 1
Friek

2
ตัวอย่างที่สองถูกเรียกด้วย HTTPS = 1 ซึ่งหมายความว่าจะรายงานrequest.is_secure() Trueหากคุณไม่ต้องการสิ่งนั้นแสดงว่าคุณพูดถูก - คุณสามารถชี้ Stunnel ที่อินสแตนซ์เดียว
Evan Grim

หากคุณเข้าสู่โหมด Stunnel fips ไม่รองรับ .... เพิ่ม fips = no ลงในไฟล์ dev_https เพื่อปิด
yeahdixon

2
ฉันได้พยายามเพียงแค่นี้ที่ฉันพยายามที่จะตั้งขึ้นสำเนาการพัฒนาของการทำงานของเว็บไซต์ในโครงการที่พัฒนาโดยคนอื่น "sslVersion = SSLv3": SSLv3 not supportedแต่ฉันได้รับ
HenryM

1
@HenryM ใช้แทนของล้าสมัยTLSv1.2 ฉันได้แก้ไขคำตอบไปยังบัญชีสำหรับการเลิกใช้งานของSSLv3 SSLv3
ดร. Sybren

86

ฉันอยากจะแนะนำให้ใช้แพ็คเกจdjango-sslserver

แพคเกจในปัจจุบันเกี่ยวกับ PyPI สนับสนุนได้ถึง Django รุ่น 1.5.5 แต่แพทช์มีความมุ่งมั่นผ่าน5d4664c ด้วยการแก้ไขนี้ระบบจะทำงานได้ดีและเป็นวิธีที่ค่อนข้างง่ายและตรงไปตรงมาสำหรับการทดสอบการเชื่อมต่อ https

อัปเดต: เนื่องจากฉันโพสต์คำตอบของฉันการกระทำข้างต้นได้รวมเข้ากับสาขาหลักและรุ่นใหม่ได้รับการผลักดันไปยัง PyPI ดังนั้นจึงไม่จำเป็นต้องระบุการกระทำ 5d4664c สำหรับการแก้ไขเฉพาะนั้น


5
สิ่งนี้ดูดี - ฉันอาจต้องอัปเดตคำตอบที่ยอมรับในคำตอบนี้ มีใครอยากชั่งน้ำหนักบ้างไหม?
Evan Grim

3
สิ่งนี้ควรกลายเป็นคำตอบที่ได้รับการยอมรับใช้มาระยะหนึ่งแล้วในโครงการที่ค่อนข้างซับซ้อนซึ่งไม่สามารถทำงานได้โดยไม่ต้องทำงานบน https และไม่เคยมีปัญหา
simone cittadini

2
ใช้งานได้ดี ... ขอบคุณ! :)
nidHi

5
ทำงานเป็น Python 3.6.2 และ Django 1.11.3
ต้นอินทผลัม

2
ทำงานเป็น Python 3.5 และ Django 1.11
Hansel

66

คล้ายกับ django-sslserver คุณสามารถใช้RunServerPlusจากdjango-extensions

มีการพึ่งพา Werkzeug (ดังนั้นคุณจึงสามารถเข้าถึงตัวดีบัก Werkzeug ที่ยอดเยี่ยม) และ pyOpenSSL (จำเป็นสำหรับโหมด ssl เท่านั้น) เพื่อติดตั้งรัน:

pip install django-extensions Werkzeug pyOpenSSL

เพิ่มลงใน INSTALLED_APPS ในไฟล์ settings.py โครงการของคุณ:

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

จากนั้นคุณสามารถเรียกใช้เซิร์ฟเวอร์ในโหมด ssl ด้วย:

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

สิ่งนี้จะสร้างไฟล์ใบรับรองที่/tmp/cert.crtและไฟล์คีย์ที่/tmp/cert.keyสามารถนำมาใช้ซ้ำสำหรับเซสชันในอนาคตได้

มีสิ่งพิเศษอีกมากมายที่รวมอยู่ในส่วนขยายของ django ที่คุณอาจพบว่าใช้งานได้ดังนั้นจึงควรค่าแก่การอ่านเอกสารอย่างรวดเร็ว


2
จริงๆแล้วคำตอบที่ดีที่สุดสำหรับ Django 1.6+ เนื่องจาก django-sslserver ไม่รองรับการโหลดซ้ำอัตโนมัติสำหรับเวอร์ชันใหม่
Zat42

คำตอบที่ดีที่สุดสำหรับการดีบัก + เปิดใช้งาน SSL
ยุดาปวีรา

ฉันสงสัยว่าทำไมมันไม่ทำงานในแอพที่บรรจุนักเทียบท่า
Roel

@Roel ทดลองใช้อย่างรวดเร็วและดูเหมือนว่าจะใช้งานได้กับแอป hello world อาจเป็นไปได้ว่าอิมเมจพื้นฐานของคุณไม่มีการอ้างอิงที่จำเป็น (เช่นถ้าคุณใช้ -alpine) หรือคุณอาจต้องเปิดช่วง IP ของคุณเช่น./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
djsutho

FileNotFoundError: [Errno 2] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: '/tmp\\cert.crt'
Mark Anthony Libres

38

เพียงแค่ติดตั้ง

sudo pip install django-sslserver

รวม sslserver ใน aps ที่ติดตั้ง

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

ตอนนี้คุณสามารถเรียกใช้

 python manage.py runsslserver 0.0.0.0:8888

2
น้ำยาที่สะอาดที่สุด!
SexyBeast

เป็นวิธีการแก้ปัญหาที่สะอาด แต่ด้วยเหตุผลบางประการมันช้ามาก
Bhanu Tez

อืม Chrome กำลังเตือนว่าใบรับรองไม่ถูกต้อง
zerohedge

@zerohedge เป็นเพียงการพัฒนาดังนั้นจึงไม่สำคัญ
Sharpless512

มันสวยมาก - แต่มีวิธีใดบ้างสำหรับการใช้สิ่งนี้เพื่อทดสอบการเชื่อมต่อที่ปลอดภัย? เช่นหากคุณต้องการทดสอบกับ Facebook Graph API? Developers.facebook.com/docs/graph-api/webhooks#setup
frednikgohar

15

ลงทะเบียนเพื่อhttps://ngrok.com/ คุณสามารถใช้ https เพื่อทดสอบ วิธีนี้อาจช่วยให้ผู้ที่ต้องการทดสอบ https อย่างรวดเร็ว


6
สำหรับการทดสอบอย่างรวดเร็วนี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม และฉันไม่ต้องสมัครอะไรเลยเพียงแค่ดาวน์โหลดและเรียกใช้. /ngrok http 8000, 8000 คือพอร์ต localhost ของฉัน
GavKilbride

นี่คือทางออกที่ดีที่สุดและราบรื่นที่สุด
Roel

4

สำหรับผู้ที่มองหาตัวเลือก Stunnel เวอร์ชันเบื้องหน้าเพื่อวัตถุประสงค์ในการดีบัก:

stunnel.pem เป็นใบรับรองที่สร้างขึ้นเช่นเดียวกับคำตอบที่ได้รับการโหวตสูงสุดของ Evan Grimm

ฟังบนอินเตอร์เฟสโลคัลทั้งหมดบนพอร์ต 443 และส่งต่อไปยังพอร์ต 80 บน localhost

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

sudo จำเป็นสำหรับพอร์ตขาเข้าเท่านั้น (-d [host:] port) ที่ต่ำกว่า 1024


4

วิธีหนึ่งคือการใช้ ngrok

  1. ติดตั้ง ngrok ลิงค์ดาวน์โหลด: https://ngrok.com/download

  2. ออกคำสั่งต่อไปนี้บนเทอร์มินัล

    ngrok http 8000

มันจะเริ่มเซสชัน ngrok มันจะแสดงรายการสอง url หนึ่งแมปกับ http: // localhost: 8000 วินาทีถูกแมปกับ https: // localhost: 8000 โปรดตรวจสอบภาพหน้าจอด้านล่าง ใช้ url อย่างใดอย่างหนึ่ง มันจะแมปกับเซิร์ฟเวอร์ภายในของคุณ

ตัวอย่างภาพหน้าจอเซสชัน ngrok


วิธีที่สองเป็นไปตามวิธีการแก้ปัญหาที่จัดทำโดย @EvanGrim ลิงก์ - https://stackoverflow.com/a/8025645/9384511

วิธีแรกเป็นวิธีที่แนะนำหากคุณต้องการทดสอบ https url เพียงสองสามครั้ง แต่ถ้าความต้องการของคุณบอกว่า https เป็นข้อบังคับก็จะดีกว่าถ้าคุณทำตามวิธีที่สอง ฉันประสบปัญหาต่อไปนี้เกี่ยวกับโซลูชัน @EvanGrim

  1. เมื่อเข้าถึง https url ผ่านการร้องขอคุณจะได้รับคำเตือน subAltNames ที่หายไป เรื่องนี้ไม่ควรเป็นปัญหา URL ของคุณควรใช้งานได้ดี
  2. คุณจะไม่สามารถเข้าถึง https url ผ่าน android volley ได้ มันจะส่งข้อผิดพลาด - ip หรือ localhost ของคุณไม่ได้รับการยืนยัน อะไรแบบนั้น.

ฉันแก้ไขปัญหาเหล่านี้โดยการเพิ่ม subAltname ลงในใบรับรอง ssl ด้านล่างนี้เป็นขั้นตอนที่ฉันทำตามเพื่อเรียกใช้เซิร์ฟเวอร์ https ภายในโดยไม่มีปัญหาสองประการข้างต้น

  1. ติดตั้ง Stunnel เวอร์ชัน Stunnel ที่ใช้คือ version4 (/ usr / bin / stunnel4) สำหรับ Ubuntu execute

     sudo apt-get install stunnel
  2. สร้างไดเร็กทอรี Stunnel ใน Django Project ของคุณ

  3. คัดลอก openssl.cnf จาก /etc/ssl/openssl.cnf หรือ /usr/lib/ssl/openssl.cnf ไปยัง Stunnel หลีกเลี่ยงการแก้ไขโดยตรงเว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่

    1. ค้นหาส่วน [req] หรือ [req] ในชุดส่วน req

       x509_extensions = v3_ca 
       req_extensions = v3_req 

      x509_extensions และ req_extensions ควรมีอยู่ ถ้าไม่มีให้เพิ่ม หากมีความคิดเห็นให้ยกเลิกการแสดงความคิดเห็น

    2. ค้นหาส่วน [v3_req] ในส่วนนี้เพิ่ม

       subjectAltName = @alt_names
    3. ค้นหาส่วน [v3_ca] ในส่วนนี้เพิ่ม

       subjectAltName = @alt_names
    4. เราจำเป็นต้องเพิ่มส่วนใหม่ alt_names สามารถเพิ่มได้ทุกที่ ฉันเพิ่มหลังส่วน [v3_ca] สำหรับโลคัลโฮสต์และที่อยู่ IP ของคุณให้เพิ่มดังนี้:

       [alt_names]
       DNS.1 = localhost
       IP.1 = x.x.x.x
       IP.2 = 127.0.0.1
  4. เพื่อสร้างคีย์ดำเนินการ

     openssl genrsa 1024 > stunnel.key
  5. ในการสร้างใบรับรองที่เข้ารหัส DER ให้ดำเนินการคำสั่งแรกหรือที่สอง

    1. หากคุณได้แก้ไขโดยตรง /etc/ssl/openssl.cnf หรือ /usr/lib/ssl/openssl.cnf

       openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
    2. หากคุณทำสำเนา openssl.cnf ในไดเร็กทอรี Stunnel

       openssl req -new -x509 -nodes -sha256 -days 365 -key stunnel.key -config openssl.cnf > stunnel.cert
  6. ในการสร้างใบรับรองที่ถอดรหัส PEM ดำเนินการ

     cat stunnel.key stunnel.cert > stunnel.pem
  7. สร้างไฟล์กำหนดค่าสำหรับ Stunnel ชื่อ dev_https.config โดยมีเนื้อหาต่อไปนี้

     #not to use pid
     pid=
     #path of certificate file
     cert = stunnel/stunnel.pem
     #version of SSL to use
     sslVersion = TLSv1.1
     foreground = yes
     #log output path
     output = stunnel.log
    
     [https]
     #listen on port 8443
     accept=8443
     #tunnel the connection to port 8001
     connect=8001
     # and close connection automatically after one second
     TIMEOUTclose=1

    โปรดทราบว่า sslVersion ใช้เวอร์ชัน OpenSSL ที่ใช้โดย python interpreter เหมืองคือ OpenSSL 1.1.1 สำหรับเวอร์ชันนี้ให้ใช้ TLSv1.1 ค้นหาเวอร์ชัน openssl ของคุณและเพิ่มเวอร์ชันที่เกี่ยวข้อง คุณสามารถค้นหาเวอร์ชัน OpenSSL ได้โดยดำเนินการ

     python -c "import ssl; print(ssl.OPENSSL_VERSION)"
  8. สร้างสคริปต์ที่เรียกว่ารันเนอร์เวอร์และเพิ่มเนื้อหาด้านล่าง สคริปต์นี้ควรอยู่ในไดเร็กทอรีเดียวกับ Manage.py สคริปต์นี้จะรัน Stunnel สองตัวและ django สองสภาพแวดล้อม หนึ่งสำหรับการเชื่อมต่อ http และหนึ่งสำหรับการเชื่อมต่อ https ปัญหาของรันเนอร์เวอร์ที่ไม่ออกอย่างหมดจด (ตามที่ Evan กล่าวถึง) ได้รับการแก้ไขโดยคำสั่งกับดักซึ่งเรียกใช้ฟังก์ชันการล้างข้อมูล

     stunnel4 stunnel/dev_https.config &
     stunnel_pid=$!
     echo "stunnel pid: $stunnel_pid"
     python manage.py runserver 0.0.0.0:8000 &
     py_server_bg=$!
     echo "BG py server pid: $py_server_bg"
     HTTPS=1 python manage.py runserver 0.0.0.0:8001
    
     function cleanup()
     {
       echo "Cleaning up"
       kill $stunnel_pid
       kill $py_server_bg
       echo "Cleaned"
     }
    
     trap cleanup EXIT
  9. ดำเนินการ

     chmod a+x runserver
  10. จากคุณ django ดำเนินโครงการ

    ./runserver
  11. ตอนนี้ถ้าคุณรันคำสั่งการร้องขอ python คำเตือนที่หายไป subjectAltNames จะไม่แสดง นอกจากนี้คำขอ https วอลเลย์ Android ของคุณจะดำเนินการได้ดี

    data = {'login_id':'someid'}
    headers = {'content-type': 'application/json'}
    url = "https://localhost:8443/myauth/check-id/"
    r=requests.post(url, data=json.dumps(data), headers=headers,verify='stunnel/stunnel.pem')

ฉันขอขอบคุณ @EvanGrim สำหรับการแก้ปัญหา และขอบคุณ @Friek, @Utku และ @dr Sybren จากความคิดเห็นของพวกเขาฉันใช้ฟังก์ชันล้างข้อมูล


วิธีที่ง่ายที่สุด แต่อย่าลืมใส่ https url ใหม่ไปที่allowed_host
Roel

2

สามารถทำได้ในบรรทัดเดียวด้วย socat:

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

โดยที่ 8443 เป็นพอร์ตสำหรับรับฟังการเชื่อมต่อ HTTPS ขาเข้า server.pem คือใบรับรองเซิร์ฟเวอร์ที่ลงนามด้วยตนเองและ localhost: 8000 คือเซิร์ฟเวอร์ HTTP ที่ดีบักที่เปิดตัวตามปกติ

รายละเอียดเพิ่มเติม: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html


0

จัดการ SSL / TLS ด้วยพร็อกซีเช่น Nginx แทนที่จะเป็น Django Nginx สามารถตั้งค่าให้รับฟังบนพอร์ต 443 จากนั้นส่งต่อคำขอไปยังเซิร์ฟเวอร์ Django dev ของคุณ (โดยทั่วไป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;
    }
}

นอกจากนี้คุณยังจะต้อง map django-dev.localhostไป127.0.0.1และเพิ่มdjango-dev.localhostการในALLOWED_HOSTS settings.pyบน Linux คุณจะต้องเพิ่มบรรทัดต่อไปนี้ใน/etc/hosts:

127.0.0.1   django-dev.localhost

จากนั้นคุณจะสามารถเข้าถึงไซต์ dev ของคุณได้โดยไปที่https://django-dev.localhostเบราว์เซอร์ของคุณ (คุณจะต้องข้ามคำเตือนความปลอดภัยของเบราว์เซอร์ของคุณ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.