Risposte:
Puoi farlo combinando ssh-keyscan
e ssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file
(purtroppo il molto più semplice ssh-keyscan host | ssh-keygen -l -f /dev/stdin
non funziona)
ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
funziona come previsto in ssh-keygen 7.2 e versioni successive. Produce alcune righe di commento a STDERR che possono essere filtrate, come menzionato nella risposta di Anthony Geoghegan ossh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Di recente ho dovuto farlo da solo, quindi ho pensato di aggiungere una risposta che mostri come farlo (con le versioni di OpenSSH 7.2 o successive ) in una riga usando la sostituzione del processo:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Il seguente testo spiega come funzionano questi comandi ed evidenzia alcune delle differenze nel comportamento tra le versioni più vecchie e più recenti delle utility OpenSSH.
Il ssh-keyscan
comando è stato sviluppato in modo che gli utenti possano ottenere le chiavi dell'host pubblico senza la necessità di autenticarsi sul server SSH. Dalla sua pagina man:
ssh-keyscan
è un'utilità per raccogliere le chiavi dell'host ssh pubbliche di un numero di host. È stato progettato per facilitare la creazione e la verifica deissh_known_hosts
file.
Il tipo di chiave da recuperare è specificato mediante l' -t
opzione.
rsa1
(Protocollo SSH obsoleto versione 1)rsa
dsa
ecdsa
(versioni recenti di OpenSSH)ed25519
(versioni recenti di OpenSSH)Nelle moderne versioni di OpenSSH, i tipi di chiave predefiniti da recuperare sono rsa
(dalla versione 5.1), ecdsa
(dalla versione 6.0) e ed25519
(dalla versione 6.7).
Con le versioni precedenti di ssh-keyscan
(prima di OpenSSH versione 5.1), il
tipo di chiave predefinito era obsoleto rsa1
(SSH Protocol 1), quindi i tipi di chiave avrebbero dovuto essere specificati esplicitamente:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
stampa la chiave host del server SSH in
formato codificato Base64 . Per convertire questo in un hash dell'impronta digitale, è ssh-keygen
possibile utilizzare l' utilità con la sua -l
opzione per stampare l'impronta digitale della chiave pubblica specificata.
Se si utilizza Bash, Zsh (o la shell Korn), la sostituzione del processo può essere utilizzata per un pratico one-liner:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Nota : con le versioni di OpenSSH precedenti alla 7.2, le funzioni utilizzate
ssh-keygen
per leggere i file non gestivano molto bene le named pipe (FIFO), quindi questo metodo non funzionava, richiedendo quindi l'uso di file temporanei.
Versioni recenti degli hash delle impronte digitali SHA256 di ssh-keygen
stampa dei tasti. Per ottenere gli hash MD5 delle impronte digitali della chiave del server (il vecchio comportamento), è
possibile utilizzare l' opzione per specificare l'algoritmo hash:-E
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Se si utilizza una shell POSIX (come dash
) che non prevede la sostituzione del processo, le altre soluzioni che utilizzano file temporanei funzioneranno. Tuttavia, con le versioni più recenti di OpenSSH (dalla versione 7.2), è possibile utilizzare una pipeline semplice poiché ssh-keygen
accetterà -
come nome file per il flusso di input standard, consentendo un comando di pipeline su una riga.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
ssh-keygen
dalle versioni precedenti di OpenSSH si sia verificato un problema nella lettura dalla pipe FIFO / named. Esaminerò questo (e aggiornerò la mia risposta) quando avrò del tempo libero.
printf
istruzioni di debug nella do_fingerprint()
funzione, ho scoperto che con le versioni di OpenSSH precedenti alla 7.2, le funzioni utilizzate ssh-keygen
per leggere i file non gestivano molto bene le named pipe (FIFO) il metodo di sostituzione del processo non funzionerebbe.
nmap
fornisce questa capacità usando lo ssh-hostkey
script.
Per restituire l'impronta digitale esadecimale della chiave:
$ nmap [SERVER] --script ssh-hostkey
Per restituire il contenuto della chiave:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Per restituire la bolla visiva della chiave
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Per restituire tutto quanto sopra:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Fonte: documenti nmap
-p
opzione che può specificare una porta, ad es -p 22000
. È anche possibile utilizzare l' -vv
opzione per aumentare la verbosità (quantità di informazioni fornite)
Ecco uno script di shell (principalmente shell Bourne ma usando la local
parola chiave, che è disponibile nella maggior parte dei moderni /bin/sh
) che ho scritto per fare questo. Usalo come ssh-hostkey hostname
. Mostrerà le impronte digitali in formato sha256 e md5 per tutte le hostkey per il nome host o l'indirizzo IP specificato. Puoi anche specificare manualmente " md5
" o " sha256
" come secondo argomento per mostrare solo quel particolare formato.
Utilizza un file temporaneo anziché il piping per renderlo compatibile con i vecchi pacchetti OpenSSH (come descritto in altre risposte). Il file temporaneo utilizza /dev/shm
(memoria condivisa) se disponibile.
#!/bin/sh
usage () {
printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}
ssh_hostkey () {
local host="$1"
local fprinthash="$2"
local tmp=
case "$host" in
-h|--help|'')
usage >&2
return 1
;;
esac
case "$fprinthash" in
md5|sha256|'') true;;
*)
usage >&2
printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
return 2
;;
esac
if test -d /dev/shm
then tmp="$(mktemp -d -p /dev/shm)"
else tmp="$(mktemp -d)"
fi
trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
case "$fprinthash" in
sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
esac
case "$fprinthash" in
md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
esac
trap - INT TERM EXIT
rm -rf "$tmp" > /dev/null 2>&1
}
ssh_hostkey "$@"
ssh-keygen -l -f - <(ssh-keyscan host)
fa, però?