2011-11-05 39 views
73

Tôi có một ứng dụng sử dụng các cookie "an toàn" và muốn thử nghiệm chức năng của nó mà không cần thiết lập một máy chủ phát triển có hỗ trợ SSL phức tạp. Có cách nào để làm điều này đơn giản như tôi có thể kiểm tra các yêu cầu không được mã hóa bằng cách sử dụng ./manage.py runserver?Làm cách nào để kiểm tra kết nối https với Django dễ dàng như tôi có thể kết nối không phải https bằng cách sử dụng 'runserver'?

+0

Bạn không thể chỉ định máy chủ 443 để làm cho máy chủ chạy trên cổng 443? – Furbeenator

+0

@Furbeenator: Thật không may là không - điều này sẽ chỉ làm cho HTTP máy chủ trên 443, những gì tôi cần là một máy chủ SSL thực tế đang chạy. –

Trả lời

97

Không phải đơn giản như máy chủ phát triển tích hợp, nhưng không quá khó để sử dụng stunnel làm trung gian SSLifying giữa 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 tính của bạn chấp nhận các kết nối trên một cổng được cấu hình, kết thúc chúng với 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 stunnel (8443) và vượt qua cùng bất kỳ lưu lượng truy cập nào nó nhận được cho một cá thể máy chủ chạy của Django.

Trước tiên, bạn sẽ cần stunnel có thể là downloaded here 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 để giữ các tệp cấu hình cần thiết và các công cụ SSL.

mkdir stunnel 
cd stunnel 

Tiếp theo, chúng tôi sẽ cần tạo chứng chỉ và khóa cục bộ để 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ỉ mà sử dụng khóa này (điều này sẽ hỏi bạn một loạt các thông tin sẽ được bao gồm trong certficate - chỉ cần trả lời với bất cứ điều gì cảm thấy tốt cho bạn):

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

Bây giờ kết hợp các thành một file duy nhất mà stunnel sẽ sử dụng để liên lạc SSL của nó:

cat stunnel.key stunnel.cert > stunnel.pem 

Tạo một tập tin cấu hình cho stunnel gọi 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 tin này cho stunnel những gì nó cần phải biết. Cụ thể, bạn đang nói không sử dụng tệp pid, nơi tệp chứng chỉ, phiên bản SSL nào sẽ sử dụng, nó sẽ chạy ở nền trước, nơi nó sẽ ghi nhật ký đầu ra của nó và phải 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) yêu cầu nó tự động đóng kết nối sau 1 giây đã trôi qua mà không có hoạt động.

Bây giờ bật sao lưu vào thư mục dự án Django của bạn (một với manage.py trong nó):

cd .. 

Dưới đây chúng tôi sẽ tạo ra một kịch bản có tên runserver mà sẽ chạy các máy chủ stunnel và hai phát triển django (một cho kết nối bình thường, và một cho kết nối SSL):

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

Hãy phá vỡ này xuống, line-by-line:

  • Dòng 1: Bắt đầu stunnel và trỏ nó vào tệp cấu hình mà chúng ta vừa tạo.Điều này đã stunnel lắng nghe trên cổng 8443, bọc bất kỳ kết nối nó nhận được trong SSL, và vượt qua chúng theo cổng 8001
  • Dòng 2: Bắt đầu một cá thể máy chủ lưu trữ Django bình thường (trên cổng 8000)
  • Dòng 3: Bắt đầu một trình điều khiển Django khác Ví dụ (trên cổng 8001) và 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.

Tận dụng tập tin Tập lệnh RunScript chúng tôi vừa tạo ra thực thi 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 bạn chỉ cần thực hiện ./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 bình thường và https://localhost:8443 cho lưu lượng truy cập 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 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ề nó. Điều này là tốt cho sự phát triển, nhưng rõ ràng là sẽ không cắt nó cho sản xuất.

Thật không may, trên máy tính của tôi script máy chủ lưu trữ này không thoát ra độc đáo khi tôi nhấn Ctrl-C. Tôi phải tự giết các quy trình - bất cứ ai có đề xuất sửa lỗi đó?

Cảm ơn Michael Gile's post và django-weave's wiki entry cho tài liệu tham chiếu.

+3

Tôi chỉ vấp phải câu trả lời này. Một số nhận xét: bạn không nhất thiết phải chạy một cá thể phát triển riêng biệt trên 8001, bạn cũng có thể cho phép nó kết nối với cổng 8000. Nếu bạn muốn stunnel tự động bị giết, thêm một hàm và một bẫy thoát: kill_stunnel() { kill $ stunnel_pid} trap kill_stunnel thoát stunnel4 stunnel/dev https & stunnel_pid = $ 1 – Friek

