[django] ‘runserver’를 사용하여 비 https 연결처럼 쉽게 Django와 https 연결을 테스트 할 수 있습니까?
“보안”쿠키를 사용하는 애플리케이션이 있으며 복잡한 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
이것을 한 줄씩 분석해 보겠습니다.
- 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의 위키 항목 에 감사드립니다 .
답변
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에는 사용할 수있는 추가 항목이 많이 있으므로 문서를 빠르게 살펴볼 가치가 있습니다.
답변
그냥 설치
sudo pip install django-sslserver
설치된 aps에 sslserver 포함
INSTALLED_APPS = (...
"sslserver",
...
)
이제 당신은 실행할 수 있습니다
python manage.py runsslserver 0.0.0.0:8888
답변
https://ngrok.com/에 가입 하십시오 . https를 사용하여 테스트 할 수 있습니다. 이것은 https를 빠르게 테스트하려는 사람들에게 도움이 될 수 있습니다.
답변
디버깅 목적으로 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)에만 필요합니다.
답변
- ngrok를 설치하십시오. 다운로드 링크 : https://ngrok.com/download
-
터미널에서 다음 명령 실행
ngrok http 8000
ngrok 세션을 시작합니다. 두 개의 URL이 나열됩니다. 하나는 http : // localhost : 8000에 매핑됩니다 . 두 번째는 https : // localhost : 8000에 매핑됩니다 . 아래 스크린 샷을 확인하세요. 두 URL 중 하나를 사용하십시오. 로컬 서버에 매핑됩니다.