Este guia demonstra como ativar o HTTPS em um servidor de desenvolvimento Python Flask mediante a instalação de um certificado ssl. Os exemplos utilizam Linux, Python 3.6 e Flask 2.0.3.
Pré-requisitos
Antes de começar, verifique se você tem:
Um certificado ssl emitido por uma autoridade certificadora (CA) confiável. Se o certificado estiver expirado, renove-o antes de prosseguir.
-
Um certificado que abranja todos os nomes de domínio a proteger. Aplicam-se as seguintes regras de cobertura: para adicionar nomes de domínio, adquira um certificado comercial ou Anexe e substitua nomes de domínio.
Domínio com correspondência exata:
example.comprotege apenasexample.com.www.example.comprotege apenaswww.example.com.Domínio curinga:
*.example.comcobre subdomínios de primeiro nível, comowww.example.comea.example.com, mas não abrange o domínio raizexample.comnem subdomínios multinível, comoa.b.example.com. > Note: Para proteger subdomínios multinível, adicione o domínio exato (comoa.b.example.com) ou um curinga correspondente (como*.b.example.com) no campo Bound Domains.
Uma conta
rootou uma conta com privilégiossudono servidor.Um registro DNS do domínio que resolva para o endereço IP público do servidor.
Resolução DNS: O nome de domínio resolve para o endereço IP público do servidor.
Python e Flask instalados no servidor.
Etapa 1: Preparar o certificado ssl
Acesse a página SSL Certificate Management. Localize o certificado e clique em Download Certificate na coluna Actions. Na aba Download, selecione Other como Server Type e baixe o pacote.
-
Descompacte o pacote baixado:
Se o pacote contiver um arquivo de certificado (
.pem) e um arquivo de chave privada (.key), salve ambos, pois são necessários para a implantação.Se o pacote contiver apenas o arquivo de certificado (
.pem) e nenhum arquivo de chave privada (.key), implante o certificado junto com o arquivo de chave privada salvo na máquina local.
Se você usou uma ferramenta como OpenSSL ou keytool para gerar uma Solicitação de Assinatura de Certificado (CSR) ao solicitar o certificado, a chave privada foi salva apenas na máquina local e não está incluída no pacote baixado. Caso a chave privada seja perdida, o certificado torna-se inutilizável. Será necessário adquirir um novo certificado e gerar uma nova CSR e chave privada.
Etapa 2: Configurar o ambiente de sistema e rede
Garanta que o grupo de segurança do servidor e o firewall do sistema permitam tráfego de entrada na porta TCP 443 (HTTPS).
Verificar se a porta 443 está aberta
Execute o comando abaixo para verificar o status da porta 443. Substitua <your_server_public_ip> pelo endereço IP público do servidor.
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc
# Replace <your_server_public_ip> with the public IP address of your server.
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443
Se a porta 443 estiver aberta, a saída será semelhante a:
Ncat: Connected to <your_server_public_ip>:443
Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
# Replace <your_server_public_ip> with the public IP address of your server.
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443
Se a porta 443 estiver aberta, a saída apresentará o seguinte formato:
Connection to <your_server_public_ip> port [tcp/https] succeeded!
ou
[<your_server_public_ip>] 443 (https) open
Se a porta 443 não estiver aberta, siga as duas próximas etapas para liberá-la.
Liberar a porta 443 no grupo de segurança
Se o servidor estiver em uma plataforma cloud, o grupo de segurança deve permitir tráfego de entrada na porta TCP 443. Caso contrário, o service ficará inacessível. As etapas a seguir usam o Elastic Compute Service (ECS) da Alibaba Cloud como exemplo. Para outras plataformas cloud, consulte a documentação correspondente.
Acesse a página ECS instances e clique em na instância desejada para abrir a página de detalhes. Na seção Security Group Details, adicione uma regra de grupo de segurança com as seguintes configurações:
|
Campo |
Valor |
|
Action |
Allow |
|
Protocol |
Custom TCP |
|
Destination (Current Instance) |
HTTPS (443) |
|
Source |
0.0.0.0/0 (anywhere) |
Liberar a porta 443 no firewall
Execute o comando a seguir para identificar o service de firewall ativo:
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
echo "firewalld"
elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
echo "ufw"
elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
echo "nftables"
elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
echo "iptables"
elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
echo "iptables"
else
echo "none"
fi
Se a saída for none, nenhuma ação adicional é necessária. Caso contrário, execute o comando correspondente abaixo para abrir a porta 443.
firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload
ufw
sudo ufw allow 443/tcp
nftables
sudo nft add table inet filter 2>/dev/null
sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null
sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/null
iptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Para persistir as regras do iptables entre reinicializações:
-
RHEL/CentOS:
sudo yum install -y iptables-services sudo service iptables save -
Debian/Ubuntu:
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
Etapa 3: Instalar o certificado na aplicação Flask
-
Crie um diretório para armazenar os arquivos do certificado:
mkdir /ssl -
Faça upload do arquivo de certificado (
.pem) e do arquivo de chave privada (.key) para/ssl.Use o recurso de upload de arquivos da ferramenta de login remoto para transferir os arquivos. Ferramentas comuns incluem PuTTY, Xshell e WinSCP. Se estiver usando uma instância ECS da Alibaba Cloud, consulte Upload or download files .
-
Abra o arquivo da aplicação Flask e configure o ssl usando
ssl_context. Abaixo está um exemplo completo: copie-o, atualize os caminhos do certificado e salve comotest.pypara executar um teste rápido.# Import the Flask web framework from flask import Flask app = Flask(__name__) @app.route("/") def main(): return "<p>Hello, World!</p>" # Configure the SSL certificate. # The default HTTPS port is 443. # Replace '/ssl/cert.pem' with the absolute path to your certificate file. # Replace '/ssl/cert.key' with the absolute path to your private key file. context = (r'/ssl/cert.pem', r'/ssl/cert.key') app.run(host="0.0.0.0", port=443, ssl_context=context) -
Acesse o diretório que contém
test.pye inicie o service Flask:# Replace test.py with your actual filename. python test.pySe o Flask iniciar com sucesso, a saída será semelhante a:
* Serving Flask app 'test' * Running on all addresses (0.0.0.0) * Running on https://127.0.0.1:443 * Running on https://<your_server_public_ip>:443
Verificar a instalação
Conferir o certificado no navegador
Abra https://yourdomain no navegador (substitua yourdomain pelo domínio real). Um ícone de cadeado na barra de endereços confirma a implantação correta do certificado.

A partir da versão 117, o ícone
no Chrome foi substituído por
. Clique em neste ícone para visualizar os detalhes do certificado.
Se o ícone de cadeado não aparecer ou ocorrer um erro de acesso, limpe o cache do navegador ou tente novamente no modo anônimo.
Se o problema persistir, consulte Resolve certificate deployment issues based on browser error messages e o SSL certificate deployment troubleshooting guide .
Entrar em produção
Ao migrar para o ambiente de produção, aplique as práticas a seguir para aumentar a segurança e a estabilidade:
-
Executar como usuário não root: Crie um usuário de system dedicado e com baixos privilégios para a aplicação. Jamais execute a aplicação como root ou com privilégios administrativos.
Para implantações em produção, configure a terminação ssl na camada de gateway em vez de diretamente no Flask. Implante o certificado em um Server Load Balancer (SLB) ou em um proxy reverso como o Nginx. O gateway gerencia o HTTPS e encaminha o tráfego HTTP descriptografado para a aplicação Flask.
Manter credenciais fora do código: Armazene senhas e informações sensíveis em variáveis de ambiente, Vault ou em um service de gerenciamento de chaves na cloud. Nunca as codifique diretamente em arquivos de source ou de configuração.
Redirecionar HTTP para HTTPS: Configure o servidor para redirecionar todo o tráfego HTTP para HTTPS, evitando ataques do tipo man-in-the-middle.
Desativar protocolos legados: Na configuração do servidor, desative SSLv3, TLS 1.0 e TLS 1.1. Habilite apenas TLS 1.2 e TLS 1.3.
Monitorar a expiração do certificado: Após a implantação, ative o monitoramento de domínios no Certificate Management Service. A Alibaba Cloud verifica o período de validade do certificado e envia lembretes de renovação antes da expiração. Para mais detalhes, consulte Purchase and enable public domain name monitoring.
Perguntas frequentes
Por que o HTTPS fica inacessível após instalar ou atualizar o certificado?
Geralmente, isso ocorre devido a um dos motivos abaixo. Verifique-os nesta ordem:
Porta 443 bloqueada: O grupo de segurança ou o firewall não permite tráfego na porta 443. Consulte Step 2: Configure the system and network environment.
Incompatibilidade de domínio: O domínio acessado não consta nos Bound Domains do certificado. Veja as regras de correspondência de nomes de domínio em Pré-requisitos.
Flask não reiniciado: Reinicie o Flask após modificar o arquivo da aplicação.
Caminho do certificado incorreto: Verifique se os caminhos dos arquivos
.peme.keynossl_contextestão corretos e se você usa os arquivos de certificado válidos mais recentes.Certificado ausente em outros services: Se o domínio usa Content Delivery Network (CDN), Server Load Balancer (SLB) ou Web Application Firewall (WAF), instale o certificado também nesses services. Consulte Certificate deployment locations when traffic passes through multiple Alibaba Cloud services.
Implantação parcial em múltiplos servidores: Se o DNS do domínio resolver para vários servidores, instale o certificado em todos eles.
Como atualizar ou substituir um certificado instalado?
Faça backup dos arquivos
.peme.keyexistentes no servidor.Baixe os novos arquivos de certificado e chave privada do console do Certificate Management Service.
Faça upload dos novos arquivos para o servidor, sobrescrevendo os antigos. Mantenha os mesmos caminhos e nomes de arquivos especificados na configuração do Flask.
Reinicie o Flask para aplicar o novo certificado.
O Flask gera FileNotFoundError na inicialização
Esse erro indica que o caminho do arquivo em ssl_context está incorreto. Verifique se os caminhos para os arquivos de certificado e chave privada fornecidos em ssl_context estão corretos. Os caminhos devem ser relativos ao diretório onde você executa o comando python <your-app-file>.py ou devem ser absolutos.
O navegador exibe ERR_SSL_PROTOCOL_ERROR ou redefine a conexão
Verifique os seguintes pontos:
O arquivo de certificado e o arquivo de chave privada correspondem entre si.
O arquivo de certificado contém uma cadeia completa (geralmente um arquivo
.pem). Os arquivos de certificado baixados da Alibaba Cloud já incluem a cadeia completa.O grupo de segurança e o firewall permitem tráfego de entrada na porta 443.