Verificador de certificado e chave privada

Cole o certificado que um servidor usa e a chave privada que vai implementar com ele, e esta página responde à pergunta em que um site implementado falha: as duas vieram do mesmo par de chaves? A resposta não é um palpite feito a partir apenas dos comprimentos de módulo ou das impressões digitais — a página assina um desafio fixo com a chave privada e verifica essa assinatura com a chave pública dentro do certificado. Se a verificação passa, os dois pertencem um ao outro; se falha, nenhuma quantidade de edições na configuração os fará funcionar. As duas leituras são mostradas lado a lado com o algoritmo, o tamanho da chave, o identificador da chave do sujeito e a impressão digital da chave pública, e nada do que cola sai do navegador.
1. Certificado ou cadeia
Cole quantos blocos quiser. Cada certificado é verificado contra cada chave, por isso uma cadeia mais uma chave diz-lhe exatamente a que certificado da cadeia essa chave pertence — uma surpresa comum num servidor que serve o certificado errado de um pacote. Lêem-se PEM, corpo base64 ou hexadecimal simples e um ficheiro PKCS#7 .p7b; o verificador de certificados audita o próprio certificado depois de a chave estar resolvida.
2. Chave privada, ou a chave pública
São reconhecidas as chaves PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 (BEGIN RSA PRIVATE KEY), SEC1 (BEGIN EC PRIVATE KEY) e uma chave pública SPKI simples (BEGIN PUBLIC KEY), tal como um ficheiro de chave colado em base64 ou hexadecimal. Uma chave PKCS#8 encriptada (BEGIN ENCRYPTED PRIVATE KEY) não pode ser lida por um navegador e é assinalada como tal, com o comando que remove a frase-passe.
nada verificado ainda
O exemplo é um certificado autoassinado e a chave privada que lhe pertence, ambos feitos para esta página e que não protegem nada. Substitua a chave por outra qualquer para ver o outro veredicto, ou coloque o bloco da chave pública no lugar da privada para ver a correspondência da chave pública.
Uma chave privada colada em qualquer página web merece primeiro uma segunda reflexão. Esta página é um ficheiro de JavaScript simples, não carrega nada de lado nenhum e não faz nenhum pedido, por isso a chave é lida, usada e esquecida dentro deste separador. Isso continua a ser uma promessa feita por código que pode ler, e não uma garantia de uma rede que possa ver: se estiver a lidar com uma chave de produção, trabalhe offline, e considere que a verificação mais segura é o mesmo comando openssl no seu próprio servidor. Uma chave colada aqui nunca é guardada, nunca é posta num ficheiro e nunca é enviada para lado nenhum — incluindo pelos botões de exportação, que escrevem conclusões sobre a chave e nunca a própria chave.
Porque é que a assinatura é a resposta. Dois ficheiros podem parecer semelhantes e ainda assim não coincidir: as chaves RSA são comparadas pelo módulo na maioria dos guias, mas isso só funciona para RSA, e uma chave pode ter o módulo certo com um expoente danificado ou um preenchimento errado. Esta página prova o par da mesma maneira que um handshake faz — assina um desafio fixo com a chave privada e verifica-o com a chave pública do certificado — por isso o veredicto vale igualmente para RSA, ECDSA e Ed25519. Quando só se cola a metade pública, os próprios bytes da chave pública são comparados com os do certificado, o que é igualmente conclusivo quanto à identidade, apenas sem prova de que alguém detém a metade privada.

O que uma coincidência não lhe diz. Que a chave é a que o servidor realmente carregou, que o certificado é de confiança, que o ficheiro da chave está intacto no disco, ou que a chave não foi copiada por outra pessoa. Também não consegue dizer se o certificado é o que um cliente vai receber, porque um balanceador de carga ou uma CDN à frente do site pode servir outro. Para verificar o que um servidor em produção apresenta de facto, execute openssl s_client -connect example.com:443 -servername example.com -showcerts e cole essa saída na caixa do certificado.

De onde vêm os ficheiros. O certificado é o que o seu servidor tem configurado, ou o exportado de um navegador ou retirado de um pacote .p7b. A chave privada é o ficheiro que o seu servidor web lê ao arrancar, normalmente algo como privkey.pem ou server.key. Se a sua chave estiver encriptada, desencripte primeiro uma cópia com openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem, cole esse ficheiro e depois apague a cópia.
Nada verificado ainda. Cole um certificado e uma chave acima e prima Verificar se coincidem. O veredicto aparece aqui com a prova que o sustenta, e o relatório pode ser copiado ou guardado.
A mesma verificação com openssl, na sua própria máquina
# chave pública dentro do certificado openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256 # chave pública dentro da chave privada openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256 # os dois resumos só são iguais quando o par pertence um ao outro # a forma mais antiga, só para RSA: comparar os módulos openssl x509 -in cert.pem -noout -modulus | openssl md5 openssl rsa -in key.pem -noout -modulus | openssl md5
A comparação de resumos funciona para todos os tipos de chave e coincide com o que esta página indica como impressão digital da chave pública, enquanto a comparação de módulos só existe para RSA. Nenhuma das duas prova que alguém detém a metade privada — a verificação por assinatura acima prova, e é por isso que esta página a usa.
O que contém o relatório. O veredicto, o par de leituras de onde veio (algoritmo, tamanho da chave, curva, identificador da chave do sujeito e impressão digital da chave pública, para o certificado e para a chave), e o teste exato que foi executado. O relatório nunca contém a própria chave privada: a chave é usada para produzir uma assinatura e não é escrita no texto, no JSON nem na área de transferência. O que copiar ou guardar é seguro para anexar a um pedido; a chave que colou não é, e deve considerar a área de transferência o único outro sítio onde ela alguma vez esteve.

Privacidade: o certificado e a chave são lidos dentro do separador, nada é enviado, e a página não faz nenhum pedido — não há sonda nem consulta nesta página. Para criar um par correspondente use o gerador de certificados autoassinados; para pedir um certificado para uma chave que já tem, use o gerador de CSR; para ler o que um certificado contém, use o descodificador de certificados.