É perfeitamente possível usar HTTPS em localhost, inclusive no Django. Há várias formas de fazer isso, dependendo do que você precisa.
O pacote mkcert, por exemplo, cria certificados locais confiáveis pelo sistema operacional. A grande vantagem é que o navegador não exibe o aviso de "site inseguro".
Ele funciona para localhost, 127.0.0.1, nomes de domínio locais e com o Docker.
Quando desenvolvemos com Firebase Authentication, por exemplo, usar HTTPS em localhost pode ser interessante para deixar o ambiente de desenvolvimento ainda mais próximo da produção e testar funcionalidades relacionadas à autenticação e cookies seguros.
O Chocolatey é um gerenciador de pacotes para Windows, parecido com o apt do Ubuntu ou o brew do macOS.
Para verificar se ele está instalado, abra um Prompt de Comando ou PowerShell e execute:
choco --version
Se aparecer algo como:
2.4.3
Ele já está instalado e podemos seguir para a etapa Instalar o mkcert.
Se aparecer a mensagem abaixo, ainda não está instalado:
'choco' is not recognized...
Acesse o site oficial do Chocolatey.
Na página há o comando oficial de instalação que pode mudar ao longo do tempo, por isso é melhor copiá-lo diretamente do site.
No momento em que escrevo, temos a versão 2.7.3 que é instalada pelo comando abaixo:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
Resumidamente, o processo é:
Abra um terminal PowerShell ou cmd como Administrador.
Cole o comando fornecido na página oficial.
Aguarde a instalação.
Feche o terminal e abra novamente.
Teste com o comando:
choco --version
Com o Chocolatey instalado, basta comandar:
choco install mkcert
Abra um novo terminal e execute:
mkcert --version
A ferramenta é bem prática para desenvolvedores. Com o Chocolatey você instala e atualiza praticamente tudo pelo terminal:
choco install git
choco install vscode
choco install docker-desktop
choco install python
choco install openjdk
choco install nodejs
choco upgrade all
É uma ferramenta que costuma economizar bastante tempo na manutenção do ambiente de desenvolvimento.
Também é possível instalar o pacote mkcert pelo Winget do Windows. Primeiro, confira se o winget está disponível:
winget --version
Se aparecer a versão, já está pronto para uso.
Pesquise pelo mkcert:
winget search mkcert
Você deverá ver algo semelhante a:
Name Id Version
-----------------------------------
mkcert FiloSottile.mkcert x.y.z
Use o ID do pacote:
winget install FiloSottile.mkcert
Ou, se preferir confirmar automaticamente os termos:
winget install --id FiloSottile.mkcert --accept-package-agreements --accept-source-agreements
Abra um novo terminal e execute:
mkcert --version
Com o pacote instalado, abra um Prompt de Comando ou PowerShell como administrador e execute:
mkcert -install
Você deverá ver algo parecido com:
Created a new local CA
The local CA is now installed in the system trust store.
Isso é feito apenas uma vez.
Se você desenvolve aplicativos Web com Python/Django, o que é meu caso, siga os passos para acessar o projeto via "HTTPS":
Na raiz do projeto, crie uma pasta certs. Deve ficar assim:
projetoX/
│
├── certs/
├── manage.py
├── config/
├── app/
└── ...
Ainda dentro da pasta do projeto, comande:
mkcert -cert-file certs/localhost.pem -key-file certs/localhost-key.pem localhost 127.0.0.1 ::1
Isso cria 2 arquivos:
certs\localhost.pem
certs\localhost-key.pem
É importante ignorar essa pasta ao versionar. Para isso, no `.gitignore` do projeto, adicione a linha abaixo no final:
certs/
O runserver do Django não suporta HTTPS.
Minha recomendação é usar o Werkzeug juntamente com django-extensions, sem esquecer de atualizar o arquivo requirements.txt.
pip install django-extensions werkzeug
pip freeze > requirements.txt
Abra core/settings.py, localize a constante INSTALLED_APPS e adicione django_extensions.
Deve ficar parecido com:
INSTALLED_APPS = [
...
"django_extensions",
]
No terminal, comande:
python manage.py runserver_plus --cert-file certs/localhost.pem --key-file certs/localhost-key.pem
Você verá algo parecido com:
Performing system checks...
System check identified no issues (0 silenced).
Django version 6.0.6, using settings 'core.settings'
Development server is running at https://[127.0.0.1]:8000/
Using the Werkzeug debugger (https://werkzeug.palletsprojects.com/)
Quit the server with CTRL-BREAK.
Testar
No navegador, abra https://localhost:8000.
Se tudo deu certo, você terá:
Cadeado fechado;
Nenhum aviso de certificado;
Certificado válido.
Simmulando assim, (quase) perfeitamente um ambiente de produção, configurando CSRF_TRUSTED_ORIGINS, cookies seguros, etc.
Por exemplo:
CSRF_TRUSTED_ORIGINS = [
"https://localhost:8000",
...
]
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
Como python manage.py runserver não funciona, você pode fazer um pequeno shell script para iniciar o ambiente de desenvolvimento em HTTPS. Por exemplo, um arquivo `run_https.bat`:
@echo off
python manage.py runserver_plus ^
--cert-file certs/localhost.pem ^
--key-file certs/localhost-key.pem
Assim, sempre que quiser desenvolver com HTTPS, basta dar um duplo clique nesse arquivo ou executá-lo pelo terminal.
Para algo ainda mais moderno, crie um script Powershell chamado run.cmd:
@echo off
cls
if "%~1"=="" (
python manage.py runserver_plus --cert-file certs/localhost.pem --key-file certs/localhost-key.pem
goto end
)
if /I "%~1"=="run" (
shift
if "%~1"=="" (
python manage.py runserver_plus --cert-file certs/localhost.pem --key-file certs/localhost-key.pem
) else (
python manage.py %*
)
goto end
)
python manage.py %*
:end
Isso é um atalho para python manage.py. Por exemplo:
Comandar run é o mesmo que python manage.py runserver_plus --cert-file certs/localhost.pem ...
Comande run makemigrations que é o mesmo que python manage.py makemigrations
Comande run createsuperuser que é o mesmo que python manage.py createsuperuser
...