+2

Ví dụ thứ hai được gọi với HTTPS = 1 có nghĩa là 'request.is_secure()' sẽ báo cáo 'True'. Nếu bạn không cần điều đó thì bạn đã đúng - bạn chỉ có thể trỏ stunnel vào một cá thể duy nhất. –

+0

Nếu bạn chạy vào chế độ funnel fips không được hỗ trợ .... hãy thêm fips = no vào tệp dev_https để tắt nó – yeahdixon

1

Nó có thể được thực hiện trong một dòng với socat:

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

, nơi 8443 là một cổng lắng nghe cho các kết nối HTTPS đến, máy chủ server.pem là một chứng chỉ máy chủ tự ký và localhost: 8000 là một gỡ lỗi máy chủ HTTP được khởi chạy như thường lệ.

Thông tin chi tiết: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html

9

Đăng ký để viết https://ngrok.com/. Bạn có thể sử dụng https để kiểm tra. Điều này có thể giúp những người chỉ muốn thử nghiệm https nhanh chóng.

+0

Để kiểm tra nhanh, đây là một giải pháp tuyệt vời. Và tôi không phải đăng ký bất cứ thứ gì, chỉ cần tải xuống và chạy ./ngrok http 8000, 8000 là cổng cục bộ của tôi. – GavKilbride

61

Tôi khuyên bạn nên sử dụng gói django-sslserver.

Gói hiện tại trên PyPI chỉ hỗ trợ tối đa Django phiên bản 1.5.5 nhưng bản vá đã được cam kết qua 5d4664c. Với cách khắc phục này, hệ thống chạy tốt và là một giải pháp khá đơn giản và đơn giản để kiểm tra các kết nối https.

CẬP NHẬT: Vì tôi đã đăng câu trả lời, cam kết trên đã là merged vào chi nhánh chính và release mới đã được đẩy tới PyPI. Vì vậy, không nên có bất kỳ cần phải xác định cam kết 5d4664c cho sửa chữa cụ thể.

+5

Điều này có vẻ đầy hứa hẹn - tôi có thể phải cập nhật câu trả lời được chấp nhận cho câu trả lời này. Còn ai muốn cân nhắc không? –

+1

Chỉ cần thử nó ngay bây giờ, hoạt động như một nét duyên dáng trên 1,7c1. Trong khi tôi là tất cả cho câu trả lời thú vị, điều này chỉ được thực hiện. Các giải pháp stunnel là tốt nên gói django-sslserver ngừng được cập nhật. 1 cho câu trả lời này. – Plastefuchs

+3

điều này sẽ trở thành câu trả lời được chấp nhận, được sử dụng trong một thời gian trong một dự án khá phức tạp mà chỉ đơn giản là không thể làm việc mà không chạy trên https và không bao giờ có vấn đề. –

4

Đối với những người tìm kiếm một phiên bản cận cảnh của các tùy chọn stunnel cho mục đích gỡ lỗi:

stunnel.pem là một chứng chỉ được tạo ra như trong top Evan Grimm bình chọn câu trả lời.

Nghe trên tất cả các giao diện địa phương trên cổng 443 và chuyển tiếp đến cổng 80 trên localhost

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

sudo là chỉ cần thiết cho các cảng đến (-d [host:] cổng) 1024

35

Tương tự như django-sslserver bạn có thể sử dụng RunServerPlus từ django-extensions

Nó có phụ thuộc vào Werkzeug (để bạn có được quyền truy cập vào trình gỡ lỗi Werkzeug xuất sắc) và pyOpenSSL (chỉ cần thiết cho chế độ ssl) để cài đặt chạy:

pip install django-extensions Werkzeug pyOpenSSL 

Thêm nó vào INSTALLED_APPS trong các dự án của bạn tập tin settings.py:

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

Sau đó, bạn có thể chạy các máy chủ trong chế độ ssl với:

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

Điều này sẽ tạo ra một file cert tại /tmp/cert.crt và tệp khóa tại /tmp/cert.key, sau đó có thể được sử dụng lại cho các phiên trong tương lai.

Có một loạt các nội dung bổ sung được bao gồm trong các phần mở rộng django mà bạn có thể tìm thấy để sử dụng vì vậy rất đáng để có một đoạn phim nhanh qua các tài liệu.

+1

Thực ra câu trả lời hay nhất cho Django 1.6+ vì django-sslserver không hỗ trợ tự động tải lại cho phiên bản mới – Zat42

Các vấn đề liên quan