"보안"쿠키를 사용하는 애플리케이션이 있으며 복잡한 SSL 지원 개발 서버를 설정할 필요없이 기능을 테스트하고 싶습니다. 를 사용하여 암호화되지 않은 요청을 테스트 할 수있는 것처럼 간단하게 수행 할 수있는 방법이 ./manage.py runserver
있습니까?
"보안"쿠키를 사용하는 애플리케이션이 있으며 복잡한 SSL 지원 개발 서버를 설정할 필요없이 기능을 테스트하고 싶습니다. 를 사용하여 암호화되지 않은 요청을 테스트 할 수있는 것처럼 간단하게 수행 할 수있는 방법이 ./manage.py runserver
있습니까?
답변:
그것은 아니다 으로 개발 서버에 내장 간단하지만, 브라우저 및 개발 서버 사이의 SSLifying의 중개인으로되는 Stunnel을 사용하여 가까운 무언가를 얻기 위해 너무 어렵지 않다. Stunnel을 사용하면 구성된 포트에서 연결을 수락하고이를 SSL로 래핑하고 다른 서버로 전달하는 경량 서버를 컴퓨터에 설정할 수 있습니다. 이것을 사용하여 stunnel 포트 (8443)를 열고 수신하는 모든 트래픽을 Django runserver 인스턴스로 전달합니다.
먼저 여기에서 다운로드 하거나 플랫폼의 패키지 시스템 (예 :)에서 제공 할 수있는 stunnel이 필요합니다 apt-get install stunnel
. stunnel 버전 4 (예 : /usr/bin/stunnel4
Ubuntu)를 사용할 예정이며 버전 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
이것을 한 줄씩 분석해 보겠습니다.
방금 만든 runscript 파일을 다음으로 실행 가능하게 만듭니다.
chmod a+x runserver
이제 개발 서버를 실행하려면 ./runserver
프로젝트 디렉토리에서 실행 하십시오. 사용해 보려면 브라우저에서 정상적인 HTTP 트래픽의 경우 http : // localhost : 8000 을, HTTPS 트래픽의 경우 https : // localhost : 8443 을 지정하십시오. 브라우저는 사용 된 인증서에 대해 거의 분명히 불평하고 예외를 추가하거나 브라우저에 계속 탐색하도록 명시 적으로 지시해야합니다. 이것은 당신이 당신 자신의 인증서를 만들었고 그것이 누구인지에 대해 진실을 말하는 것이 브라우저에 의해 신뢰되지 않았기 때문입니다. 이것은 개발에는 좋지만 분명히 생산을 위해 자르지는 않을 것입니다.
불행히도 내 컴퓨터 에서이 runserver 스크립트는 Ctrl-C를 눌렀을 때 멋지게 종료되지 않습니다. 수동으로 프로세스를 종료해야합니다. 누구든지이를 수정하라는 제안이 있습니까?
참조 자료에 대한 Michael Gile의 게시물 과 django-weave의 위키 항목 에 감사드립니다 .
request.is_secure()
보고합니다 True
. 필요하지 않다면 맞습니다. 단일 인스턴스에 기절 할 수 있습니다.
"sslVersion = SSLv3": SSLv3 not supported
.
stunnel_pid=$1
는 나를 위해 일하지 않았지만 stunnel_pid=$!
해냈습니다. 어떻게 stunnel_pid=$1
작동 했나요?
django-sslserver 패키지를 사용하는 것이 좋습니다 .
PyPI의 현재 패키지는 Django 버전 1.5.5까지만 지원하지만 패치는 5d4664c 를 통해 커밋되었습니다 . 이 수정으로 시스템은 잘 실행되며 https 연결을 테스트하기위한 매우 간단하고 간단한 솔루션입니다.
업데이트 : 내 답변을 게시 한 이후로 위의 커밋 이 마스터 브랜치 에 병합 되었으며 새 릴리스 가 PyPI에 푸시되었습니다. 따라서 특정 수정 사항에 대해 5d4664c 커밋을 지정할 필요가 없습니다.
유사 장고 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에는 사용할 수있는 추가 항목이 많이 있으므로 문서를 빠르게 살펴볼 가치가 있습니다.
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
그냥 설치
sudo pip install django-sslserver
설치된 aps에 sslserver 포함
INSTALLED_APPS = (...
"sslserver",
...
)
이제 당신은 실행할 수 있습니다
python manage.py runsslserver 0.0.0.0:8888
https://ngrok.com/에 가입 하십시오 . https를 사용하여 테스트 할 수 있습니다. 이것은 https를 빠르게 테스트하려는 사람들에게 도움이 될 수 있습니다.
터미널에서 다음 명령 실행
ngrok http 8000
ngrok 세션을 시작합니다. 두 개의 URL이 나열됩니다. 하나는 http : // localhost : 8000에 매핑됩니다 . 두 번째는 https : // localhost : 8000에 매핑됩니다 . 아래 스크린 샷을 확인하세요. 두 URL 중 하나를 사용하십시오. 로컬 서버에 매핑됩니다.
allowed_host
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
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.localhost
로 ALLOWED_HOSTS
에서 settings.py
. Linux에서는 다음에 다음 행을 추가해야합니다 /etc/hosts
.
127.0.0.1 django-dev.localhost
그런 다음 https://django-dev.localhost
브라우저에서 로 이동하여 개발 사이트에 연결할 수 있습니다 (브라우저의 보안 경고를 우회해야 함).