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
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 verifiseressh_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 ido_fingerprint()
-funksjonen, fant jeg ut at med versjoner av OpenSSH før 7.2, funksjonene som ble brukt avssh-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
ellerdomain.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.
ssh-keygen -l -f - <(ssh-keyscan host)
gjør det, skjønt?ssh-keyscan host | ssh-keygen -lf -
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 ellerssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
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 som2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.