obtener la huella digital de la clave SSH en formato hexadecimal (antiguo) en la nueva versión de openssh

40

Parece que openssh ha cambiado la forma en que muestra las huellas digitales clave.

Estoy tratando de ssh desde una máquina cliente a un servidor:

  • cliente: ubuntu 14.04 ejecutando OpenSSH 6.6.1
  • servidor: FreeBSD con OpenSSH 7.2p2.

El cliente informa el hash md5 de la clave del servidor como una secuencia de 16 pares de dígitos hexadecimales, como este:

a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a

El servidor usa de manera predeterminada el hash sha256, pero gracias a esta respuesta puedo forzarlo a que proporcione el hash sha1 ejecutando:

[root@host /etc/ssh]# ssh-keygen -l -E sha1 -f ssh_host_ecdsa_key.pub

Quiero que el resultado se vea así:

a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a

pero en cambio obtengo esto:

256 SHA1:KIh0ejR4O+RqrSq7JdGAASddRfI [email protected] (ECDSA)

Me parece que ahora se muestra una versión codificada en base64 de la huella digital en lugar de dígitos hexadecimales.

¿Cómo puedo obtener la suma de verificación de la clave del servidor en el mismo formato que el informado por el cliente (más antiguo) (dígitos hexadecimales separados por dos puntos, sha1 hash) para verificar que sean iguales?

EDITAR: La versión anterior de SSH proporciona la suma de comprobación md5 , no la suma de comprobación sha1 como pensé erróneamente. El uso de esa suma de verificación (como debería decir la respuesta ahora aceptada) en la opción -E da el resultado deseado.

estocástico
fuente

Respuestas:

52

El cliente informa el hash sha1 de la clave del servidor como una secuencia de 16 pares de dígitos hexadecimales, como este:

    a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a

Este es el hash MD5.

Como puedes ver corriendo

ssh-keygen -l -E md5 -f ssh_host_ecdsa_key.pub

obtendrá la misma huella digital que necesita sin ese harakiri que está explicando en su respuesta.

Jakuje
fuente
1
Por desgracia, esto no funciona. Mi pregunta contiene el resultado de ejecutar su comando sugerido. Las versiones más nuevas de ssh-keygen dan el hash md5 como una cadena (¿codificada en base64?) En lugar de una cadena hexadecimal. "All that harakiri" (¡una descripción adecuada!) Es la forma más fácil que puedo encontrar para obtener una cadena hexadecimal de estilo antiguo de la nueva versión de las herramientas openssh.
estocástico
A menos que FreeBSD rompa algo (o elimine la compatibilidad con MD5), no hay razón para que no funcione. Tenga en cuenta que su comando enumera incorrectamente en sha1lugar de md5! He desactualizado la versión de Ubuntu con openssh-6.9, pero funciona bien.
Jakuje
1
md5 en lugar de sha1 ... no estoy seguro de cómo me perdí eso. De hecho, eso da resultados coincidentes.
estocástico
Tengo el problema opuesto. Tengo el md5 y quiero el otro formato. ¿Como lo consigo?
Gabriel Staples
1
Funciona cuando el comando se ejecuta en ubuntu. No funciona cuando el comando se ejecuta en centos.
Marinos un
5

Como resultado, el SSH Cookbook tiene una forma de generar claves manualmente en el formato hexadecimal más antiguo. Utilicé esto en el servidor freebsd.

awk '{print $ 2}' key.pub | base64 -d | md5 | sed 's /../&:/ g; s /:. * $ // '

Desglosando esto:

awk '{print $ 2}' key.pub

imprima la segunda columna (separada por espacios) en "key.pub", que es la clave en sí

base64 -d

la clave está codificada en base64. Esto generará los bytes reales de la clave

md5

este es el equivalente de freebsd del 'md5sum -b' que se especificó en la receta en la página del libro de cocina ssh

sed 's /../&:/ g; s /:. * $ // '

Hay dos comandos sed aquí:

s /../&:/ g;

reemplace cada par de caracteres en la línea (gracias a la bandera 'g' al final) con ese mismo par seguido de dos puntos

s /:. * $ // '

elimine los dos puntos finales (reemplace los dos puntos seguidos de un espacio seguido de cualquier cosa hasta el final de la línea sin nada).

estocástico
fuente
4

En casos como este, uso el siguiente pequeño script (probado en Debian y Ubuntu):

#!/bin/sh

# Gather the public ssh host keys for the given host
# and for each key print the fingerprint in hex format using the given
# checksum command (e.g. md5sum, sha256sum, ...)

if [ "$#" != 2 ]; then
  echo "usage: $0 hostname checksum_command"
  exit 1
fi

