Ler um certificado SSL
Cole o PEM ou carregue o arquivo e leia em palavras simples quando ele vence, quais nomes ele cobre, que chave usa e se a cadeia está na ordem certa. Funciona também para solicitações de assinatura de certificado (CSR) e arquivos .p7b, e o certificado nunca sai do seu navegador.
Quando você precisa ler um certificado
O caso mais comum é também o mais simples: quando ele vence. Seu fornecedor mandou o arquivo do certificado novo, ou você precisa renovar o antigo, e o painel da hospedagem não diz. Aqui o primeiro número que você vê é o de dias restantes, e se o certificado já venceu ou ainda não é válido você vê isso antes de tudo, em vermelho ou em amarelo.
Os outros casos reais são três. O navegador diz “certificado inválido” e você quer saber se é um problema de nomes (o certificado não cobre esse subdomínio) ou de cadeia (falta uma peça no servidor). Você precisa enviar uma solicitação de assinatura de certificado (CSR) à autoridade e quer conferir se os nomes certos estão dentro antes de pagar. Ou chega por e-mail um arquivo .cer ou .p7b e você quer saber o que é antes de instalá-lo.
A página aceita PEM colado (inclusive vários certificados em sequência), arquivos .crt, .cer, .pem e .der, CSRs e arquivos .p7b, e reconhece o tipo pelo que há dentro, não pela extensão.
Nomes cobertos: o common name não conta mais
Os nomes para os quais um certificado vale ficam nos subject alternative names (SAN), e são a única coisa que os navegadores de hoje olham: o Chrome parou de ler o common name, o CN, em 2017, e o Safari em 2019. Um certificado com o nome certo só no CN dá erro hoje.
O curinga (wildcard) vale para um nível só. Um certificado para *.exemplo.com.br cobre www.exemplo.com.br e loja.exemplo.com.br, mas não exemplo.com.br sozinho (precisa de mais um nome) e nem a.b.exemplo.com.br (isso exigiria *.b.exemplo.com.br). Digite o nome no campo “Nome a verificar” e a resposta é sim ou não, com o nome do certificado que o cobre.
Os nomes podem incluir endereços IP, típicos de NAS e roteadores domésticos: nesse caso o certificado vale só para aquele endereço exato, e um nome de domínio que aponta para o mesmo endereço não basta. Para fazer as contas com endereços e redes existe a Calculadora de sub-redes.
A cadeia, e por que a ordem importa
Um site não envia só um certificado: envia o seu, emitido por uma intermediária, que por sua vez foi emitida por uma raiz que o navegador já conhece. O vínculo é lido dentro dos certificados: o emissor de cada um deve ser o titular do seguinte. Se você colar a cadeia inteira, a página confere os vínculos um por um.
Quando a ordem está errada você recebe a cadeia já reordenada, pronta para copiar no arquivo que o servidor envia (o que muitos painéis chamam de fullchain). A falha mais comum, porém, é outra: a intermediária que falta. Alguns navegadores vão buscá-la sozinhos e o site parece funcionar, enquanto o curl, muitos apps de celular e muitos programas dão erro. Se você colar o que o servidor envia e não houver nada depois do certificado do site, esse é o problema. E se você montou o arquivo juntando dois arquivos com cat, confira se há uma quebra de linha entre uma linha END e o BEGIN seguinte: se estiverem grudadas, o OpenSSL não encontra nenhum certificado, e a página avisa.
Há também um caso mais sutil: uma intermediária com o nome certo e a chave errada. Acontece quando uma autoridade renova a chave e o arquivo antigo fica no servidor. Os nomes combinam, mas os identificadores das chaves não, e a página avisa. Nos arquivos .p7b, por outro lado, a ordem não existe, porque os certificados ficam num conjunto: a página os mostra já alinhados do site até a raiz.
Datas: fuso horário, dias e duração máxima
As datas dentro de um certificado estão sempre em tempo universal (UTC), e é assim que você as encontra escritas aqui. No horário de Brasília são três horas a menos, então um certificado que vence às 02:30 UTC do dia 4 vence, em Brasília, ainda no dia 3, às 23:30. Os dias restantes são dias inteiros de 24 horas, contados a partir do momento em que você lê.
Depois vem a duração máxima. Desde setembro de 2020 um certificado de site público não pode durar mais de 398 dias, e as regras do CA/Browser Forum estão encurtando esse prazo: 200 dias para os emitidos a partir de 15 de março de 2026, 100 a partir de 15 de março de 2027, 47 a partir de 15 de março de 2029. Se um certificado de site dura mais do que era permitido no dia em que foi emitido, a página avisa: se vem de uma autoridade pública, o navegador o recusa; se vem de uma autoridade interna de uma empresa, a regra não se aplica.
Um detalhe que engana os decodificadores caseiros: até 2049 o ano é escrito com apenas dois dígitos, e “50” significa 1950, não 2050, como diz o padrão (RFC 5280).
Chave, assinatura e impressões digitais
A chave diz o quanto o certificado é forte. Uma chave RSA de 2048 bits é o mínimo aceito, 3072 ou 4096 são mais lentas e mais fortes; as chaves de curva elíptica P-256 e P-384 são mais curtas para a mesma segurança. O Ed25519 existe em certificados, mas os navegadores ainda não o aceitam para sites. Abaixo de 2048 bits e com assinaturas SHA-1 ou MD5 a página mostra um aviso, porque são justamente os casos em que um navegador recusa.
As impressões digitais SHA-256 e SHA-1 são o resumo (digest) do certificado inteiro, calculado aqui com as funções criptográficas do navegador: servem para comparar dois certificados sem lê-los, por exemplo por telefone com quem cuida do servidor, e são o mesmo número que o Windows, o macOS e o OpenSSL mostram. A de SHA-1, aqui, serve só como identificação e não como assinatura, e é o que o Windows chama de “thumbprint”. Para a impressão digital de qualquer arquivo, que não seja um certificado, existe o Checksum de arquivo.
O número de série é o que a autoridade pede para revogar um certificado. As linhas OCSP e CRL dizem onde o navegador pergunta se ele foi revogado: a página as mostra, mas não se conecta a elas.
Nomes com acentos, escritos de quatro jeitos
Dentro de um certificado o texto pode ser codificado de maneiras diferentes, e um leitor apressado trata todas como UTF-8. Aqui cada uma é lida pelo que é: UTF8String como UTF-8, BMPString como UTF-16, a antiga UniversalString como UTF-32. O caso difícil é a T61String, que em certificados reais ora contém UTF-8, ora Latin-1: a página tenta o primeiro e, se os bytes não forem UTF-8, usa o segundo, que é o que o OpenSSL faz. Assim “Società” continua “Società” em vez de virar uma fileira de símbolos, e quando foi preciso usar Latin-1 a página avisa.
O que ela não faz, sem rodeios
Ela não verifica a assinatura e não diz se o certificado é confiável: mostra o que está escrito. Para saber se um site está bem configurado é preciso uma verificação que se conecte ao servidor, e uma página web não consegue fazer isso, porque os navegadores não entregam o certificado de outro site ao código de uma página. Para obtê-lo, clique no cadeado ao lado do endereço e exporte o certificado, ou use openssl s_client -connect example.com:443 -showcerts e cole aqui o que sair.
Ela não abre arquivos .pfx e .p12: eles contêm a chave privada e são criptografados com uma senha. E se você colar uma chave privada junto com o certificado, a página não a lê e avisa, porque uma chave privada nunca deve ser colada em lugar nenhum. Para ler um token de acesso, que é outra coisa, mesmo parecendo semelhante, existe o Decodificador de JWT.