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

  • Forse ssh-keygen -l -f - <(ssh-keyscan host) lo fa?
  • OpenSSH > = 7.2 ssh-keyscan è in grado di leggere da stdin: ssh-keyscan host | ssh-keygen -lf -
  • Basta fare: 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 o ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Le nuove versioni di openssh (7.2 almeno) visualizzeranno limpronta digitale come SHA256 (es: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Se lo desideri nel vecchio formato, fornisci -E md5 e ‘ vedrai qualcosa come 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

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 file ssh_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 funzione do_fingerprint(), ho scoperto che con le versioni di OpenSSH precedenti alla 7.2, le funzioni utilizzate da ssh-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 o domain.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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *