'runserver'를 사용하여 비 https 연결처럼 쉽게 Django와 https 연결을 테스트 할 수 있습니까?


109

"보안"쿠키를 사용하는 애플리케이션이 있으며 복잡한 SSL 지원 개발 서버를 설정할 필요없이 기능을 테스트하고 싶습니다. 를 사용하여 암호화되지 않은 요청을 테스트 할 수있는 것처럼 간단하게 수행 할 수있는 방법이 ./manage.py runserver있습니까?


서버가 포트 443에서 실행되도록하기 위해 runserver 443을 지정할 수 없습니까?
Furbeenator 2011

@Furbeenator : 안타깝게도 그렇지 않습니다. 이것은 443에서 서버 HTTP를 만들 것입니다. 필요한 것은 실제 SSL 서버가 실행되는 것입니다.
Evan Grim 2011

답변:


109

그것은 아니다 으로 개발 서버에 내장 간단하지만, 브라우저 및 개발 서버 사이의 SSLifying의 중개인으로되는 Stunnel을 사용하여 가까운 무언가를 얻기 위해 너무 어렵지 않다. Stunnel을 사용하면 구성된 포트에서 연결을 수락하고이를 SSL로 래핑하고 다른 서버로 전달하는 경량 서버를 컴퓨터에 설정할 수 있습니다. 이것을 사용하여 stunnel 포트 (8443)를 열고 수신하는 모든 트래픽을 Django runserver 인스턴스로 전달합니다.

먼저 여기에서 다운로드 하거나 플랫폼의 패키지 시스템 (예 :)에서 제공 할 수있는 stunnel이 필요합니다 apt-get install stunnel. stunnel 버전 4 (예 : /usr/bin/stunnel4Ubuntu)를 사용할 예정이며 버전 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

다음 내용으로 dev_https라는 stunnel 용 구성 파일을 만듭니다.

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 연결 용)를 실행할 runserver라는 스크립트를 생성합니다.

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

이것을 한 줄씩 분석해 보겠습니다.

  • 1 행 : stunnel을 시작하고 방금 만든 구성 파일을 가리 킵니다. 이것은 포트 8443에서 수신 대기하고 SSL에서 수신하는 모든 연결을 래핑하고 포트 8001로 전달합니다.
  • 2 행 : 일반 Django runserver 인스턴스를 시작합니다 (포트 8000).
  • 3 행 : 다른 Django runserver 인스턴스 (포트 8001)를 시작하고 들어오는 모든 연결을 HTTPS를 사용하는 것처럼 처리하도록 구성합니다.

방금 만든 runscript 파일을 다음으로 실행 가능하게 만듭니다.

chmod a+x runserver

이제 개발 서버를 실행하려면 ./runserver프로젝트 디렉토리에서 실행 하십시오. 사용해 보려면 브라우저에서 정상적인 HTTP 트래픽의 경우 http : // localhost : 8000 을, HTTPS 트래픽의 경우 https : // localhost : 8443 을 지정하십시오. 브라우저는 사용 된 인증서에 대해 거의 분명히 불평하고 예외를 추가하거나 브라우저에 계속 탐색하도록 명시 적으로 지시해야합니다. 이것은 당신이 당신 자신의 인증서를 만들었고 그것이 누구인지에 대해 진실을 말하는 것이 브라우저에 의해 신뢰되지 않았기 때문입니다. 이것은 개발에는 좋지만 분명히 생산을 위해 자르지는 않을 것입니다.

불행히도 내 컴퓨터 에서이 runserver 스크립트는 Ctrl-C를 눌렀을 때 멋지게 종료되지 않습니다. 수동으로 프로세스를 종료해야합니다. 누구든지이를 수정하라는 제안이 있습니까?

참조 자료에 대한 Michael Gile의 게시물 과 django-weave의 위키 항목 에 감사드립니다 .


3
나는이 대답을 우연히 만났습니다. 몇 가지 설명 : 8001에서 별도의 개발 인스턴스를 실행할 필요는 없습니다. 포트 8000에 연결하는 것이 좋습니다. stunnel이 자동으로 종료되도록하려면 함수와 종료 트랩을 추가하십시오. kill_stunnel () { kill $ stunnel_pid} trap kill_stunnel exit stunnel4 stunnel / dev https & stunnel_pid = $ 1
Friek

2
두 번째 인스턴스는 HTTPS = 1하는 수단을 호출 request.is_secure()보고합니다 True. 필요하지 않다면 맞습니다. 단일 인스턴스에 기절 할 수 있습니다.
Evan Grim

당신이되는 Stunnel로 실행하면 모드를 해제하려면 아니요 dev_https 파일에 .... 추가 FIPS = 지원되지 FIPS
yeahdixon

2
다른 사람이 개발 한 프로젝트에서 사이트 작업의 개발 사본을 설정하려고 할 때 이것을 시도했지만 "sslVersion = SSLv3": SSLv3 not supported.
HenryM

@Friek stunnel_pid=$1는 나를 위해 일하지 않았지만 stunnel_pid=$!해냈습니다. 어떻게 stunnel_pid=$1작동 했나요?
Utku

86

django-sslserver 패키지를 사용하는 것이 좋습니다 .

PyPI의 현재 패키지는 Django 버전 1.5.5까지만 지원하지만 패치는 5d4664c 를 통해 커밋되었습니다 . 이 수정으로 시스템은 잘 실행되며 https 연결을 테스트하기위한 매우 간단하고 간단한 솔루션입니다.

