Todos os guias de implantacao Implantacao

Como Instalar um Certificado SSL no Nginx

Este guia orienta você na instalação de um certificado SSL no Nginx — desde o upload dos arquivos até a otimização das configurações TLS e a solução de erros comuns. Funciona com certificados do GetHTTPS, Certbot ou qualquer outra fonte.

Se você ainda não tem um certificado, obtenha um gratuitamente em 5 minutos.

Pré-requisitos

  • Nginx instalado e servindo seu site em HTTP (porta 80)
  • Acesso root/sudo ao servidor
  • Arquivos de certificado — você precisa de dois:
    • fullchain.pem — seu certificado + cadeia intermediária (combinados)
    • privkey.pem — sua chave privada

Qual arquivo é qual? O GetHTTPS fornece quatro arquivos. O Nginx precisa de fullchain.pem (não cert.pem) e privkey.pem. Usar apenas cert.pem causa erros de “cadeia incompleta” porque os navegadores não conseguem verificar o caminho de confiança. Formatos de certificado explicados →

Etapa 1: Fazer upload dos arquivos de certificado para o servidor

Copie os arquivos para um diretório seguro:

# Criar diretório
sudo mkdir -p /etc/ssl/gethttps

# Copiar arquivos (da sua máquina local para o servidor)
sudo cp fullchain.pem /etc/ssl/gethttps/
sudo cp privkey.pem /etc/ssl/gethttps/