ssh-keyscan $1 2>/dev/null | while read -r line; do
  echo "Scanned key:"
  echo $line
  echo "$2 fingerprint:"
  echo $line | awk '{print $3}' | base64 -d | $2 -b | awk '{print $1}' | sed 's/../&:/g' | sed 's/:$//'
  echo
done

Ejemplo de uso:

$ myscript host.example.com md5sum
Scanned key:
host.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUXq7vpcEpnZQxxiLw/tdg8ui4LoqbW1O5nGyLtGw49
md5sum fingerprint:
6c:ef:26:f7:98:ad:ed:5b:cc:ff:83:13:46:c9:f6:79

Scanned key:
host.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4aLMajBvisnWNR2VX5K1KEkNeRmzlcs+svbY6/DiumMTZNtqB5duZjGkMmEbIclHaT7rQG9efAWsNhai5cJVRZ4VX1Gu/TLycEk4OY56MrrWjQYweSUr/W6E0eVCf7gh/ym2vMcevct4373fGDdlogk9Wa97lDV6PUXRy/znxRlo3tBc6KMOZIBoPu8UjeLr2ZPNPjO6hXX/96HbYfboxjhMl5eb8AWR0MGd4qU7RZZa2XhT4/4eSo8h9gEq8V3tasB24fMdw3K+HRiDyZm8uoNq+IrJlC22pBpzxRQtsv0Nd+uC5pK/UPVI3AFfdHMrmn7IHRio8aEaTloM6MRysGMtXE0kFQ/pV2U3TBmK/9wxID83qMDsQeUH4oTyjSJ0dCBuqgVQUg44z5qXVOK7gruvZSTyH7DsIyAXhlvLNwdtXPJ4HPQ90ZxLpiFWYgSPErQgbfgKeFkoSQiSP1M+UMkITCGRKMeUeDINheRJh/5y8+C3DjE54xyI4903ztyI7HqgVTOOFCtf+dlhCuS6+J20PFXEHDMdGCwmPQrKOG9Rb4NBxuvtn7MxJnwnlIu3nhDjr8SlZDOTvuK+bLpc4AZwEsNY7ANKFvj2mqE6hjkhu+x7khg84VQ6BKOmHIQnMrCpqICaNgB7Vz2d183BETrnfKQaPh79G5cQox5vwvw==
md5sum fingerprint:
b2:9c:cd:30:b1:38:e3:d1:17:d6:73:eb:03:9a:80:83

$ myscript host.example.com sha256sum
Scanned key:
host.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4aLMajBvisnWNR2VX5K1KEkNeRmzlcs+svbY6/DiumMTZNtqB5duZjGkMmEbIclHaT7rQG9efAWsNhai5cJVRZ4VX1Gu/TLycEk4OY56MrrWjQYweSUr/W6E0eVCf7gh/ym2vMcevct4373fGDdlogk9Wa97lDV6PUXRy/znxRlo3tBc6KMOZIBoPu8UjeLr2ZPNPjO6hXX/96HbYfboxjhMl5eb8AWR0MGd4qU7RZZa2XhT4/4eSo8h9gEq8V3tasB24fMdw3K+HRiDyZm8uoNq+IrJlC22pBpzxRQtsv0Nd+uC5pK/UPVI3AFfdHMrmn7IHRio8aEaTloM6MRysGMtXE0kFQ/pV2U3TBmK/9wxID83qMDsQeUH4oTyjSJ0dCBuqgVQUg44z5qXVOK7gruvZSTyH7DsIyAXhlvLNwdtXPJ4HPQ90ZxLpiFWYgSPErQgbfgKeFkoSQiSP1M+UMkITCGRKMeUeDINheRJh/5y8+C3DjE54xyI4903ztyI7HqgVTOOFCtf+dlhCuS6+J20PFXEHDMdGCwmPQrKOG9Rb4NBxuvtn7MxJnwnlIu3nhDjr8SlZDOTvuK+bLpc4AZwEsNY7ANKFvj2mqE6hjkhu+x7khg84VQ6BKOmHIQnMrCpqICaNgB7Vz2d183BETrnfKQaPh79G5cQox5vwvw==
sha256sum fingerprint:
f4:61:58:e4:90:65:c4:70:98:7f:d1:40:0a:d8:d9:79:14:e6:91:dc:b6:ed:91:8c:c0:df:d9:65:db:dd:a0:18

Scanned key:
host.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUXq7vpcEpnZQxxiLw/tdg8ui4LoqbW1O5nGyLtGw49
sha256sum fingerprint:
4b:73:d1:d7:80:87:46:64:56:71:64:10:7a:66:83:9b:c7:58:39:0b:16:74:dd:9b:d9:4b:e5:d5:61:7e:99:45
rpr
fuente