Ative o HTTPS no seu servidor Nginx ou Tengine instalando um certificado SSL. Este guia orienta você a baixar o certificado, abrir a porta 443, configurar o bloco de servidor do Nginx e verificar o resultado.
O que você realizará:
Baixe o pacote de certificados do console SSL Certificates e envie-o para o seu servidor
Abra a porta 443 no grupo de segurança e no firewall do sistema
Adicione um bloco de servidor HTTPS à configuração do Nginx
Recarregue 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 de vários níveis 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, purchase a commercial certificate ou append and replace domain names.
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. Você precisará deles na próxima etapa.Caso o pacote contenha apenas um arquivo
.peme nenhum arquivo.key, utilize o arquivo de chave privada salvo localmente ao gerar a Solicitação de Assinatura de Certificado (CSR).
Se você usou OpenSSL ou keytool para gerar a CSR, a chave privada foi salva apenas na sua máquina local — ela não está incluída no pacote baixado. Se a chave privada for perdida, o certificado ficará inutilizável. Purchase a new commercial certificate e gere uma nova CSR e chave privada.
-
Envie os arquivos
.peme.keypara o 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 or download files .
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 cloud 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 cloud, 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 cloud, consulte a documentação correspondente.
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 configurações a seguir 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: Instalar o certificado SSL no Nginx
Instalar 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 Configurar 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 service 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 -
Registre os parâmetros de compilação atuais.
nginx -VCopie todos os parâmetros exibidos após
configure arguments:. Você precisará deles 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 source: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. Acrescente
--with-http_ssl_moduleaos parâmetros registrados 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.
Configurar 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 How can I find the active Nginx configuration file?
-
Abra o arquivo de configuração. É possível personalizar os nomes e os caminhos de armazenamento do arquivo de certificado (
.pemou.crt) e do arquivo de chave privada (.key). Certifique-se de que os caminhos na configuração do Nginx estejam corretos e que o processo do Nginx tenha permissão de leitura nesses arquivos.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. } -
(Opcional) Configure os caminhos do certificado quando o service web Nginx ou Tengine for executado em um container Docker.
Um container possui seu próprio sistema de arquivos, isolado do servidor host, portanto o Nginx não consegue ler os arquivos de certificado diretamente de um caminho do host. Monte o certificado digital (o arquivo
.pem, que pode incluir a cadeia de certificados intermediários) e o arquivo de chave privada baixados do console SSL Certificates dentro do container e referencie seus caminhos internos.-
Mapeie o arquivo de certificado, o arquivo de chave privada e o arquivo de configuração ao iniciar o container. A opção
:roos monta como somente leitura.# Replace /host/path/to/ with the actual absolute paths of the certificate file, private key file, and configuration file on the host server. docker run -d --name nginx-ssl \ -v /host/path/to/cert.pem:/etc/nginx/ssl/cert.pem:ro \ -v /host/path/to/cert.key:/etc/nginx/ssl/cert.key:ro \ -v /host/path/to/nginx.conf:/etc/nginx/nginx.conf:ro \ -p 443:443 \ nginx -
No
nginx.conf, defina os itens de configuraçãossl_certificateessl_certificate_keypara os caminhos internos do container em vez dos caminhos do host.ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key; -
Reinicie o container para aplicar as alterações.
docker restart nginx-ssl
Se os arquivos não forem montados, ou se o
nginx.confainda apontar para caminhos do host em vez de caminhos internos do container, o Nginx falhará ao iniciar e reportarácannot load certificate: No such file or directory. Para mais soluções de problemas, consulte o FAQ. Após reiniciar o container, abra seu site em um navegador e confirme se o certificado carrega corretamente. -
-
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 você tiver 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 service:
sudo nginx -s reload
Se o recarregamento falhar, consulte FAQ para solução de problemas.
O Nginx não está em execução
Inicie-o:
nginx
Etapa 4: Verificar a implantação
Abra um navegador e acesse
https://yourdomain. Substituayourdomainpelo seu domínio real.-
Um ícone de cadeado na barra de endereços confirma que o certificado foi implantado com sucesso. A partir da versão 117 do Chrome, o ícone
foi substituído pelo novo ícone
. Clique em nele para visualizar os detalhes do certificado. Se você vir erros de acesso ou nenhum ícone de cadeado, limpe o cache do navegador ou tente novamente no modo anônimo.
Se os problemas persistirem, consulte 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 |
|
Executar 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 código-fonte 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 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ínios. A Alibaba Cloud verifica a validade do certificado e envia lembretes de renovação antes da expiração. Consulte Purchase and enable public domain name monitoring |
FAQ
Por que o HTTPS fica inacessível após a instalação?
Verifique os seguintes itens 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 seus arquivos.peme.key.Certificado ausente em services upstream — Se o seu 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 services. Consulte Certificate deployment locations when traffic passes through multiple Alibaba Cloud services.
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 obter mais ajuda, consulte Resolve certificate deployment issues based on browser error messages e SSL certificate deployment troubleshooting guide .
Como atualizar 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.
Envie os novos arquivos para o 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 encontrar 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 exibir o caminho padrão, por exemplo--conf-path=/etc/nginx/nginx.conf.
Como desativar 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 salvar 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 reconfigure-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 seu 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 Install the SSL module.
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 sua 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 erro de 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.
O Nginx 1.2 suporta certificados baixados do SSL Certificate Management V2.0?
Sim. Os certificados emitidos através do SSL Certificate Management V2.0 são iguais aos emitidos pela V1.0. A única diferença é o método de compra.