Ini tidak seperti sederhana seperti dibangun di server pengembangan, tapi itu tidak terlalu sulit untuk mendapatkan sesuatu yang dekat menggunakan stunnel sebagai perantara SSLifying antara browser dan server pembangunan. Stunnel memungkinkan Anda untuk menyiapkan server ringan di mesin Anda yang menerima koneksi pada port yang dikonfigurasi, membungkusnya dengan SSL, dan meneruskannya ke beberapa server lain. Kita akan menggunakan ini untuk membuka port stunnel (8443) dan meneruskan semua lalu lintas yang diterimanya ke instance runserver Django.
Pertama, Anda memerlukan stunnel yang dapat diunduh di sini atau mungkin disediakan oleh sistem paket platform Anda (misalnya:) apt-get install stunnel
. Saya akan menggunakan stunnel versi 4 (misalnya: /usr/bin/stunnel4
di Ubuntu), versi 3 juga akan berfungsi, tetapi memiliki opsi konfigurasi yang berbeda.
Pertama buat direktori dalam proyek Django Anda untuk menyimpan berkas konfigurasi yang diperlukan dan barang SSLish.
mkdir stunnel
cd stunnel
Selanjutnya kita perlu membuat sertifikat dan kunci lokal yang akan digunakan untuk komunikasi SSL. Untuk ini kita beralih ke openssl.
Buat kunci:
openssl genrsa 1024 > stunnel.key
Buat sertifikat yang menggunakan kunci ini (ini akan menanyakan Anda banyak informasi yang akan disertakan dalam sertifikat - jawab saja dengan apa pun yang Anda rasa nyaman):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Sekarang gabungkan ini menjadi satu file yang akan digunakan stunnel untuk komunikasi SSL-nya:
cat stunnel.key stunnel.cert > stunnel.pem
Buat file konfigurasi untuk stunnel bernama dev_https dengan konten berikut:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
File ini memberi tahu stunnel apa yang perlu diketahui. Secara khusus, Anda memberi tahu untuk tidak menggunakan file pid, di mana file sertifikatnya, versi SSL apa yang akan digunakan, yang harus dijalankan di latar depan, di mana harus mencatat keluarannya, dan bahwa itu harus menerima koneksi pada port 8443 dan memindahkannya ke port 8001. Parameter terakhir (TIMEOUTclose) memberitahu untuk menutup koneksi secara otomatis setelah 1 detik telah berlalu tanpa aktivitas.
Sekarang munculan kembali ke direktori proyek Django Anda (yang dengan manage.py di dalamnya):
cd ..
Di sini kita akan membuat skrip bernama runserver yang akan menjalankan stunnel dan dua server pengembangan django (satu untuk koneksi normal, dan satu untuk koneksi SSL):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Mari kita uraikan ini, baris demi baris:
- Baris 1: Memulai stunnel dan mengarahkannya ke file konfigurasi yang baru kita buat. Ini memiliki stunnel mendengarkan pada port 8443, membungkus koneksi apa pun yang diterimanya dalam SSL, dan meneruskannya ke port 8001
- Baris 2: Memulai instance runserver Django normal (pada port 8000)
- Baris 3: Memulai instance runserver Django lainnya (pada port 8001) dan mengkonfigurasinya untuk memperlakukan semua koneksi masuk seolah-olah mereka sedang dilakukan menggunakan HTTPS.
Jadikan file runscript yang baru saja kita buat dapat dieksekusi dengan:
chmod a+x runserver
Sekarang ketika Anda ingin menjalankan server pengembangan Anda, cukup jalankan ./runserver
dari direktori proyek Anda. Untuk mencobanya, arahkan browser Anda ke http: // localhost: 8000 untuk lalu lintas HTTP normal, dan https: // localhost: 8443 untuk lalu lintas HTTPS. Perhatikan bahwa browser Anda hampir pasti akan mengeluh tentang sertifikat yang digunakan dan mengharuskan Anda menambahkan pengecualian atau secara eksplisit menginstruksikan browser untuk melanjutkan penelusuran. Ini karena Anda membuat sertifikat sendiri dan tidak dipercaya oleh browser untuk mengatakan yang sebenarnya tentang siapa itu. Ini bagus untuk pengembangan, tetapi jelas tidak akan dipotong untuk produksi.
Sayangnya, di komputer saya, skrip runserver ini tidak keluar dengan baik ketika saya menekan Ctrl-C. Saya harus mematikan proses secara manual - ada yang punya saran untuk memperbaikinya?
Terima kasih kepada posting Michael Gile dan entri wiki django-weave untuk bahan referensi.