Er det en måte å programmatisk få et SSH-servernøkkel fingeravtrykk uten å autentisere til det?

Jeg prøver ssh -v user@host false 2>&1 | grep "Server host key", men dette henger og venter på et passord hvis nøkkelbasert godkjenning ikke er konfigurert.

Svar

Du kan gjøre dette ved å kombinere ssh-keyscan og 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 

(dessverre fungerer den mye enklere ssh-keyscan host | ssh-keygen -l -f /dev/stdin ikke)

Kommentarer

  • Kanskje ssh-keygen -l -f - <(ssh-keyscan host) gjør det, skjønt?
  • OpenSSH > = 7,2 ssh-keyscan kan lese fra stdin: ssh-keyscan host | ssh-keygen -lf -
  • Bare gjør: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - fungerer mye som forventet i ssh-keygen 7.2 og nyere. Det gir noen kommentarlinjer til STDERR som kan filtreres ut, som nevnt i svaret er av Anthony Geoghegan eller ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nye versjoner av openssh (i det minste 7.2) vil vise fingeravtrykket som SHA256 (f.eks: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Hvis du vil ha det i det gamle formatet, gir du -E md5 og du ‘ ser noe sånt som 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Svar

Jeg måtte nylig gjøre dette selv, så jeg trodde jeg vil legge til et svar som viser hvordan dette kan gjøres (med versjoner av OpenSSH 7.2 eller nyere ) i en linje ved hjelp av prosessubstitusjon:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

Følgende tekst forklarer hvordan disse kommandoene fungerer og fremhever noen av forskjellene i atferd mellom eldre og nyere versjoner av OpenSSH-verktøyene.

Hent offentlige vertsnøkler

Kommandoen ssh-keyscan ble utviklet slik at brukere kan få offentlige vertsnøkler uten å måtte godkjenne SSH-serveren. Fra sin manside:

ssh-keyscan er et verktøy for å samle de offentlige ssh-vertsnøklene til et antall verter. Den ble designet for å hjelpe til med å bygge og verifisere ssh_known_hosts filer.

Nøkkeltype

Typen nøkkel som skal hentes spesifiseres ved hjelp av alternativet -t.

  • rsa1 (foreldet SSH-protokoll versjon 1)
  • rsa
  • dsa
  • ecdsa (nylige versjoner av OpenSSH)
  • ed25519 (nylige versjoner av OpenSSH)

I moderne OpenSSH-utgivelser er standard nøkkeltypene som skal hentes rsa (siden versjon 5.1), ecdsa (siden versjon 6.0), og ed25519 (siden versjon 6.7).

Med eldre versjoner av ssh-keyscan (før OpenSSH versjon 5.1) var nøkkeltypen standard den utdaterte rsa1 (SSH Protocol 1) nøkkeltypene må spesifiseres spesifikt:

ssh-keyscan -t rsa,dsa hostname 

Få fingeravtrykk-hashes av Base64-nøkler

ssh-keyscan skriver ut vertsnøkkelen til SSH-serveren i Base64-kodet format. For å konvertere dette til et fingeravtrykk-hash, kan ssh-keygen -verktøyet brukes med alternativet -l for å skrive ut fingeravtrykket til den angitte offentlige nøkkelen.

Hvis du bruker Bash, Zsh (eller Korn-skallet), kan prosessubstitusjon brukes til en praktisk one-liner:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

Merk : Med versjoner av OpenSSH før 7.2, bruker funksjonene ssh-keygen til å lese filer, håndterte ikke navngitte rør (FIFO) veldig bra, slik at denne metoden ikke ville fungere, og dermed kreves bruk av midlertidige filer.

Hashing-algoritmer

Nylige versjoner av ssh-keygen skriver ut SHA256 fingeravtrykk hashes av tastene. For å få MD5 hashes av servernøkkelens fingeravtrykk (den gamle oppførselen), -E alternativet kan brukes til å spesifisere hash-algoritmen:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null) 

Bruke en rørledning

Hvis du bruker et POSIX-skall (for eksempel dash) som ikke har prosessubstitusjon, vil de andre løsningene som bruker midlertidige filer fungere. Imidlertid, med nyere versjoner av OpenSSH (siden 7.2), kan en enkel rørledning brukes siden ssh-keygen aksepterer - som et filnavn for standard inngangsstrøm, som tillater en linjekanal for en linje.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf - 

