Como verificar a impressão digital de um certificado VPN por um canal separado
Uma impressão digital só prova identidade quando o valor esperado chega por um canal que o atacante não controla. Execute a verificação nesta ordem.
Uma impressão digital vale tanto quanto o canal que lhe disse o que esperar. Se o valor com que compara chegou pela mesma conexão que está a testar, a comparação não prova nada além de que quem controla essa conexão é coerente. A verificação deve seguir uma ordem fixa, e um passo falhado deve detê-lo em vez de o empurrar para o seguinte. Esta é a ordem que uso quando um cliente VPN relata que um certificado mudou.
Nomeie o objeto antes de nomear o valor
Decida se o valor esperado pertence ao certificado folha do servidor, à CA emissora ou à chave pública dentro da folha. São três verificações diferentes e falham de formas diferentes. Uma impressão digital de CA que coincide não fixa o servidor, e um hash da chave pública sobrevive deliberadamente a uma reemissão que mantém a mesma chave.
Anote também o algoritmo. SHA-256 é a expectativa normal hoje, mas ferramentas antigas imprimiam SHA-1 a menos que pedisse outra coisa, e um valor hexadecimal de 40 caracteres é sinal de que está prestes a comparar duas coisas diferentes.
Obtenha o valor esperado por um segundo canal
O segundo canal tem de ser um em que a parte contra a qual se protege não possa escrever. Um sistema de aprovisionamento com que já se autentica, um registo impresso num cofre, uma base de dados de configuração ou um documento assinado entregue por outro processo servem todos. Uma mensagem de chat de um colega, uma página de suporte alcançada por um resultado de pesquisa e tudo o que é colado no terminal onde já está a depurar não servem.
Peça o valor completo e o algoritmo, nunca um prefixo. Os dois pontos e as maiúsculas ou minúsculas não importam, mas o truncamento transforma uma verificação de 256 bits num jogo de adivinhação.
Se ninguém conseguir produzir o valor esperado a partir de uma fonte independente, o resultado honesto é que este certificado hoje não pode ser verificado. Dizê-lo é melhor do que fixar o que o cliente acabou de mostrar, o que transforma um aviso num hábito.
Extraia o valor do seu lado
Para um ficheiro de certificado, o comando é openssl x509 -in server.crt -noout -fingerprint -sha256. O resumo explícito importa: sem ele, a saída depende da sua versão de OpenSSL. O resultado é uma cadeia hexadecimal separada por dois pontos, por isso retire os dois pontos e passe ambos os lados a minúsculas antes de comparar.
Para um ponto final que fala TLS diretamente, ligue-se e canalize o certificado para fora: openssl s_client -connect vpn.example.com:443 -servername vpn.example.com < /dev/null | openssl x509 -noout -fingerprint -sha256. Isto funciona para um painel de administração web ou um ouvinte TLS, não para OpenVPN, cujo canal de controlo fica dentro do túnel. Para o OpenVPN, leia o certificado do perfil no disco em vez de tentar capturá-lo a partir do socket.
A comparação deve ser mecânica. Normalize ambos os valores com tr -d ':' e uma conversão para minúsculas, e depois compare a cadeia inteira. Fazê-lo a olho é como um prefixo coincidente esconde uma diferença no último byte. Se as cadeias diferirem, trate a diferença como real antes de procurar uma explicação.
Condições de paragem
Pare se o objeto diferir, porque uma impressão digital de CA não pode ilibar um certificado folha e uma folha não pode ilibar a CA. Pare se o algoritmo diferir, porque um valor SHA-1 comparado com um valor SHA-256 não lhe diz nada. Pare se a impressão digital coincidir mas o certificado estiver expirado, revogado ou emitido para outro nome; um hash coincidente não é uma verificação de validade e não repara uma cadeia quebrada. Pare também se o número de série não coincidir com o número de série do registo com que verifica, porque é a forma mais barata de detetar um certificado substituído.
Pare se o novo valor chegou pelo canal que estava a testar. A rotação pode mudar legitimamente uma impressão digital, mas o valor de substituição tem de vir do processo de confiança, não da caixa de diálogo de aviso que provocou a pergunta.
Pare se a correção sugerida for desativar a verificação do nome do anfitrião ou da cadeia. Uma impressão digital acrescenta uma restrição às verificações normais; não as substitui, a menos que a implementação tenha escolhido deliberadamente um modelo só de pin, e essa escolha traz os seus próprios custos operacionais.
Depois da comparação
Registe o que comparou, de onde veio o valor esperado e quando. Se o certificado foi reemitido, atualize a expectativa guardada pelo mesmo canal de confiança e anote o novo número de série, porque é o número de série que torna a rotação seguinte auditável.
Depois seja claro sobre os limites. Uma impressão digital confirma que o certificado que tem é o que alguém lhe disse para esperar. Não diz nada sobre o anfitrião estar comprometido, nem sobre se o serviço registra ou restringe aquilo a que esse certificado pode chegar.