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
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șierelorssh_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țiado_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
saudomain.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.
ssh-keygen -l -f - <(ssh-keyscan host)
?ssh-keyscan host | ssh-keygen -lf -
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 saussh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Dacă îl doriți în formatul vechi, furnizați-E md5
și ‘ veți vedea ceva de genul2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.