Tenho um aplicativo que usa cookies "seguros" e desejo testar sua funcionalidade sem precisar configurar um servidor de desenvolvimento habilitado para SSL complicado. Existe alguma maneira de fazer isso da mesma forma que posso testar solicitações não criptografadas usando ./manage.py runserver
?
109
Respostas:
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.
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:
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):
Agora combine-os em um único arquivo que o stunnel usará para sua comunicação SSL:
Crie um arquivo de configuração para o stunnel chamado dev_https com o seguinte conteúdo:
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):
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):
Vamos decompô-lo, linha por linha:
Torne o arquivo runscript que acabamos de criar executável com:
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.
fonte
request.is_secure()
irá relatarTrue
. Se você não precisa disso, está certo - você pode apenas apontar o stunnel para uma única instância."sslVersion = SSLv3": SSLv3 not supported
.stunnel_pid=$1
não funcionou para mim, masstunnel_pid=$!
funcionou. Comostunnel_pid=$1
funcionou para você?Eu recomendaria usar o pacote django-sslserver .
O pacote atual no PyPI suporta apenas a versão 1.5.5 do Django, mas um patch foi enviado via 5d4664c . Com esta correção, o sistema funciona bem e é uma solução bastante simples e direta para testar conexões https.
ATUALIZAÇÃO: Desde que postei minha resposta, o commit acima foi incorporado ao branch master e uma nova versão foi enviada ao PyPI. Portanto, não deve haver nenhuma necessidade de especificar o commit 5d4664c para essa correção específica.
fonte
Semelhante ao django-sslserver, você pode usar RunServerPlus do django-extensions
Ele tem dependências do Werkzeug (para que você tenha acesso ao excelente depurador Werkzeug) e pyOpenSSL (necessário apenas para o modo ssl) para instalar execute:
Adicione-o ao INSTALLED_APPS no arquivo settings.py do seu projeto:
Em seguida, você pode executar o servidor no modo SSL com:
Isso criará um arquivo cert em
/tmp/cert.crt
e um arquivo de chave no/tmp/cert.key
qual poderá ser reutilizado para sessões futuras.Há um monte de coisas extras incluídas nas extensões django que você pode achar úteis, então vale a pena dar uma olhada rápida na documentação.
fonte
./manage.py runserver_plus --cert /tmp/cert 0.0.0.0:8000
apenas instale
incluir sslserver em aps instalados
agora você pode correr
fonte
Inscreva-se em https://ngrok.com/ . Você pode usar https para testar. Isso pode ajudar as pessoas que desejam apenas testar https rapidamente.
fonte
Para quem procura uma versão em primeiro plano da opção stunnel para fins de depuração:
stunnel.pem é um certificado gerado como na resposta mais votada de Evan Grimm.
Ouça em todas as interfaces locais na porta 443 e encaminhe para a porta 80 no localhost
sudo só é necessário para portas de entrada (-d [host:] porta) abaixo de 1024
fonte
Emita o seguinte comando no terminal
Isso iniciará a sessão do ngrok. Ele listará dois urls. Um é mapeado para http: // localhost: 8000 . O segundo é mapeado para https: // localhost: 8000 . Por favor, verifique a imagem abaixo. Use qualquer um dos url. Ele será mapeado para seu servidor local.
fonte
allowed_host
Isso pode ser feito em uma linha com socat:
, em que 8443 é uma porta para ouvir conexões HTTPS de entrada, server.pem é um certificado de servidor autoassinado e localhost: 8000 é um servidor HTTP de depuração iniciado normalmente.
Mais detalhes: http://www.dest-unreach.org/socat/doc/socat-openssltunnel.html
fonte
Lide com SSL / TLS com um proxy como Nginx em vez de Django. O Nginx pode ser configurado para escutar na porta 443 e, em seguida, encaminhar solicitações para o servidor de desenvolvimento Django (normalmente
http://127.0.0.1:8000
). Uma configuração Nginx para isso pode ser semelhante a esta:Você também vai precisar para mapear
django-dev.localhost
a127.0.0.1
e adicionedjango-dev.localhost
aALLOWED_HOSTS
nosettings.py
. No Linux, você precisará adicionar a seguinte linha a/etc/hosts
:Então, você poderá acessar seu site de desenvolvimento acessando
https://django-dev.localhost
em seu navegador (você precisará ignorar o aviso de segurança do navegador).fonte