Onko ohjelmallisesti mahdollista saada SSH-palvelimen avaimen sormenjälki todentamatta siihen?
Yritän ssh -v user@host false 2>&1 | grep "Server host key"
, mutta tämä odottaa salasanan odottamista, jos avainpohjaista todennusta ei ole määritetty.
Vastaus
Voit tehdä tämän yhdistämällä ssh-keyscan
ja 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
(valitettavasti paljon yksinkertaisempi ssh-keyscan host | ssh-keygen -l -f /dev/stdin
ei toimi)
Kommentit
vastaus
Piti tehdä tämä hiljattain itse, joten ajattelin Lisää vastaus, joka näyttää, kuinka tämä voidaan tehdä ( OpenSSH 7.2 tai uudempi versioilla) yhdellä rivillä käyttämällä prosessikorvausta:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Seuraava teksti selittää näiden komentojen toiminnan ja tuo esiin joitain OpenSSH-apuohjelmien vanhempien ja uudempien versioiden käyttäytymiseroja.
Hae julkiset isäntäavaimet
ssh-keyscan
-komento on kehitetty siten, että käyttäjät voivat hankkia julkiset isäntäavaimet ilman todentamista SSH-palvelimelle. Man -sivulta:
ssh-keyscan
on apuohjelma useiden julkisten ssh-isäntäavainten keräämiseen isännät. Se on suunniteltu auttamaanssh_known_hosts
-tiedostojen rakentamisessa ja tarkistamisessa.
Avaintyyppi
Haettava avaimen tyyppi määritetään -t
-vaihtoehdon avulla.
-
rsa1
(vanhentunut SSH-protokollaversio 1) -
rsa
-
dsa
-
ecdsa
(viimeisimmät OpenSSH-versiot) -
ed25519
(viimeisimmät OpenSSH-versiot)
Nykyaikaisissa OpenSSH-julkaisuissa haettavat oletus avaintyypit ovat rsa
(versiosta 5.1 lähtien), ecdsa
(versiosta 6.0 lähtien) ja ed25519
(versiosta 6.7 lähtien).
iv id: n vanhemmilla versioilla = ”959be47752”>
(ennen OpenSSH-versiota 5.1) oletus avaintyyppi oli vanhentunutrsa1
(SSH-protokolla 1), joten avaintyypit olisi määriteltävä erikseen:
ssh-keyscan -t rsa,dsa hostname
Hae Base64-avainten sormenjälkien tiivistelmät
ssh-keyscan
tulostaa SSH-palvelimen isäntäavaimen kansioon Base64-koodattu muoto. Jos haluat muuntaa tämän sormenjälkikoodiksi, ssh-keygen
-apuohjelmaa voidaan käyttää sen -l
-vaihtoehdolla määritetyn julkisen avaimen sormenjäljen tulostamiseen.
Jos käytät Bashia, Zsh: ää (tai Korn-kuorta), prosessikorvausta voidaan käyttää kätevälle yhden linjan linjalle:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Huomautus : Jos OpenSSH-versio on ennen versiota 7.2, ssh-keygen
: n käyttämät toiminnot tiedostoja, ei käsitellyt nimettyjä putkia (FIFO) kovin hyvin, joten tämä menetelmä ei toiminut, mikä vaatii väliaikaisten tiedostojen käyttöä.
Hajautusalgoritmit
Viimeisimmät versiot ssh-keygen
print SHA256 avainten sormenjälkien hajautus. Saadaksesi MD5 palvelinavaimen sormenjälkien hajautusarvot (vanha käyttäytyminen), -E
-vaihtoehtoa voidaan käyttää hash-algoritmin määrittämiseen:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Putkilinjan käyttäminen
Jos käytät POSIX-kuorta (kuten dash
), joka ei sisällä prosessin korvaamista, muut väliaikaisia tiedostoja käyttävät ratkaisut toimivat. OpenSSH: n uudemmissa versioissa (vuodesta 7.2 lähtien) voidaan kuitenkin käyttää yksinkertaista putkistoa, koska ssh-keygen
hyväksyy -
tiedostonimeksi tavallinen tulovirta, sallien yksirivisen putkikomennon.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Kommentit
- Hyvää ja perusteellista vastaus, tämä on varmasti parempi kuin väliaikainen tiedosto!Voinko ehdottaa, että toimitat TL; DR: n alussa prosessikorvausversiolla, jotta kärsimättömät ihmiset löytävät sen nopeammin? 🙂
- Ei tunnu toimivan Ubuntu 14.04 LTS: ssä; Saan virheen ” / dev / fd / 63 ei ole julkisen avaimen tiedosto ”. Aliprosessi toimii.
- @melleb Löysin saman 12.04-järjestelmästä, johon minulla on pääsy. Epäilen, että
ssh-keygen
OpenSSH: n vanhemmista versioista on ongelma lukemisessa FIFO / named pipe -palvelusta. ’ Tarkastelen tätä (ja päivitän vastaukseni), kun saan vapaa-aikaa. - @melleb Kun olen viettänyt luch-aikani lataamalla erilaisia lähdekoodijulkaisuja ja lisäämällä virheenkorjaus
printf
-lausekkeet funktioondo_fingerprint()
havaitsin, että OpenSSH-versioiden ennen versiota 7.2 funktiot, joitassh-keygen
ei lukenut tiedostoja, ei käsitellyt nimettyjä putkia (FIFO) kovin hyvin, joten prosessin korvausmenetelmä ei toiminut. - Tämä toimii, mutta jos sitä käytetään sormenjäljen vahvistamiseen, käyttäjien tulisi olla tietoisia siitä, että ’ sa kilpailuehto: tällä komennolla tarkistamasi sormenjälki ei ole välttämättä avaimesi hae, ellet tyhjennä avainta ennen kuin soitat ssh-keygenille.
Vastaa
nmap
tarjoaa tämän kyvyn käyttämällä komentoa ssh-hostkey
.
Avaimen heksadesimaalisen sormenjäljen palauttaminen:
$ nmap [SERVER] --script ssh-hostkey
Avaimen sisällön palauttaminen:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Palaa avaimen visuaalinen kupla
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
Kaikkien yllä olevien palauttaminen:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Lähde: nmap-asiakirjat
kommentit
- Oletetaanko näiden esimerkkien mukaan, että SSH on aina käynnissä portissa 22? Entä jos ssh kuuntelee epätyypillisessä portissa?
- @MartinVegter (muotoilemalla Guarin42, joka ei voinut ’ t kommentti 🙂 nmapissa on vaihtoehto
-p
, joka voi määrittää portin, esim.-p 22000
. ’ s myös-vv
-vaihtoehdon avulla voidaan lisätä sanattavuutta (annettavan tiedon määrää)
vastaus
filezilla näyttää avaimet hajautettu md5: llä heksadesimaalilla -muoto.
löytääksesi tämän ubuntu linux koneellasi, käytä tätä komentoa:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
Huomaa: korvaa ”localhost” tarkistettavan koneen ip: llä.
Kommentit
- Tämä toimi minulle Ubuntu 18: ssa, mutta huomaa, että saat erituloksia haulle
localhost
127.0.0.1
taidomain.tld
. Tarkista sen URL-osoitteen sormenjälki, josta olet ~!
Vastaa
Tässä on komentotulkkikomento (pääasiassa Bourne-kuori, mutta käyttää local
-avainsanaa, joka on saatavana nykyaikaisimmissa /bin/sh
). Olen kirjoittanut tekemään tämän. Käytä sitä kuten ssh-hostkey hostname
. Se näyttää sekä sha256- että md5-muotoiset sormenjäljet kaikille isäntänäppäimille annetulle isäntänimelle tai IP-osoitteelle. Voit myös määrittää manuaalisesti ”md5
”tai” sha256
”toisena argumenttina vain kyseisen muodon näyttämiseksi.
Se käyttää väliaikaista tiedostoa putkiston sijasta, jotta se olisi yhteensopiva vanhempien OpenSSH-pakettien kanssa. (kuten muissa vastauksissa on kuvattu). Väliaikainen tiedosto käyttää /dev/shm
(jaettua muistia), jos käytettävissä.
#!/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 "$@"
Kommentit
- Tämä on hieno esittely alemman tason työkalujen käärimisestä komentorivivaihtoehdoilla. Sisältää bonuksen käytön jaettu muisti
/dev/shm
jota en koskaan tiennyt olevan niin kätevää. Kiitos jakamisesta !
Vastaa
Omassa palvelimessa käytän tätä:
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)
Vastaus
Yksinkertainen vastaus kun sinulla on jo käyttöoikeus palvelimelle on:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Nyt et ehkä käytä RSA-avainta: jos muodostat yhteyden, ssh
kertoo sinulle
ECDSA -avaimen sormenjälki on SHA256: XXXXX
Sen sijaan on käytettävä /etc/ssh/ssh_host_ecdsa_key.pub
. (huomaa _ecdsa_ ). Täten voidaan rakentaa yleisempi komento, joka listaa kaikki avaimet ( lähde ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
Voit kirjoittaa luettelon palvelinta asennettaessa myöhempää tarvetta varten.Toinen vaihtoehto on tallentaa ne DNS-tietueisiin
ssh-keygen (1) -sivulta:
-l
Näytä määritetyn julkisen avaimen tiedoston sormenjälki. RSA- ja DSA-avaimille ssh-keygen yrittää löytää vastaavan julkisen avaimen tiedoston ja tulostaa sen sormenjäljen. Yhdistettynä -v: ään sormenjälki toimitetaan avaimen visuaalinen ASCII-esitys.
-f
filename
Määrittää avaintiedoston tiedostonimen.
ssh-keygen -l -f - <(ssh-keyscan host)
kuitenkin?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
toimii paljon odotetusti ssh-keygen 7.2: ssä ja uudemmissa. Se tuottaa joitain kommenttirivejä STDERR: ään, jotka voidaan suodattaa pois, kuten vastauksessa mainitaan kirjoittanut Anthony Geoghegan taissh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Jos haluat sen vanhaan muotoon, anna-E md5
ja näet ’ näette jotain2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.