# Restringir permissões da chave privada — somente root deve lê-la
sudo chmod 600 /etc/ssl/gethttps/privkey.pem
sudo chmod 644 /etc/ssl/gethttps/fullchain.pem
sudo chown root:root /etc/ssl/gethttps/*

Se transferir via SCP:

scp fullchain.pem privkey.pem user@your-server:/tmp/
# Depois no servidor:
sudo mv /tmp/fullchain.pem /tmp/privkey.pem /etc/ssl/gethttps/

Etapa 2: Configurar o bloco server HTTPS

Edite a configuração Nginx do seu site. O arquivo normalmente está em:

  • /etc/nginx/sites-available/yourdomain.conf (Debian/Ubuntu)
  • /etc/nginx/conf.d/yourdomain.conf (CentOS/RHEL)

Configuração completa recomendada:

# Bloco server HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # ─── Arquivos de certificado ───────────────────────
    ssl_certificate     /etc/ssl/gethttps/fullchain.pem;
    ssl_certificate_key /etc/ssl/gethttps/privkey.pem;

    # ─── Protocolo TLS e cifras ────────────────
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    # ─── Cache de sessão (desempenho) ───────────
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # ─── OCSP stapling (verificação mais rápida) ─────
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # ─── Cabeçalhos de segurança ────────────────────────
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;

    # ─── Seu site ───────────────────────────────
    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Bloco de redirecionamento HTTP
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

O que cada seção faz:

DiretivaPropósito
listen 443 ssl http2HTTPS na porta 443 com HTTP/2 habilitado
ssl_certificateCaminho para seu certificado + cadeia
ssl_certificate_keyCaminho para sua chave privada
ssl_protocolsApenas TLS 1.2 e 1.3 (1.0/1.1 deprecados desde 2020)
ssl_prefer_server_ciphers offDeixa o cliente escolher a melhor cifra (boa prática moderna)
ssl_session_cacheArmazena sessões TLS em cache — evita re-handshake para visitantes recorrentes
ssl_session_tickets offTickets podem enfraquecer o forward secrecy
ssl_staplingServidor busca resposta OCSP — mais rápido para clientes
Strict-Transport-SecurityHSTS — navegadores lembram de sempre usar HTTPS
return 301Redirecionamento permanente de HTTP para HTTPS

Etapa 3: Testar a configuração

Sempre teste antes de recarregar:

sudo nginx -t

Saída esperada:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se o teste falhar, o Nginx informa o número exato da linha com o erro. Erros comuns:

  • Erro de digitação no caminho do arquivo (ssl_certifcate em vez de ssl_certificate)
  • Arquivo não existe no caminho especificado
  • Ponto e vírgula faltando

Etapa 4: Recarregar o Nginx

sudo systemctl reload nginx

Use reload, não restart. O reload aplica a nova configuração para novas conexões sem derrubar as existentes — zero tempo de inatividade.

Etapa 5: Verificar o certificado

Verificação no navegador

Visite https://yourdomain.com. Clique no ícone de cadeado para confirmar:

  • Emitido por: “Let’s Encrypt” (ou sua CA)
  • Válido: datas de início e fim
  • Domínio: corresponde à sua URL

Verificação por linha de comando

# Detalhes completos do certificado
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

# Verificar se a cadeia completa está presente
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
  | grep -E 'Verify return code|depth='

Esperado: Verify return code: 0 (ok) e múltiplos níveis de profundidade (seu certificado + intermediário).

Verificação online

Use o SSL Labs Server Test para um relatório abrangente. Ele verifica:

  • Validade da cadeia de certificados
  • Suporte a protocolos (deve mostrar apenas TLS 1.2 + 1.3)
  • Força das suítes de cifras
  • Vulnerabilidades conhecidas (BEAST, POODLE, Heartbleed)
  • Configuração HSTS

Meta: Grau A ou A+.

Como renovar

Quando seu certificado se aproximar do vencimento (dia 60 de 90 para Let’s Encrypt):

  1. Obtenha um novo certificado do GetHTTPS (ou sua ferramenta de renovação)
  2. Substitua os arquivos:
    sudo cp new-fullchain.pem /etc/ssl/gethttps/fullchain.pem
    sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem
  3. Recarregue o Nginx:
    sudo systemctl reload nginx

Sem necessidade de restart. O Nginx pega os novos arquivos ao recarregar. Guia completo de renovação →

Quer renovação automática? Instale o Certbot para renovação sem intervenção: sudo certbot --nginx -d example.com. Ele lida com tudo, incluindo a configuração do Nginx.

Solução de problemas

”SSL: error:0B080074:x509 certificate routines”

Causa: Você está usando cert.pem em vez de fullchain.pem.

Correção: Mude ssl_certificate para apontar para fullchain.pem, que inclui tanto seu certificado quanto a cadeia de confiança intermediária:

ssl_certificate /etc/ssl/gethttps/fullchain.pem;  # NÃO cert.pem

“cannot load certificate key”

Causa: Permissões do arquivo de chave privada estão erradas, o arquivo está corrompido ou a chave não corresponde ao certificado.

Correção:

# Verificar permissões (deve ser 600)
ls -la /etc/ssl/gethttps/privkey.pem

# Verificar se a chave é válida
sudo openssl ec -in /etc/ssl/gethttps/privkey.pem -check  # Para ECDSA
sudo openssl rsa -in /etc/ssl/gethttps/privkey.pem -check  # Para RSA

# Verificar se a chave corresponde ao certificado
sudo openssl x509 -noout -modulus -in /etc/ssl/gethttps/fullchain.pem | md5sum
sudo openssl rsa -noout -modulus -in /etc/ssl/gethttps/privkey.pem | md5sum
# Ambos os hashes DEVEM ser iguais

“nginx: [emerg] bind() to 0.0.0.0:443 failed”

Causa: A porta 443 já está em uso por outro processo.

Correção:

# Encontrar o que está usando a porta 443
sudo ss -tlnp | grep 443

# Geralmente: outra instância do Nginx ou Apache
sudo systemctl stop apache2  # Se o Apache estiver rodando
sudo systemctl reload nginx

HTTPS funciona mas o navegador mostra “Não Seguro”

Causa: Conteúdo misto — sua página carrega imagens, scripts ou CSS via http://.

Correção: Abra DevTools (F12) → Console → procure avisos de “Mixed Content”. Atualize todas as URLs de recursos para usar https:// ou caminhos relativos.

”ERR_SSL_VERSION_OR_CIPHER_MISMATCH”

Causa: O cliente não suporta as versões TLS ou cifras que seu servidor oferece.

Correção: Certifique-se de que sua configuração inclui TLS 1.2 (não apenas 1.3):

ssl_protocols TLSv1.2 TLSv1.3;  # NÃO apenas TLSv1.3

Certificado aparece como “Não Confiável” apesar dos arquivos corretos

Causa: A cadeia de certificados está incompleta — fullchain.pem está sem o certificado intermediário, ou o arquivo está na ordem errada.

Correção: Reconstrua fullchain.pem concatenando seu certificado + o intermediário:

cat cert.pem chain.pem > fullchain.pem

A ordem importa: seu certificado primeiro, depois o intermediário.

Perguntas frequentes

Preciso de arquivos de configuração separados para HTTP e HTTPS?

Não. Coloque ambos os blocos server (porta 80 e 443) no mesmo arquivo. O bloco HTTP existe apenas para redirecionar para HTTPS.

Devo usar ssl on;?

Não. ssl on; está deprecado. Use listen 443 ssl; em vez disso — o parâmetro ssl na diretiva listen é a abordagem moderna.

Qual é a diferença entre reload e restart?

reload aplica graciosamente a nova configuração para novas conexões sem derrubar as existentes. restart para e inicia o processo, derrubando brevemente todas as conexões. Sempre use reload para mudanças de certificado.

Posso servir múltiplos domínios com certificados diferentes?

Sim. Use blocos server separados com diferentes server_name, ssl_certificate e ssl_certificate_key. O Nginx usa SNI (Server Name Indication) para servir o certificado correto com base no hostname solicitado.

O Nginx suporta certificados ECDSA/ECC?

Sim. O Nginx lida com certificados ECDSA exatamente como RSA — mesmas diretivas, mesmo formato de arquivo. O GetHTTPS gera ECDSA P-256 por padrão (chaves menores, handshakes mais rápidos).

Como habilito HTTP/2?

Adicione http2 à diretiva listen: listen 443 ssl http2;. Isso já está na configuração recomendada acima. HTTP/2 requer HTTPS — você não pode usá-lo sobre HTTP simples.

Artigos relacionados

Primeiros passos 2026-05-08
Como obter um certificado SSL gratuito (guia passo a passo)
Obtenha um certificado SSL gratuito do Let's Encrypt em 5 minutos — sem software para instalar, sem conta para criar. Guia completo cobrindo 4 métodos, ambos os tipos de desafio, instalação em 6 plataformas e solução de problemas.
Implantacao 2026-05-07
Como Redirecionar HTTP para HTTPS
Force todo o tráfego para HTTPS com redirecionamentos no lado do servidor. Exemplos de configuração para Nginx, Apache e .htaccess com redirecionamentos permanentes 301.
Implantacao 2026-05-08
Como Instalar um Certificado SSL no Apache
Guia passo a passo para instalar um certificado SSL no Apache com mod_ssl. Cobre upload de arquivos, configuração de VirtualHost, boas práticas de TLS, HSTS, redirecionamento HTTP e solução de 5 erros comuns.
Implantacao 2026-05-07
Como Corrigir Avisos de Conteúdo Misto
Conteúdo misto ocorre quando uma página HTTPS carrega recursos via HTTP. Saiba como encontrar e corrigir erros de conteúdo misto para obter um ícone de cadeado limpo.
Obtenha um certificado SSL gratuito no seu navegador
Sem instalacao, sem conta. Sua chave privada nunca sai do seu dispositivo.
Obter seu certificado