Esiste un modo per programmaticamente ottenere unimpronta digitale della chiave del server SSH senza autenticarti ad esso?
Sto provando ssh -v user@host false 2>&1 | grep "Server host key"
, ma si blocca in attesa di una password se lautenticazione basata su chiave non è configurata.
Risposta
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 più semplice ssh-keyscan host | ssh-keygen -l -f /dev/stdin
non funziona)
Commenti
Risposta
Recentemente ho dovuto farlo da solo, quindi ho pensato di aggiungere una risposta che mostri come eseguire questa operazione (con versioni di OpenSSH 7.2 o successive ) in una riga utilizzando la sostituzione del processo:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Il testo seguente spiega come funzionano questi comandi ed evidenzia alcune delle differenze di comportamento tra le versioni precedenti e quelle più recenti delle utilità OpenSSH.
Recupera le chiavi dellhost pubblico
Il comando ssh-keyscan
è stato sviluppato in modo che gli utenti possano ottenere chiavi host pubbliche senza bisogno di autenticarsi sul server SSH. Dalla sua pagina man:
ssh-keyscan
è unutilità per raccogliere le chiavi host ssh pubbliche di un certo numero di host. È stato progettato per facilitare la creazione e la verifica dei filessh_known_hosts
.
Tipo di chiave
Il tipo di chiave da recuperare viene specificato utilizzando lopzione -t
.
-
rsa1
(obsoleto Protocollo SSH versione 1) -
rsa
-
dsa
-
ecdsa
(versioni recenti di OpenSSH) -
ed25519
(versioni recenti di OpenSSH)
Nelle versioni moderne 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 versioni precedenti di ssh-keyscan
(prima della versione 5.1 di OpenSSH), il tipo di chiave predefinito era il rsa1
obsoleto (protocollo SSH 1) quindi i tipi di chiave dovrebbero essere specificati esplicitamente:
ssh-keyscan -t rsa,dsa hostname
Ottieni gli hash delle impronte digitali delle chiavi Base64
ssh-keyscan
stampa la chiave host del server SSH in Formato con codifica Base64 . Per convertirlo in un hash dellimpronta digitale, è possibile utilizzare lutilità ssh-keygen
con lopzione -l
per stampare limpronta digitale della chiave pubblica specificata.
Se si utilizza Bash, Zsh (o la shell Korn), la sostituzione del processo può essere utilizzata per una pratica riga di comando:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Nota : con le versioni di OpenSSH precedenti alla 7.2, le funzioni utilizzate da ssh-keygen
per leggere files, non gestiva molto bene le pipe con nome (FIFO), quindi questo metodo non funzionava, richiedendo quindi luso di file temporanei.
Algoritmi di hash
Versioni recenti di ssh-keygen
print SHA256 hash delle impronte digitali delle chiavi. Per ottenere MD5 hash delle impronte digitali della chiave del server (il vecchio comportamento), -E
può essere utilizzata per specificare lalgoritmo hash:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Utilizzo di una pipeline
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 7.2), è possibile utilizzare una semplice pipeline poiché ssh-keygen
accetterà -
come nome file per flusso di input standard, che consente un comando pipeline di una riga.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Commenti
- Bello e completo risposta, questo è sicuramente meglio che avere un file temporaneo!Posso suggerire di fornire un TL; DR allinizio con la versione di sostituzione del processo, per fare in modo che le persone impazienti lo trovino più velocemente? 🙂
- Non sembra funzionare su Ubuntu 14.04 LTS; Ricevo un errore ” / dev / fd / 63 non è un file di chiave pubblica “. Il sottoprocesso funziona.
- @melleb Ho trovato la stessa cosa su un sistema 12.04 a cui ho accesso. Sospetto che
ssh-keygen
da versioni precedenti di OpenSSH abbiano un problema di lettura dal FIFO / named pipe. ‘ esaminerò questo aspetto (e aggiornerò la mia risposta) quando avrò del tempo libero. - @melleb Dopo aver trascorso il mio tempo libero a scaricare varie versioni di codice sorgente e inserendo le istruzioni di debug
printf
nella funzionedo_fingerprint()
, ho scoperto che con le versioni di OpenSSH precedenti alla 7.2, le funzioni utilizzate dassh-keygen
per leggere i file, non gestiva molto bene le pipe con nome (FIFO) quindi il metodo di sostituzione del processo non funzionava. - Funziona, ma se lo si utilizza per verificare unimpronta digitale, gli utenti devono essere consapevoli che ‘ una condizione di competizione: limpronta digitale che stai verificando con questo comando non è ‘ t necessariamente quella della chiave che hai fetch, a meno che non scarichi la chiave prima di richiamare ssh-keygen su di essa.
Answer
nmap
fornisce questa capacità utilizzando lo script ssh-hostkey
.
Per restituire limpronta 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: nmap docs
Commenti
- Questi esempi presumono che SSH sia sempre in esecuzione sulla porta 22? E se ssh fosse in ascolto su una porta non standard?
- @MartinVegter (parafrasando Guarin42, che non può ‘ t comment 🙂 nmap ha lopzione
-p
che può specificare una porta, ad esempio-p 22000
. ‘ è anche possibile utilizzare lopzione-vv
per aumentare la verbosità (quantità di informazioni fornite)
Risposta
filezilla visualizza chiavi sottoposte ad hashing con md5 in esadecimale formato.
per trovarlo sulla tua macchina ubuntu linux usa questo comando:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
nota: sostituire “localhost” con lip della macchina che si desidera controllare.
Commenti
- Questo ha funzionato per me su Ubuntu 18, ma nota, otterrai risultati diversi per
localhost
127.0.0.1
odomain.tld
. Controlla limpronta digitale per lURL che ti interessa ~!
Risposta
Ecco uno script di shell (principalmente Bourne shell ma utilizzando la parola chiave local
, che è disponibile nella maggior parte dei moderni /bin/sh
) ho “scritto per farlo. Usala come ssh-hostkey hostname
. Mostrerà le impronte digitali in formato sha256 e md5 per tutte le chiavi host per il nome host o lindirizzo IP specificato. Puoi anche specificare manualmente “md5
“o” sha256
“come secondo argomento per mostrare solo quel particolare formato.
Utilizza un file temporaneo invece di 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 "$@"
Commenti
- Questa è una bella demo di come integrare strumenti di livello inferiore con opzioni della riga di comando. Include un bonus sullutilizzo memoria condivisa
/dev/shm
che non ho mai pensato fosse così conveniente da fare. Grazie per la condivisione !
Risposta
Per il mio server utilizzo questo:
ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub)
Risposta
La risposta semplice quando hai già accesso al server è:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Ora, potresti non utilizzare la chiave RSA: se durante la connessione, ssh
ti dice
ECDSA limpronta digitale della chiave è SHA256: XXXXX
Devi utilizzare /etc/ssh/ssh_host_ecdsa_key.pub
. (avviso _ecdsa_ ). È quindi possibile creare un comando più universale che elenchi tutte le chiavi ( source ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
È possibile annotare lelenco durante la configurazione del server, per riferimento futuro.Unaltra opzione è memorizzarli nei record DNS
Dalla manpage ssh-keygen (1):
-l
Mostra limpronta digitale del file di chiave pubblica specificato. Per le chiavi RSA e DSA, ssh-keygen cerca di trovare il file della chiave pubblica corrispondente e stampa la sua impronta digitale. Se combinato con -v, con limpronta digitale viene fornita una rappresentazione artistica ASCII visiva della chiave.
-f
filename
Specifica il nome del file della chiave.
ssh-keygen -l -f - <(ssh-keyscan host)
lo fa?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 er di Anthony Geoghegan ossh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Se lo desideri nel vecchio formato, fornisci-E md5
e ‘ vedrai qualcosa come2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.