Saya memiliki aplikasi yang menggunakan cookie "aman" dan ingin menguji fungsionalitasnya tanpa perlu menyiapkan server pengembangan berkemampuan SSL yang rumit. Apakah ada cara untuk melakukan ini semudah saya menguji permintaan yang tidak dienkripsi menggunakan ./manage.py runserver
?
109
Jawaban:
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.
Selanjutnya kita perlu membuat sertifikat dan kunci lokal yang akan digunakan untuk komunikasi SSL. Untuk ini kita beralih ke openssl.
Buat kunci:
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):
Sekarang gabungkan ini menjadi satu file yang akan digunakan stunnel untuk komunikasi SSL-nya:
Buat file konfigurasi untuk stunnel bernama dev_https dengan konten berikut:
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):
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):
Mari kita uraikan ini, baris demi baris:
Jadikan file runscript yang baru saja kita buat dapat dieksekusi dengan:
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.
sumber
request.is_secure()
akan melaporkanTrue
. Jika Anda tidak membutuhkannya maka Anda benar - Anda bisa mengarahkan stunnel ke satu instance."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
tidak bekerja untuk saya tetapistunnel_pid=$!
berhasil. Bagaimanastunnel_pid=$1
Anda berhasil?Saya akan merekomendasikan menggunakan paket django-sslserver .
Paket saat ini pada PyPI hanya mendukung hingga Django versi 1.5.5 tetapi tambalan telah dilakukan melalui 5d4664c . Dengan perbaikan ini, sistem berjalan dengan baik dan merupakan solusi yang cukup sederhana dan mudah untuk menguji koneksi https.
PEMBARUAN: Sejak saya memposting jawaban saya, komit di atas telah digabungkan ke dalam cabang master dan rilis baru telah didorong ke PyPI. Jadi tidak perlu menentukan commit 5d4664c untuk perbaikan khusus tersebut.
sumber
Mirip dengan django-sslserver Anda bisa menggunakan RunServerPlus dari django-extensions
Ini memiliki ketergantungan pada Werkzeug (sehingga Anda mendapatkan akses ke debugger Werkzeug yang sangat baik) dan pyOpenSSL (hanya diperlukan untuk mode ssl) jadi untuk menginstal jalankan:
Tambahkan ke INSTALLED_APPS di file settings.py proyek Anda:
Kemudian Anda dapat menjalankan server dalam mode ssl dengan:
Ini akan membuat file sertifikat di
/tmp/cert.crt
dan file kunci/tmp/cert.key
yang kemudian dapat digunakan kembali untuk sesi mendatang.Ada banyak hal tambahan yang termasuk dalam django-extensions yang mungkin berguna bagi Anda sehingga ada baiknya melihat-lihat dokumen dengan cepat.
sumber
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
instal saja
sertakan sslserver di aps yang diinstal
sekarang kamu bisa lari
sumber
Daftar ke https://ngrok.com/ . Anda dapat menggunakan https untuk menguji. Ini dapat membantu orang yang hanya ingin menguji https dengan cepat.
sumber
Bagi mereka yang mencari versi latar depan dari opsi stunnel untuk keperluan debugging:
stunnel.pem adalah sertifikat yang dihasilkan seperti dalam jawaban pilihan teratas Evan Grimm.
Dengarkan semua antarmuka lokal di port 443 dan teruskan ke port 80 di localhost
sudo hanya diperlukan untuk port masuk (-d [host:] port) di bawah 1024
sumber
Terbitkan mengikuti perintah di terminal
Ini akan memulai sesi ngrok. Ini akan mencantumkan dua url. Satu dipetakan ke http: // localhost: 8000 . Kedua dipetakan ke https: // localhost: 8000 . Silakan periksa gambar di bawah. Gunakan salah satu url. Ini akan memetakan ke server lokal Anda.
sumber
allowed_host
Itu bisa dilakukan dalam satu baris dengan socat:
, di mana 8443 adalah port untuk mendengarkan koneksi HTTPS yang masuk, server.pem adalah sertifikat server yang ditandatangani sendiri dan localhost: 8000 adalah server HTTP debug yang diluncurkan seperti biasa.
Rincian lebih lanjut: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
sumber
Tangani SSL / TLS dengan proxy seperti Nginx daripada Django. Nginx dapat disetel untuk mendengarkan pada port 443 dan kemudian meneruskan permintaan ke server Django dev Anda (biasanya
http://127.0.0.1:8000
). Konfigurasi Nginx untuk ini mungkin terlihat seperti berikut:Anda juga akan perlu untuk memetakan
django-dev.localhost
ke127.0.0.1
dan menambahkandjango-dev.localhost
keALLOWED_HOSTS
dalamsettings.py
. Di Linux, Anda perlu menambahkan baris berikut ke/etc/hosts
:Kemudian Anda akan dapat mencapai situs dev Anda dengan masuk ke
https://django-dev.localhost
browser Anda (Anda harus melewati peringatan keamanan browser Anda).sumber