Obtendo o SHA1 Digest da chave pública SSH

4

Parece que isso deve ser fácil. Eu corro "ssh-keygen -l -f" (o padrão parece ser SHA1). Todos os exemplos mostram a impressão do resumo formatado em hexadecimal com um pouco de informação adicional e inofensiva. No entanto, no meu Mac estou recebendo uma string opaca e inútil.

Devo mencionar que o parâmetro "-E" funciona no Mac (10.10), mas não está disponível no Ubuntu (14.04). Tenha isso em mente se não funcionar para você.

$ ssh-keygen -l -E md5 -f dustin.pem
2048 MD5:29:ed:da:d3:5a:8c:78:4f:62:d3:fd:0c:77:5b:6d:d9 dustin.pem.pub (RSA)

$ ssh-keygen -l -E sha1 -f dustin.pem
2048 SHA1:x2ENPL+vzVdlgkIyu0tAhVQ+H4U dustin.pem.pub (RSA)

$ ssh-keygen -l -E sha256 -f dustin.pem
2048 SHA256:agJs/axI8QPzet/eoPMDxLSf37fd1bgsMX4Di0gqMy4 dustin.pem.pub (RSA)

Ambos os algoritmos SHA tentados retornam cadeias ASCII opacas, mas diferentes.

O que estou perdendo? Como faço para obter um SHA1 hex-digest sem ter que copiar minha chave para um sistema Linux para fazer isso?

Obrigado.

    
por Dustin Oprea 06.05.2016 / 03:25

2 respostas

4

Tradicionalmente, o OpenSSH exibe impressões digitais de chave (pública) usando MD5 em hexadecimal ou, opcionalmente, como 'ASCII art' ou 'bubblebabble' (uma série de quase-palavras sem sentido, mas de 5 letras pronunciáveis); 6.8 em março de 2015 adicionou opções para SHA1 e SHA256 em (PEMstyle) base64 , sendo o último o padrão e nos três casos, o nome do hash é prefixado para que você saiba qual é. ssh-keygen -l tem -E opção somente desde então, e o Ubuntu 14.04 data de antes de março de 2015.

Você não deve precisar de um resumo SHA1 em hexadecimal para verificar um host, já que ssh client nunca exibe isso, apenas MD5-hex ou SHA1-base64 (não por padrão) ou SHA256-base64. Se você quiser um de qualquer maneira, você pode fazê-lo com bastante facilidade, exceto por uma chave 'rsa1' e você deve ter parado de usar o protocolo SSHv1 e, portanto, chaves rsa1 antes de Barack Obama se tornar presidente dos EUA.

Pegue o base64 'blob' de

  • campo 2 de id_$alg.pub ou arquivo semelhante ou saída de ssh-keygen -y
  • campo 3 da linha no arquivo known_hosts , a menos que tenha um marcador, em seguida, campo 4
  • campo 2 da linha no arquivo authorized_keys , a menos que tenha opções, em seguida, campo 3

e convertê-lo de base64 para binário, hash que, com o hash desejado e exibir na representação desejada. Como openssl por padrão exibe hashes em hexadecimal e pode converter de (e para) base64, você poderia fazer algo como

awk '{$print $2}' id_xxx.pub | openssl base64 -d -A | openssl sha1

Observe o -A ; caso contrário, openssl silenciosamente falhará em decodificar base64 por mais tempo de 76 caracteres e os blobs de pubkey do OpenSSH, exceto o ed25519, são mais longos.

Observe também que você pode informar a um cliente ssh mais novo para exibir a impressão digital hexadecimal MD5 antiga com -o FingerprintHash=MD5 ou uma configuração ssh_config equivalente.

    
por 06.05.2016 / 09:27
0

Essas strings têm os hashes codificados base64 .

    
por 06.05.2016 / 17:20