업데이트 : 내 답변을 게시 한 이후로 위의 커밋 이 마스터 브랜치 에 병합 되었으며 새 릴리스 가 PyPI에 푸시되었습니다. 따라서 특정 수정 사항에 대해 5d4664c 커밋을 지정할 필요가 없습니다.


5
이것은 유망 해 보입니다.이 질문에 대한 답변을 업데이트해야 할 수도 있습니다. 다른 사람이 체중을 원하십니까?
Evan Grim 2014

3
이것은 https에서 실행하지 않고는 작동하지 않고 문제가 없었던 매우 복잡한 프로젝트에서 잠시 동안 사용되는 허용되는 대답이되어야합니다.
시몬의 cittadini

2
잘 작동합니다 ... 감사합니다 :)!
nidHi

5
Python 3.6.2 및 Django 1.11.3에서 작동합니다.
phoenix

2
Python 3.5 및 Django 1.11에서 작동
Hansel

64

유사 장고 sslserver하는 당신이 사용할 수 RunServerPlus을 에서 장고 - 확장

Werkzeug (우수한 Werkzeug 디버거에 액세스 할 수 있음) 및 pyOpenSSL (ssl 모드에만 필요)에 종속되어 있으므로 다음을 실행하십시오.

pip install django-extensions Werkzeug pyOpenSSL

프로젝트 settings.py 파일의 INSTALLED_APPS에 추가하십시오.

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

그런 다음 다음을 사용하여 SSL 모드에서 서버를 실행할 수 있습니다.

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

그러면에 인증서 파일 /tmp/cert.crt과 키 파일 이 만들어지며이 파일은 /tmp/cert.key이후 세션에 다시 사용할 수 있습니다.

django-extensions에는 사용할 수있는 추가 항목이 많이 있으므로 문서를 빠르게 살펴볼 가치가 있습니다.


2
django-sslserver가 새 버전에 대한 자동 새로 고침을 지원하지 않기 때문에 실제로 Django 1.6+에 대한 최상의 답변
Zat42

디버깅 및 SSL 활성화에 대한 최고의 답변입니다.
Yuda Prawira

Docker 컨테이너화 된 앱에서 작동하지 않는 이유가 궁금합니다
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'
마크 앤서니 리브르

38

그냥 설치

sudo pip install django-sslserver

설치된 aps에 sslserver 포함

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

이제 당신은 실행할 수 있습니다

 python manage.py runsslserver 0.0.0.0:8888

2
가장 깨끗한 솔루션!
SexyBeast

사실, 그러나 어떤 이유로, 그것은 매우 느린 깨끗한 솔루션입니다
Bhanu TEZ

Chrome에서 인증서가 유효하지 않다는 경고를 표시합니다.
zerohedge

@zerohedge는 개발 용이므로 중요하지 않습니다.
Sharpless512 2011

이것은 매우 우아하지만 보안 연결을 테스트하기 위해 이것을 사용하는 솔루션이 있습니까? 예를 들어 Facebook Graph API에 대해 테스트하고 싶다면? developers.facebook.com/docs/graph-api/webhooks#setup
frednikgohar

14

https://ngrok.com/에 가입 하십시오 . https를 사용하여 테스트 할 수 있습니다. 이것은 https를 빠르게 테스트하려는 사람들에게 도움이 될 수 있습니다.


6
빠른 테스트를 위해 이것은 훌륭한 솔루션입니다. 그리고 나는 아무것도 등록 할 필요가 없었습니다. ./ngrok http 8000, 8000은 내 로컬 호스트 포트입니다.
GavKilbride 2016

4

디버깅 목적으로 stunnel 옵션의 포 그라운드 버전을 찾는 사람들을 위해 :

stunnel.pem은 Evan Grimm의 최고 투표 답변에서 생성 된 인증서입니다.

포트 443의 모든 로컬 인터페이스에서 수신하고 localhost의 포트 80으로 전달합니다.

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

sudo는 1024 미만의 수신 포트 (-d [host :] port)에만 필요합니다.


4
  1. ngrok를 설치하십시오. 다운로드 링크 : https://ngrok.com/download
  2. 터미널에서 다음 명령 실행

    ngrok http 8000

ngrok 세션을 시작합니다. 두 개의 URL이 나열됩니다. 하나는 http : // localhost : 8000에 매핑됩니다 . 두 번째는 https : // localhost : 8000에 매핑됩니다 . 아래 스크린 샷을 확인하세요. 두 URL 중 하나를 사용하십시오. 로컬 서버에 매핑됩니다.

ngrok 세션 스크린 샷 샘플


가장 쉬운 방법은 그것을 할 수 있지만에 HTTPS URL 새로운 넣어 기억allowed_host
로엘

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

Django가 아닌 Nginx와 같은 프록시로 SSL / TLS를 처리합니다. 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;
    }
}

또한지도해야합니다 django-dev.localhost으로 127.0.0.1하고 추가 django-dev.localhostALLOWED_HOSTS에서 settings.py. Linux에서는 다음에 다음 행을 추가해야합니다 /etc/hosts.

127.0.0.1   django-dev.localhost

그런 다음 https://django-dev.localhost브라우저에서 로 이동하여 개발 사이트에 연결할 수 있습니다 (브라우저의 보안 경고를 우회해야 함).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.