Există o modalitate de programare să obțineți o amprentă cheie server SSH fără autentificare la asta?

Încerc ssh -v user@host false 2>&1 | grep "Server host key", dar aceasta se blochează în așteptarea unei parole dacă autentificarea bazată pe cheie nu este configurată.

Răspuns

Puteți face acest lucru combinând ssh-keyscan și 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 

(din păcate, ssh-keyscan host | ssh-keygen -l -f /dev/stdin mult mai simplu nu funcționează)

Comentarii

  • Poate că o face ssh-keygen -l -f - <(ssh-keyscan host)?
  • OpenSSH > = 7.2 ssh-keyscan poate citi din stdin: ssh-keyscan host | ssh-keygen -lf -
  • Doar faceți: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - funcționează la fel de așteptat în ssh-keygen 7.2 și mai sus. Produce câteva linii de comentarii către STDERR care pot fi filtrate, așa cum se menționează în răspuns er de Anthony Geoghegan sau ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Noile versiuni ale openssh (cel puțin 7.2) vor afișa amprenta ca SHA256 (ex: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Dacă îl doriți în formatul vechi, furnizați -E md5 și ‘ veți vedea ceva de genul 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Răspuns

De curând a trebuit să fac asta singur așa că am crezut că Ați adăuga un răspuns care să arate cum se poate face acest lucru (cu versiuni de OpenSSH 7.2 sau mai recente ) într-o singură linie folosind substituirea procesului:

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

Următorul text explică modul în care funcționează aceste comenzi și evidențiază unele dintre diferențele de comportament dintre versiunile mai vechi și cele mai noi ale utilitarelor OpenSSH.

Preluare chei de gazdă publică

Comanda ssh-keyscan a fost dezvoltată astfel încât utilizatorii să poată obține chei de gazdă publice fără a fi nevoie să se autentifice pe serverul SSH. Din pagina sa de manual:

ssh-keyscan este un utilitar pentru colectarea cheilor de gazdă ssh publice ale unui număr de gazde. A fost conceput pentru a ajuta la construirea și verificarea fișierelor ssh_known_hosts.

Tip cheie

Tipul de cheie care trebuie preluat este specificat folosind opțiunea -t.

  • rsa1 (învechit SSH Protocol versiunea 1)
  • rsa
  • dsa
  • ecdsa (versiuni recente de OpenSSH)
  • ed25519 (versiuni recente de OpenSSH)

În versiunile moderne OpenSSH, tipurile de chei implicite care trebuie preluate sunt rsa (de la versiunea 5.1), ecdsa (de la versiunea 6.0) și ed25519 (de la versiunea 6.7).

Cu versiuni mai vechi ale ssh-keyscan (înainte de OpenSSH versiunea 5.1), tipul de cheie implicit a fost rsa1 (SSH Protocol 1) tipurile de chei ar trebui specificate în mod explicit:

ssh-keyscan -t rsa,dsa hostname 

Obțineți hashuri de amprentă de chei Base64

ssh-keyscan tipărește cheia gazdă a serverului SSH în Format codat în bază . Pentru a converti acest lucru într-un hash de amprentă, utilitarul ssh-keygen poate fi utilizat cu opțiunea sa -l pentru a imprima amprenta cheii publice specificate.

Dacă utilizați Bash, Zsh (sau shell-ul Korn), substituirea procesului poate fi utilizată pentru un singur liner la îndemână:

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

Notă : Cu versiuni de OpenSSH înainte de 7.2, funcțiile utilizate de ssh-keygen pentru a citi , nu au gestionat foarte bine țevile numite (FIFO), astfel încât această metodă nu ar funcționa, necesitând astfel utilizarea fișierelor temporare.

Algoritmi de hashere

Versiunile recente ale ssh-keygen print SHA256 hashuri de amprentă ale tastelor. Pentru a obține MD5 hashuri ale amprentelor cheii serverului (vechiul comportament), -E poate fi utilizată pentru a specifica algoritmul hash:

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

Utilizarea unei conducte

Dacă utilizați un shell POSIX (cum ar fi dash) care nu prezintă substituirea procesului, celelalte soluții care folosesc fișiere temporare vor funcționa. Cu toate acestea, cu versiunile mai noi de OpenSSH (de la 7.2), se poate utiliza o conductă simplă, deoarece ssh-keygen va accepta - ca nume de fișier pentru flux de intrare standard, permițând o comandă de conductă cu o singură linie.

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

Comentarii

  • Frumos și temeinic răspuns, acest lucru este cu siguranță mai bun decât să ai un fișier temporar!Vă pot sugera să furnizați un TL; DR la început cu versiunea de substituire a procesului, pentru a face oamenii nerăbdători să-l găsească mai repede? 🙂
  • Se pare că nu funcționează pe Ubuntu 14.04 LTS; Primesc o eroare ” / dev / fd / 63 nu este un fișier cu cheie publică „. Subprocesul funcționează.
  • @melleb Am găsit același lucru pe un sistem 12.04 la care am acces. Bănuiesc că ssh-keygen din versiunile mai vechi ale OpenSSH au o problemă la citirea din FIFO / denumită țeavă. ‘ Voi analiza acest lucru (și îmi voi actualiza răspunsul) când voi primi timp liber.
  • @melleb După ce mi-am petrecut timpul de descărcare descărcând diferite versiuni de cod sursă și inserând instrucțiuni de depanare printf în funcția do_fingerprint(), am constatat că, cu versiunile de OpenSSH înainte de 7.2, funcțiile utilizate de pentru a citi fișiere, nu a gestionat foarte bine conductele numite (FIFO), astfel încât metoda de substituire a procesului nu ar funcționa.
  • Acest lucru funcționează, dar dacă îl utilizați pentru a verifica o amprentă digitală, utilizatorii trebuie să fie conștienți de faptul că există ‘ o condiție de cursă: amprenta pe care o verificați cu această comandă nu este ‘ neapărat cea a cheii pe care o preluați, cu excepția cazului în care aruncați cheia înainte de a apela ssh-keygen pe ea.

Răspuns

nmap oferă această abilitate utilizând scriptul ssh-hostkey.

Pentru a returna amprenta hexadecimală a cheii:

$ nmap [SERVER] --script ssh-hostkey 

Pentru a returna conținutul cheii:

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

Pentru a returna bula vizuală a cheii

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

Pentru a returna toate cele de mai sus:

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

Sursă: nmap docs

Comentarii

  • Aceste exemple presupun că SSH rulează întotdeauna pe portul 22? Ce se întâmplă dacă ssh ascultă pe un port non-standard?
  • @MartinVegter (parafrazând Guarin42, cine nu putea ‘ t comment 🙂 nmap are opțiunea -p care poate specifica un port, de ex. -p 22000. ‘ este, de asemenea, posibil să utilizați opțiunea -vv pentru a crește detaliile (cantitatea de informații date)

Răspuns

filezilla afișează tastele hash cu md5 în hexazecimal format.

pentru a găsi acest lucru pe ubuntu linux utilizați această comandă:

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

notă: înlocuiți „localhost” cu IP-ul mașinii pe care doriți să o verificați.

Comentarii

  • Acest lucru a funcționat pentru mine pe Ubuntu 18, dar rețineți, veți obține rezultate diferite pentru localhost 127.0.0.1 sau domain.tld. Verificați amprenta pentru adresa URL care vă preocupă ~!

Răspundeți

Iată un script shell (în principal Bourne shell, dar folosind cuvântul cheie local, care este disponibil în cele mai moderne /bin/sh) am scris pentru a face acest lucru. Folosiți-l ca ssh-hostkey hostname. Va afișa atât amprentele în format sha256, cât și md5 pentru toate tastele gazdă pentru numele de gazdă sau adresa IP. De asemenea, puteți specifica manual „md5 „sau” sha256 „ca al doilea argument pentru a arăta formatul respectiv.

Folosește un fișier temporar în loc de canalizare pentru al face compatibil cu pachetele OpenSSH mai vechi (așa cum este descris în alte răspunsuri). Fișierul temporar utilizează /dev/shm (memorie partajată) dacă este disponibil.

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

Comentarii

  • Acesta este un demo frumos de împachetare a instrumentelor de nivel inferior cu opțiuni din linia de comandă. Include un bonus al modului de utilizare memorie partajată /dev/shm pe care nu am știut-o niciodată că este atât de convenabilă. Vă mulțumim pentru partajare !

Răspuns

Pentru propriul meu server folosesc următoarele:

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) 

Răspuns

Răspunsul simplu când aveți deja acces la server este:

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

Acum, este posibil să nu utilizați cheia RSA: dacă la conectare, ssh vă spune

ECDSA amprenta cheie este SHA256: XXXXX

În schimb, trebuie să utilizați /etc/ssh/ssh_host_ecdsa_key.pub. (notificare _ecdsa_ ). O comandă mai universală care listează toate cheile poate fi astfel construită ( sursă ):

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

Puteți scrie lista când configurați serverul, pentru referință ulterioară.O altă opțiune este să să le stochezi în înregistrări DNS


Din pagina de manual ssh-keygen (1):

-l Afișați amprenta fișierului cu cheie publică specificat. Pentru tastele RSA și DSA, ssh-keygen încearcă să găsească fișierul de chei publice care se potrivește și imprimă amprenta sa. Dacă este combinată cu -v, o reprezentare vizuală ASCII a cheii este furnizată împreună cu amprenta.

-f filename Specifică numele fișierului fișierului cheie.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *