Este guia mostra como ativar o HTTPS em um servidor de desenvolvimento Python Flask mediante a instalação de um certificado SSL. Os exemplos usam 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.comabrange subdomínios de primeiro nível, comowww.example.comea.example.com, mas não cobre 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) ao 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 seu 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.Caso o pacote contenha apenas o arquivo de certificado (
.pem) e nenhum arquivo de chave privada (.key), implante o certificado junto com o arquivo de chave privada salvo em sua 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 sua máquina local e não está incluída no pacote baixado. Caso a chave privada seja perdida, o certificado torna-se inutilizável. Nesse caso, adquira um novo certificado e gere uma nova CSR e chave privada.
Etapa 2: Configurar o sistema e o ambiente de 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 seu 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
Quando a porta 443 estiver aberta, a saída apresentará este formato:
Connection to <your_server_public_ip> port [tcp/https] succeeded!
ou
[<your_server_public_ip>] 443 (https) open
Caso a porta 443 não esteja 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 de nuvem, o grupo de segurança deve permitir tráfego de entrada na porta TCP 443. Caso contrário, o serviço ficará inacessível. Os passos a seguir usam o Alibaba Cloud Elastic Compute Service (ECS) como exemplo. Para outras plataformas de nuvem, consulte a documentação respectiva.
Acesse a página de instâncias do ECS e clique na instância desejada para abrir sua 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 serviço 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 sua ferramenta de login remoto para transferir os dados. Ferramentas comuns incluem PuTTY, Xshell e WinSCP. Se estiver usando uma instância do Alibaba Cloud ECS, consulte Upload ou download de arquivos .
-
Abra o arquivo da sua aplicação Flask e configure o SSL usando
ssl_context. Abaixo está um exemplo completo: copie-o, atualize os caminhos dos certificados 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 serviço 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 seu domínio real). Um ícone de cadeado na barra de endereços confirma que o certificado foi implantado corretamente.

A partir da versão 117, o ícone
no Chrome foi substituído por
. Clique neste ícone para visualizar os detalhes do certificado.
Se o ícone de cadeado não aparecer ou se ocorrer um erro de acesso, limpe o cache do navegador ou tente novamente no modo anônimo.
Caso o problema persista, consulte Resolver problemas de implantação de certificados com base em mensagens de erro do navegador e o Guia de solução de problemas de implantação de certificados SSL .
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 sem privilégios de root: Crie um usuário de sistema 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 o término SSL na camada de gateway em vez de fazê-lo 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, no Vault ou em um serviço de gerenciamento de chaves na nuvem. Nunca as codifique rigidamente 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 assim ataques 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 Adquirir e ativar o monitoramento de nomes de domínio públicos.
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 Etapa 2: Configurar o sistema e o ambiente de rede.
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.keydefinidos emssl_contextestão corretos e se você usa os arquivos de certificado válidos mais recentes.Certificado ausente em outros serviços: Se o seu domínio usa Content Delivery Network (CDN), Server Load Balancer (SLB) ou Web Application Firewall (WAF), instale o certificado também nesses serviços. Consulte Locais de implantação de certificados quando o tráfego passa por múltiplos serviços da Alibaba Cloud.
Implantação parcial em vários servidores: Se o DNS do seu domínio resolver para múltiplos 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á errado. 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 usar caminhos 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.