Não é tão simples quanto o servidor de desenvolvimento integrado, mas não é muito difícil chegar perto usando o stunnel como um intermediário SSLificador entre o seu navegador e o servidor de desenvolvimento. O Stunnel permite que você configure um servidor leve em sua máquina que aceita conexões em uma porta configurada, envolve-as com SSL e as passa adiante para algum outro servidor. Usaremos isso para abrir uma porta de stunnel (8443) e passar qualquer tráfego que receber para uma instância de servidor de execução do Django.
Primeiro você precisará do stunnel, que pode ser baixado aqui ou pode ser fornecido pelo sistema de pacotes da sua plataforma (por exemplo apt-get install stunnel
:). Vou usar a versão 4 do stunnel (por exemplo: /usr/bin/stunnel4
no Ubuntu), a versão 3 também funcionará, mas tem opções de configuração diferentes.
Primeiro crie um diretório em seu projeto Django para manter os arquivos de configuração necessários e coisas SSLish.
mkdir stunnel
cd stunnel
Em seguida, precisaremos criar um certificado local e uma chave a ser usada para a comunicação SSL. Para isso, recorremos ao openssl.
Crie a chave:
openssl genrsa 1024 > stunnel.key
Crie o certificado que usa esta chave (isso irá pedir-lhe um monte de informações que serão incluídas no certificado - apenas responda com o que achar melhor):
openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert
Agora combine-os em um único arquivo que o stunnel usará para sua comunicação SSL:
cat stunnel.key stunnel.cert > stunnel.pem
Crie um arquivo de configuração para o stunnel chamado dev_https com o seguinte conteúdo:
pid=
cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log
[https]
accept=8443
connect=8001
TIMEOUTclose=1
Este arquivo informa ao stunnel o que ele precisa saber. Especificamente, você está dizendo a ele para não usar um arquivo pid, onde está o arquivo de certificado, qual versão de SSL usar, que deve ser executado em primeiro plano, onde deve registrar sua saída e que deve aceitar conexão na porta 8443 e transportá-los para a porta 8001. O último parâmetro (TIMEOUTclose) diz para fechar automaticamente a conexão após 1 segundo passar sem atividade.
Agora volte para o diretório do projeto Django (aquele com manage.py):
cd ..
Aqui, criaremos um script chamado runserver que executará o stunnel e dois servidores de desenvolvimento django (um para conexões normais e outro para conexões SSL):
stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001
Vamos decompô-lo, linha por linha:
- Linha 1: inicia o stunnel e aponta para o arquivo de configuração que acabamos de criar. Isso faz com que o stunnel escute na porta 8443, envolva todas as conexões recebidas em SSL e as transmita para a porta 8001
- Linha 2: inicia uma instância normal do servidor de execução do Django (na porta 8000)
- Linha 3: inicia outra instância do servidor de execução do Django (na porta 8001) e a configura para tratar todas as conexões de entrada como se estivessem sendo realizadas usando HTTPS.
Torne o arquivo runscript que acabamos de criar executável com:
chmod a+x runserver
Agora, quando você quiser executar o servidor de desenvolvimento, execute apenas a ./runserver
partir do diretório do projeto. Para experimentar, basta apontar o navegador para http: // localhost: 8000 para tráfego HTTP normal e https: // localhost: 8443 para tráfego HTTPS. Observe que seu navegador quase definitivamente reclamará sobre o certificado usado e exigirá que você adicione uma exceção ou instrua explicitamente o navegador a continuar navegando. Isso ocorre porque você criou seu próprio certificado e o navegador não confia nele para dizer a verdade sobre ele. Isso é bom para o desenvolvimento, mas obviamente não servirá para a produção.
Infelizmente, na minha máquina, esse script do servidor de execução não sai bem quando pressiono Ctrl-C. Tenho que matar os processos manualmente - alguém tem alguma sugestão para consertar isso?
Obrigado à postagem de Michael Gile e à entrada do wiki de django-weave para o material de referência.