Meu certificado SSL está configurado corretamente?
Resposta curta: está configurado corretamente quando o certificado é confiável (cadeia completa), cobre todos os nomes que você usa (com e sem www), renova automaticamente bem antes de vencer, só TLS 1.2 e 1.3 estão ativados, toda requisição http:// redireciona para https:// e o HSTS está definido. O cadeado sozinho só prova o primeiro ponto.
Passos rápidos
- Confira se a cadeia é confiável. Abra o site em uma janela anônima no celular e no computador; nenhum aviso deve aparecer.
- Confira os nomes. O certificado precisa listar seudominio.com e www.seudominio.com se você usa os dois.
- Confira a validade e a renovação. Leia o notAfter e teste se a renovação automática funciona.
- Confira as versões de TLS. Permita só TLS 1.2 e TLS 1.3.
- Confira o redirecionamento. http:// precisa redirecionar de forma permanente para https://.
- Confira o HSTS. Envie Strict-Transport-Security quando o HTTPS funcionar em tudo.
O código e a configuração ficam em inglês.
1. Uma cadeia completa e confiável
O servidor também precisa enviar o certificado intermediário. Sem ele, o site muitas vezes funciona em navegadores de computador, mas falha em celulares e clientes de API.
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts </dev/null 2>/dev/null | grep -E 's:|i:|Verify return'Procure Verify return code: 0 (ok). No nginx, ssl_certificate deve apontar para o arquivo de cadeia completa (no Let’s Encrypt: fullchain.pem, não cert.pem).
2. Todos os nomes estão cobertos
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| openssl x509 -noout -ext subjectAltName3. Validade e renovação automática
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| openssl x509 -noout -enddate
sudo certbot renew --dry-run # if you use certbotO HackGrade marca um certificado como risco médio quando faltam menos de 21 dias para vencer, alto com menos de 14 dias, e crítico quando já venceu ou não é confiável.
4. Só TLS 1.2 e 1.3
ssl_protocols TLSv1.2 TLSv1.3;SSLProtocol -all +TLSv1.2 +TLSv1.3Teste se uma versão antiga é recusada (o comando deve falhar ao conectar):
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -tls1_1 </dev/null5. HTTP redireciona para HTTPS
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]6. HSTS
Quando todas as páginas e subdomínios funcionarem em HTTPS, adicione Strict-Transport-Security. Leia antes o guia de HSTS (em inglês): comece com um max-age curto e vá aumentando. Depois corrija qualquer conteúdo misto (em inglês).
Perguntas frequentes
Um certificado gratuito (Let’s Encrypt) é menos seguro que um pago?
Não. A criptografia é a mesma. Certificados pagos diferem no tipo de validação, no suporte e na garantia, não na qualidade da criptografia.
Por que meu site mostra um aviso só em alguns celulares?
Geralmente por falta do certificado intermediário. Configure o servidor com o arquivo de cadeia completa.
Ainda devo dar suporte ao TLS 1.0 ou 1.1?
Não. Os dois foram descontinuados (RFC 8996) e os navegadores modernos removeram o suporte a eles.