Ative o HTTPS no servidor Nginx ou Tengine instalando um certificado SSL. Este guia orienta o download do certificado, a abertura da porta 443, a configuração do bloco de servidor do Nginx e a verificação do resultado.
Objetivos:
Baixe o pacote de certificados do console SSL Certificates e carregue-o no servidor
Abrir a porta 443 no grupo de segurança e no firewall do sistema
Adicionar um bloco de servidor HTTPS à configuração do Nginx
Recarregar o Nginx e confirme o funcionamento do certificado
As etapas também se aplicam ao Tengine, compatível com as configurações do Nginx.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um certificado SSL emitido por uma autoridade certificadora (CA) confiável. Se o certificado estiver expirado ou prestes a expirar, renove-o primeiro
Uma conta
rootou com privilégiossudono servidorUm registro DNS de domínio configurado para resolver para o endereço IP público do servidor
Um certificado que cubra todos os domínios a proteger
Regras de cobertura de domínio:
|
Tipo de cobertura |
O que protege |
O que não protege |
|
Correspondência exata ( |
Apenas |
|
|
Correspondência exata ( |
Apenas |
O domínio raiz ou outros subdomínios |
|
Wildcard ( |
Subdomínios de primeiro nível: |
Domínio raiz |
Para proteger um subdomínio multinível comoa.b.example.com, o campo Bound Domains deve conter o domínio exato ou um wildcard correspondente, como*.b.example.com.
Para adicionar ou alterar nomes de domínio, compre um certificado comercial ou adicione e substitua nomes de domínio.
Etapa 1: Preparar o certificado SSL
Acesse a página SSL Certificates. Na coluna Actions do certificado desejado, clique em Download Certificate. Na aba Download, selecione Nginx 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. Eles serão necessários na próxima etapa.Caso o pacote contenha apenas um arquivo
.peme nenhum arquivo.key, utilize o arquivo de chave privada salvo localmente durante a geração da Solicitação de Assinatura de Certificado (CSR).
Se você usou OpenSSL ou keytool para gerar a CSR, a chave privada foi salva apenas na máquina local e não está incluída no pacote baixado. Se a chave privada for perdida, o certificado torna-se inutilizável. Compre um novo certificado comercial e gere uma nova CSR e chave privada.
-
Carregue os arquivos
.peme.keyno servidor. Armazene-os em um diretório seguro, como/etc/ssl/cert.Utilize o recurso de upload de arquivos de uma ferramenta de login remoto, como PuTTY, Xshell ou WinSCP. Se o servidor for uma instância do Elastic Compute Service (ECS) da Alibaba Cloud, consulte Upload ou download de arquivos .
Etapa 2: Abrir a porta 443
O tráfego HTTPS utiliza a porta TCP 443. Confirme se ela está aberta tanto no grupo de segurança da nuvem quanto no firewall do sistema.
Verificar se a porta 443 está aberta
Execute o comando a seguir para testar a conectividade na 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 saída for Ncat: Connected to <your_server_public_ip>:443, a porta 443 está aberta. Caso contrário, conclua as etapas abaixo.
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 saída for Connection to <your_server_public_ip> port [tcp/https] succeeded! ou [<your_server_public_ip>] 443 (https) open, a porta 443 está aberta. Caso contrário, conclua as etapas abaixo.
Abrir a porta 443 no grupo de segurança
Se o servidor for executado em uma plataforma de nuvem, o grupo de segurança deve permitir tráfego TCP de entrada na porta 443. As etapas abaixo usam o Alibaba Cloud ECS como exemplo. Para outras plataformas de nuvem, consulte a documentação respectiva.
Acesse a página de instâncias do Elastic Compute Service (ECS) e clique em no nome da instância desejada. Na seção Security Group Details, adicione uma regra com as seguintes configurações e clique em Add a security group rule:
|
Campo |
Valor |
|
Action |
Allow |
|
Protocol |
Custom TCP |
|
Destination (Current Instance) |
HTTPS (443) |
|
Source |
0.0.0.0/0 (anywhere) |
Abrir a porta 443 no firewall do sistema
Execute o comando a seguir para identificar o 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 de firewall é necessária. Caso contrário, execute o comando correspondente ao tipo de firewall:
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 após uma reinicialização:
-
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: Instale o certificado SSL no Nginx
Instale o módulo SSL
Execute o comando a seguir. Se a saída for --with-http_ssl_module, o módulo SSL já está instalado e você pode pular para Configure o certificado SSL.
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'
Se o sistema retornarnginx: command not found, use o caminho completo de instalação, por exemplo:/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'.
Se o módulo SSL estiver ausente, instale-o usando um dos métodos abaixo, conforme a forma de instalação do Nginx.
Adicionar o módulo SSL pode interromper brevemente o serviço Nginx. Faça backup da configuração e dos dados do Nginx antes e realize essa alteração fora do horário de pico.
Usando um gerenciador de pacotes
Execute os comandos a seguir no terminal do servidor:
RHEL/CentOS
# Add the official Nginx repository.
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# Upgrade Nginx.
sudo yum upgrade nginx
Debian/Ubuntu
# Upgrade Nginx.
sudo apt-get update
sudo apt-get install --only-upgrade nginx
Compilando a partir do código-fonte
-
Instale as dependências de compilação.
RHEL/CentOS
sudo yum install -y gcc pcre-devel zlib-devel openssl-develDebian/Ubuntu
sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -
Anote os parâmetros de compilação atuais.
nginx -VCopie todos os parâmetros exibidos após
configure arguments:. Eles serão necessários na etapa 4. -
Baixe o código-fonte da versão atual do Nginx. Execute
nginx -vpara verificar a versão (1.14.2 é usado como exemplo). Em seguida, baixe e extraia o pacote de origem:wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2 -
Recompile o Nginx com o módulo SSL. Adicione
--with-http_ssl_moduleaos parâmetros anotados e recompile:Se você vir
error: 'ENGINE_by_id' is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations], executemake CFLAGS='-Wno-error=deprecated-declarations'em vez disso.# Keep all original parameters to avoid losing existing modules. ./configure <Original parameters> --with-http_ssl_module make -
Substitua o binário do Nginx. Faça backup do binário original (usando
/usr/local/nginx/sbin/nginxcomo exemplo):# Replace /usr/local/nginx/sbin/nginx with the actual path to your nginx binary. sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bakSobrescreva com o binário recém-compilado:
# Replace /usr/local/nginx/sbin/nginx with the actual path to your nginx binary. sudo cp objs/nginx /usr/local/nginx/sbin/nginx -
Verifique se o módulo SSL está instalado.
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'A saída
--with-http_ssl_moduleconfirma que o módulo está instalado.
Configure o certificado SSL
As etapas a seguir usam o Nginx 1.14.2 e o arquivo de configuração /etc/nginx/nginx.conf como exemplo. Para encontrar o arquivo de configuração ativo no servidor, consulte Como encontro o arquivo de configuração ativo do Nginx?
-
Abra o arquivo de configuração.
sudo vim /etc/nginx/nginx.conf -
Adicione um bloco de servidor para HTTPS. Copie o bloco
serverexistente que escuta na porta 80, alterelisten 80paralisten 443 ssle adicione as diretivas SSL mostradas abaixo. Mantenha todas as outras configurações inalteradas.# Original server block listening on port 80 server { listen 80; server_name yourdomain www.yourdomain; # Other configurations location / { proxy_pass http://127.0.0.1:8000; } } # New server block for HTTPS. server { # Change the original 'listen 80' to 'listen 443 ssl'. listen 443 ssl; # Original server_name. You can add more domain names supported by the current certificate. server_name yourdomain www.yourdomain; # ======================= Start of certificate configuration ======================= # Specify the certificate file (the intermediate certificate can be appended to this .pem file). Replace /etc/ssl/cert/ssl.pem with the absolute path of your certificate file. ssl_certificate /etc/ssl/cert/ssl.pem; # Specify the private key file. Replace /etc/ssl/cert/ssl.key with the absolute path of your private key file. ssl_certificate_key /etc/ssl/cert/ssl.key; # Configure the SSL session cache to improve performance. ssl_session_cache shared:SSL:1m; # Set the SSL session timeout period. ssl_session_timeout 5m; # Customize the TLS protocol types and cipher suites to use (the following is an example configuration; evaluate whether you need to configure it). ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # Specify the allowed TLS protocol versions. Higher TLS versions provide better security for HTTPS communication, but have poorer browser compatibility than lower TLS versions. ssl_protocols TLSv1.2 TLSv1.3; # Prioritize the cipher suites specified by the server. ssl_prefer_server_ciphers on; # ======================= End of certificate configuration ======================= # Other configurations } -
(Opcional) Redirecione HTTP para HTTPS. Adicione a diretiva
returnao bloco de servidor da porta 80.# Original server block listening on port 80 server { listen 80; server_name yourdomain www.yourdomain; # Redirect all HTTP traffic to HTTPS. return 301 https://$host$request_uri; # Other original configurations can be removed as they will no longer be reached. } -
Teste a configuração em busca de erros de sintaxe.
sudo nginx -t -c /etc/nginx/nginx.confSe a saída incluir tanto
syntax is okquantotest is successful, a configuração é válida. Caso contrário, corrija os erros relatados e execute o teste novamente.
Recarregar o Nginx
Estes comandos assumem que o Nginx foi iniciado com o caminho de configuração padrão. Se houver um caminho de instalação ou arquivo de configuração personalizado, ajuste conforme necessário.
O Nginx está em execução
Recarregue a configuração sem reiniciar o serviço:
sudo nginx -s reload
Se o recarregamento falhar, consulte o FAQ para solução de problemas.
O Nginx não está em execução
Inicie-o:
nginx
Etapa 4: Verifique a implantação
Abra um navegador e acesse
https://yourdomain. Substituayourdomainpelo domínio real.-
Um ícone de cadeado na barra de endereços confirma a implantação bem-sucedida do certificado. A partir da versão 117 do Chrome, o ícone
foi substituído por um novo ícone
. Clique em nele para visualize os detalhes do certificado. Se houver erros de acesso ou ausência do ícone de cadeado, limpe o cache do navegador ou tente novamente no modo anônimo.
Se os problemas persistirem, consulte o FAQ para solução de problemas.
Entrando em produção
Ao implantar em produção, aplique as seguintes práticas recomendadas:
|
Prática |
Por que é importante |
Como aplicar |
|
Execute como usuário não root |
Limita o impacto de um incidente de segurança |
Crie um usuário de sistema dedicado com baixos privilégios para a aplicação |
|
Terminar SSL no gateway |
Simplifica o gerenciamento de certificados e reduz a complexidade do backend |
Implante o certificado em um Server Load Balancer (SLB). O SLB termina o HTTPS e encaminha HTTP simples para o backend |
|
Externalizar segredos |
Evita vazamento de credenciais via source ou arquivos de configuração |
Use variáveis de ambiente, HashiCorp Vault ou Alibaba Cloud Key Management Service em vez de codificar senhas diretamente |
|
Forçar redirecionamento de HTTP para HTTPS |
Previne ataques man-in-the-middle em tráfego não criptografado |
Adicione |
|
Desativar versões inseguras de TLS |
SSLv3, TLSv1.0 e TLSv1.1 são vulneráveis a ataques conhecidos |
Defina |
|
Monitorar certificados e renovar a tempo |
Um certificado expirado interrompe o HTTPS para todos os usuários |
Ative o monitoramento de domínio. A Alibaba Cloud verifica a validade do certificado e envia lembretes de renovação antes da expiração. Consulte Comprar e ative monitoramento de nome de domínio público |
FAQ
Por que o HTTPS fica inacessível após a instalação?
Verifique os itens a seguir nesta ordem:
Porta 443 bloqueada — O grupo de segurança ou firewall não permite tráfego de entrada na porta 443. Consulte Abrir a porta 443.
Incompatibilidade de domínio — O domínio acessado não está listado nos Bound Domains do certificado. Consulte a tabela de cobertura de domínio em Pré-requisitos.
Nginx não recarregado — A configuração não foi recarregada após as alterações. Execute
sudo nginx -s reload.Caminhos de arquivo incorretos — As diretivas
ssl_certificateoussl_certificate_keyapontam para caminhos errados. Verifique os caminhos absolutos dos arquivos.peme.key.Certificado ausente em serviços upstream — Se o domínio passar por uma Content Delivery Network (CDN), Server Load Balancer (SLB) ou Web Application Firewall (WAF), o certificado também deve ser instalado nesses serviços. Consulte Locais de implantação de certificado quando o tráfego passa por vários serviços da Alibaba Cloud.
Certificado não implantado em todos os servidores — Se o DNS do domínio resolver para múltiplos servidores, instale o certificado em cada um deles.
Para mais ajuda, 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 certificado SSL .
Como atualize ou substituir um certificado SSL sem tempo de inatividade?
Faça backup dos arquivos
.peme.keyatuais no servidor.Baixe o novo certificado e a chave privada do console Certificate Management Service.
Carregue os novos arquivos no servidor, substituindo os existentes. Use exatamente os mesmos caminhos e nomes de arquivos referenciados na configuração do Nginx.
Recarregue o Nginx:
sudo nginx -s reload.
Como encontro o arquivo de configuração ativo do Nginx (nginx.conf) em um servidor Linux?
Execute
ps -ef | grep '[n]ginx: master' | grep -- ' -c '. Se a saída incluir algo como-c /etc/nginx/custom.conf, o Nginx está usando esse arquivo de configuração personalizado.Se a etapa 1 não retornar nenhuma saída, o Nginx está usando o caminho padrão compilado. Execute
nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'para visualize o caminho padrão, por exemplo--conf-path=/etc/nginx/nginx.conf.
Como desativo TLSv1.0 e TLSv1.1 para corrigir avisos de "certificado não atende aos padrões"?
Defina a diretiva ssl_protocols na configuração do Nginx como:
ssl_protocols TLSv1.2 TLSv1.3;
Isso desativa os protocolos inseguros TLSv1.0 e TLSv1.1. Após salve o arquivo, execute nginx -s reload para aplicar a alteração.
Por que nginx -t falha com bind() to 0.0.0.0:443 failed (98: Address already in use)?
Outro processo já está escutando na porta 443. Execute sudo ss -tlnp | grep :443 para identificá-lo. Em seguida, pare o processo conflitante (como outro servidor web ou uma instância travada do Nginx) ou configure-o para usar uma porta diferente.
Por que nginx -t falha com cannot load certificate "/etc/nginx/ssl/domain.pem": BIO_new_file() failed?
O Nginx não consegue encontrar o arquivo de certificado no caminho especificado na configuração. Corrija a diretiva ssl_certificate no nginx.conf para apontar para o caminho absoluto real do arquivo .pem.
Por que o recarregamento do Nginx falha com the "ssl" parameter requires ngx_http_ssl_module?
A compilação do Nginx está sem o módulo SSL. Instale ou recompile o Nginx com ngx_http_ssl_module ativado. Consulte Instale o módulo SSL.
Por que recebo No such file or directory: fopen('/cert/3970497_demo.aliyundoc.com.pem','r') ao recarregar o Nginx?
O caminho especificado para ssl_certificate ou ssl_certificate_key está incorreto. Verifique se os caminhos na configuração são caminhos absolutos corretos e se os arquivos existem nesses locais.
Por que o Nginx falha ao ler os arquivos de certificado SSL com um erro permission denied?
O usuário do processo worker do Nginx não tem acesso de leitura aos arquivos de certificado.
Encontre o usuário worker do Nginx: procure a diretiva
usernonginx.conf(por exemplo,user nginx;).Conceda a esse usuário permissão de leitura (
r) nos arquivos de certificado e chave privada, e permissão de execução (x) em todos os diretórios pai no caminho.