Nó không phải là đơn giản như việc xây dựng trong máy chủ phát triển, nhưng nó không phải là quá khó khăn để có được một cái gì đó gần bằng stunnel như một trung gian giữa SSLifying trình duyệt của bạn và máy chủ phát triển. Stunnel cho phép bạn thiết lập một máy chủ nhẹ trên máy của mình, chấp nhận các kết nối trên một cổng đã định cấu hình, bao bọc chúng bằng SSL và chuyển chúng đến một số máy chủ khác. Chúng tôi sẽ sử dụng điều này để mở một cổng đường hầm (8443) và chuyển bất kỳ lưu lượng nào mà nó nhận được đến một phiên bản máy chủ chạy Django.
Trước tiên, bạn sẽ cần đường hầm có thể được tải xuống tại đây hoặc có thể được cung cấp bởi hệ thống gói của nền tảng của bạn (ví dụ apt-get install stunnel
:). Tôi sẽ sử dụng phiên bản 4 của stunnel (ví dụ: /usr/bin/stunnel4
trên Ubuntu), phiên bản 3 cũng sẽ hoạt động, nhưng có các tùy chọn cấu hình khác nhau.
Trước tiên, hãy tạo một thư mục trong dự án Django của bạn để chứa các tệp cấu hình cần thiết và những thứ SSLish.
mkdir stunnel
cd stunnel
Tiếp theo, chúng ta sẽ cần tạo một chứng chỉ cục bộ và khóa để sử dụng cho giao tiếp SSL. Đối với điều này, chúng tôi chuyển sang openssl.
Tạo khóa:
openssl genrsa 1024 > stunnel.key
Tạo chứng chỉ sử dụng khóa này (điều này sẽ hỏi bạn một loạt thông tin sẽ được bao gồm trong chứng chỉ - chỉ cần trả lời với bất kỳ điều gì bạn cảm thấy tốt):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Bây giờ kết hợp chúng thành một tệp duy nhất mà stunnel sẽ sử dụng cho giao tiếp SSL của nó:
cat stunnel.key stunnel.cert > stunnel.pem
Tạo một tệp cấu hình cho stunnel có tên dev_https với các nội dung sau:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
Tệp này cho stunnel biết những gì nó cần biết. Cụ thể, bạn đang yêu cầu nó không sử dụng tệp pid, tệp chứng chỉ ở đâu, sử dụng phiên bản SSL nào, nó sẽ chạy ở nền trước, nơi nó sẽ ghi đầu ra và chấp nhận kết nối trên cổng. 8443 và đưa chúng đến cổng 8001. Tham số cuối cùng (TIMEOUTclose) cho biết nó sẽ tự động đóng kết nối sau 1 giây trôi qua mà không có hoạt động nào.
Bây giờ, hãy bật lại vào thư mục dự án Django của bạn (thư mục có management.py trong đó):
cd ..
Ở đây chúng tôi sẽ tạo một tập lệnh có tên là runningerver sẽ chạy stunnel và hai máy chủ phát triển django (một cho các kết nối thông thường và một cho các kết nối SSL):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Hãy chia nhỏ điều này từng dòng một:
- Dòng 1: Bắt đầu stunnel và trỏ nó đến tệp cấu hình mà chúng tôi vừa tạo. Điều này có chức năng lắng nghe đường hầm trên cổng 8443, quấn bất kỳ kết nối nào mà nó nhận được trong SSL và chuyển chúng đến cổng 8001
- Dòng 2: Bắt đầu phiên bản máy chủ chạy Django bình thường (trên cổng 8000)
- Dòng 3: Khởi động một phiên bản máy chủ chạy Django khác (trên cổng 8001) và định cấu hình nó để xử lý tất cả các kết nối đến như thể chúng đang được thực hiện bằng HTTPS.
Làm cho tệp runningcript chúng ta vừa tạo có thể thực thi được với:
chmod a+x runserver
Bây giờ khi bạn muốn chạy máy chủ phát triển của mình, chỉ cần thực thi ./runserver
từ thư mục dự án của bạn. Để dùng thử, chỉ cần trỏ trình duyệt của bạn đến http: // localhost: 8000 cho lưu lượng HTTP thông thường và https: // localhost: 8443 cho lưu lượng HTTPS. Lưu ý rằng trình duyệt của bạn gần như chắc chắn sẽ phàn nàn về chứng chỉ được sử dụng và yêu cầu bạn thêm một ngoại lệ hoặc hướng dẫn rõ ràng để trình duyệt tiếp tục duyệt. Điều này là do bạn đã tạo chứng chỉ của riêng mình và nó không được trình duyệt tin cậy để nói sự thật về chứng chỉ đó là ai. Điều này là tốt cho sự phát triển, nhưng rõ ràng sẽ không cắt giảm nó để sản xuất.
Thật không may, trên máy của tôi, tập lệnh trình chạy này không thoát ra một cách dễ dàng khi tôi nhấn Ctrl-C. Tôi phải giết các quy trình theo cách thủ công - bất cứ ai có đề xuất để khắc phục điều đó?
Cảm ơn bài đăng của Michael Gile và mục nhập wiki của django-wear để làm tư liệu tham khảo.