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ãocert.pem) eprivkey.pem. Usar apenascert.pemcausa 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:
| Diretiva | Propósito |
|---|---|
listen 443 ssl http2 | HTTPS na porta 443 com HTTP/2 habilitado |
ssl_certificate | Caminho para seu certificado + cadeia |
ssl_certificate_key | Caminho para sua chave privada |
ssl_protocols | Apenas TLS 1.2 e 1.3 (1.0/1.1 deprecados desde 2020) |
ssl_prefer_server_ciphers off | Deixa o cliente escolher a melhor cifra (boa prática moderna) |
ssl_session_cache | Armazena sessões TLS em cache — evita re-handshake para visitantes recorrentes |
ssl_session_tickets off | Tickets podem enfraquecer o forward secrecy |
ssl_stapling | Servidor busca resposta OCSP — mais rápido para clientes |
Strict-Transport-Security | HSTS — navegadores lembram de sempre usar HTTPS |
return 301 | Redirecionamento 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_certifcateem vez dessl_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):
- Obtenha um novo certificado do GetHTTPS (ou sua ferramenta de renovação)
- Substitua os arquivos:
sudo cp new-fullchain.pem /etc/ssl/gethttps/fullchain.pem sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem - 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.