%20en%20la%20nueva%20versi%C3%B3n%20de%20openssh.png)
Parece que openssh ha cambiado la forma en que muestra las huellas digitales de las claves.
Estoy intentando realizar ssh desde una máquina cliente a un servidor:
- cliente: ubuntu 14.04 ejecutando OpenSSH 6.6.1
- servidor: FreeBSD ejecutando 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 utiliza por defecto el hash sha256, pero gracias aesta respuestaPuedo obligarlo a dar 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 lugar de eso me sale 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, hash sha1) para verificar que sean iguales?
EDITAR: La versión antigua de SSH proporciona lamd5suma de comprobación,nola suma de comprobación sha1 como pensé erróneamente. El uso de esa suma de verificación (como debería indicar la respuesta ahora aceptada) en la opción -E proporciona el resultado deseado.
Respuesta1
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 explica en su respuesta.
Respuesta2
En casos como este utilizo 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
Uso de ejemplo:
$ 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
Respuesta3
Como resulta, elLibro de recetas SSHtiene una forma de generar claves manualmente en el formato hexadecimal anterior. Usé esto en el servidor freebsd.
awk '{imprimir $2}' clave.pub | base64 -d | md5 | sed 's/../&:/g; s/: .*$//'
Desglosando esto:
awk '{imprimir $2}' clave.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).
Respuesta4
Para las claves agregadas a ssh-agent, este comando enumerará sus huellas digitales de clave pública MD5:
ssh-add -l -E md5
Para imprimir huellas digitales MD5 para todas las claves públicas en un directorio, use esto:
find ~/.ssh/ -name *.pub -printf '%f\t' -exec ssh-keygen -l -E md5 -f {} \;
Esto también imprimirá el nombre del archivo para facilitar la identificación.