Kommentarer

  • Fin og grundig svar, dette er absolutt bedre enn å ha en midlertidig fil!Kan jeg foreslå at du gir en TL; DR i begynnelsen av prosesserstatningsversjonen, for å få utålmodige folk til å finne det raskere? 🙂
  • Ser ikke ut til å fungere på Ubuntu 14.04 LTS; Jeg får en feil » / dev / fd / 63 er ikke en offentlig nøkkelfil «. Underprosessen fungerer.
  • @melleb Jeg fant det samme på et 12.04-system som jeg har tilgang til. Jeg mistenker at ssh-keygen fra eldre versjoner av OpenSSH har problemer med å lese fra FIFO / navngitte rør. Jeg ‘ Jeg ser på dette (og oppdaterer svaret mitt) når jeg får litt ledig tid.
  • @melleb Etter å ha brukt mye tid på å laste ned forskjellige kildekodeutgivelser og satte inn feilsøking printf utsagn i do_fingerprint() -funksjonen, fant jeg ut at med versjoner av OpenSSH før 7.2, funksjonene som ble brukt av ssh-keygen for å lese filer, håndterte ikke navngitte rør (FIFOs) veldig bra, slik at metoden for prosesserstatning ikke ville fungere.
  • Dette fungerer, men hvis du bruker det til å verifisere et fingeravtrykk brukere bør være oppmerksomme på at ‘ en løpstilstand: fingeravtrykket du sjekker med denne kommandoen er ikke ‘ t nødvendigvis det for nøkkelen du hent, med mindre du slipper nøkkelen før du ringer til ssh-keygen på den.

Svar

nmap gir denne muligheten ved å bruke skriptet ssh-hostkey.

Slik returnerer du nøkkelen «s heksadesimale fingeravtrykk:

$ nmap [SERVER] --script ssh-hostkey 

For å returnere nøkkelens innhold:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full 

For å returnere nøkkelens visuelle boble

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble" 

For å returnere alt ovenfor:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all 

Kilde: nmap docs

Kommentarer

  • Antar disse eksemplene at SSH alltid kjører på port 22? Hva om ssh lytter på en ikke-standard port?
  • @MartinVegter (omskriver Guarin42, hvem kunne ikke ‘ t kommentar 🙂 nmap har -p alternativet som kan spesifisere en port, f.eks. -p 22000. ‘ er også mulig å bruke alternativet -vv for å øke ordlighetsgraden (gitt informasjon)

Svar

filezilla viser nøkler hashad med md5 i heksadesimal format.

for å finne dette på ubuntu linux maskinen, bruk denne kommandoen:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null) 

Merk: erstatt «localhost» med IP-en til maskinen du vil sjekke.

Kommentarer

  • Dette fungerte for meg på Ubuntu 18, men vær oppmerksom på at du får forskjellsresultater for localhost 127.0.0.1 eller domain.tld. Sjekk fingeravtrykket for URL-en du er opptatt av ~!

Svar

Her er et skallskript (hovedsakelig Bourne-skall, men bruker local søkeord, som er tilgjengelig i de fleste moderne /bin/sh) Jeg har skrevet for å gjøre dette. Bruk det som ssh-hostkey hostname. Det viser både fingeravtrykkene sha256 og md5-format for alle vertsnøkler for det angitte vertsnavnet eller IP-adressen. Du kan også spesifisere «md5 «eller» sha256 «som det andre argumentet for å bare vise det bestemte formatet.

Den bruker en midlertidig fil i stedet for piping for å gjøre den kompatibel med eldre OpenSSH-pakker (som beskrevet i andre svar). Den midlertidige filen bruker /dev/shm (delt minne) hvis tilgjengelig.

#!/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 "$@" 

Kommentarer

  • Dette er en fin demo av innpakning av verktøy på lavere nivå med kommandolinjealternativer. Inkluderer en bonus på hvordan du bruker delt minne /dev/shm som jeg aldri visste var så praktisk å gjøre. Takk for deling !

Svar

For min egen server bruker jeg dette:

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) 

Svar

Det enkle svaret når du allerede har tilgang til serveren er:

ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

Nå bruker du kanskje ikke RSA-nøkkelen: Hvis ssh forteller deg

ECDSA nøkkelfingeravtrykk er SHA256: XXXXX

Du må bruke /etc/ssh/ssh_host_ecdsa_key.pub i stedet. (legg merke til _ecdsa_ ). En mer universell kommando som viser alle nøkler kan dermed konstrueres ( kilde ):

for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

Du kan skrive ned listen når du setter opp serveren, for fremtidig referanse.Et annet alternativ er å lagre dem i DNS-poster


Fra ssh-keygen (1) manpage:

-l Vis fingeravtrykk for spesifisert offentlig nøkkelfil. For RSA- og DSA-nøkler prøver ssh-keygen å finne den samsvarende offentlige nøkkelfilen og skriver ut fingeravtrykket. Hvis kombinert med -v, leveres en visuell ASCII-kunstrepresentasjon av nøkkelen med fingeravtrykket.

-f filename Angir filnavnet til nøkkelfilen.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *