Er der en måde at programmatisk få et SSH server nøgle fingeraftryk uden at godkende til det?
Jeg prøver ssh -v user@host false 2>&1 | grep "Server host key"
, men dette hænger med at vente på en adgangskode, hvis nøglebaseret godkendelse ikke er konfigureret.
Svar
Du kan gøre dette ved at 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
(desværre fungerer den meget enklere ssh-keyscan host | ssh-keygen -l -f /dev/stdin
ikke)
Kommentarer
Svar
Jeg var for nylig nødt til at gøre dette selv, så jeg troede, at jeg tilføj et svar, der viser, hvordan dette kan gøres (med versioner af OpenSSH 7.2 eller nyere ) i en linje ved hjælp af proceserstatning:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Den følgende tekst forklarer, hvordan disse kommandoer fungerer, og fremhæver nogle af forskellene i adfærd mellem ældre og nyere versioner af OpenSSH-hjælpeprogrammer.
Hent offentlige værtsnøgler
Kommandoen ssh-keyscan
blev udviklet, så brugerne kan få offentlige værtsnøgler uden at skulle godkende til SSH-serveren. Fra sin man-side:
ssh-keyscan
er et værktøj til at samle de offentlige ssh-værtsnøgler til et antal værter. Det var designet til at hjælpe med at opbygge og verificeressh_known_hosts
filer.
Nøgletype
Den type nøgle, der skal hentes, angives ved hjælp af indstillingen -t
.
-
rsa1
(forældet SSH-protokol version 1) -
rsa
-
dsa
-
ecdsa
(seneste versioner af OpenSSH) -
ed25519
(seneste versioner af OpenSSH)
I moderne OpenSSH-udgivelser er de standard nøgletyper, der skal hentes, rsa
(siden version 5.1), ecdsa
(siden version 6.0) og ed25519
(siden version 6.7).
Med ældre versioner af ssh-keyscan
(før OpenSSH version 5.1) var nøgletypen standard den forældede rsa1
(SSH Protocol 1) nøgletyperne skal specifikt specificeres:
ssh-keyscan -t rsa,dsa hostname
Få fingeraftrykshash af Base64-nøgler
ssh-keyscan
udskriver SSH-serverens værtsnøgle i Base64-kodet format. For at konvertere dette til et fingeraftryks-hash kan ssh-keygen
-værktøjet bruges med dets -l
-mulighed til at udskrive fingeraftryk fra den angivne offentlige nøgle.
Hvis du bruger Bash, Zsh (eller Korn-skallen), kan proceserstatning bruges til en praktisk one-liner:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Bemærk : Med versioner af OpenSSH før 7.2, skal de funktioner, der bruges af ssh-keygen
læses filer, håndterede ikke navngivne rør (FIFOer) meget godt, så denne metode ville ikke fungere, hvilket kræver brug af midlertidige filer.
Hashing-algoritmer
Seneste versioner af ssh-keygen
print SHA256 fingeraftryks hash af tasterne. For at få MD5 hashes af servernøglens fingeraftryk (den gamle adfærd), -E
option kan bruges til at specificere hash-algoritmen:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Brug af en pipeline
Hvis du bruger en POSIX-shell (såsom dash
) som ikke indeholder proceserstatning, fungerer de andre løsninger, der bruger midlertidige filer. Men med nyere versioner af OpenSSH (siden 7.2) kan en simpel pipeline bruges, da ssh-keygen
accepterer -
som et filnavn til standard inputstrøm, der muliggør en pipeline-kommando med en linje.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Kommentarer
- Dejlig og grundig svar, dette er bestemt bedre end at have en midlertidig fil!Må jeg foreslå, at du giver en TL; DR i starten med procesudskiftningsversionen for at få utålmodige folk til at finde det hurtigere? 🙂
- Ser ikke ud til at fungere på Ubuntu 14.04 LTS; Jeg får en fejl ” / dev / fd / 63 er ikke en offentlig nøglefil “. Underprocessen fungerer.
- @melleb Jeg fandt det samme på et 12.04-system, som jeg har adgang til. Jeg formoder, at
ssh-keygen
fra ældre versioner af OpenSSH har problemer med at læse fra FIFO / navngivet rør. Jeg ‘ Jeg ser på dette (og opdaterer mit svar), når jeg får lidt fritid. - @melleb Efter at have brugt min tid på at downloade forskellige kildekodeudgivelser og indsætte fejlretning
printf
udsagn ido_fingerprint()
-funktionen, fandt jeg, at med versioner af OpenSSH før 7.2, blev de funktioner, der blev brugt afssh-keygen
for at læse filer, håndterede ikke navngivne rør (FIFOer) meget godt, så procesudskiftningsmetoden ville ikke fungere. - Dette fungerer, men hvis det bruges til at bekræfte et fingeraftryk, brugere skal være opmærksomme på, at der ‘ en race-tilstand: det fingeraftryk, du kontrollerer med denne kommando, er ikke ‘ t nødvendigvis det for den nøgle, du hent, medmindre du dumper nøglen før du kalder ssh-keygen på den.
Svar
nmap
giver denne mulighed ved at bruge scriptet ssh-hostkey
.
Sådan returneres nøglen “s hexadecimale fingeraftryk:
$ nmap [SERVER] --script ssh-hostkey
Sådan returneres nøglens indhold:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
For at returnere nøglens visuelle boble
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
For at returnere alt det ovenstående:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Kilde: nmap docs
Kommentarer
- Antager disse eksempler, at SSH altid kører på port 22? Hvad hvis ssh lytter til en ikke-standardport?
- @MartinVegter (omskrivning af Guarin42, hvem kunne ikke ‘ t kommentar 🙂 nmap har
-p
mulighed, der kan angive en port, f.eks.-p 22000
. ‘ er også muligt at bruge indstillingen-vv
til at øge ordligheden (mængden af information givet)
Svar
filezilla viser nøgler hash med md5 i hexadecimal format.
for at finde dette på din ubuntu linux maskine, brug denne kommando:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
note: udskift “localhost” med ip på den maskine, du vil kontrollere.
Kommentarer
- Dette fungerede for mig på Ubuntu 18, men bemærk, du får forskelresultater for
localhost
127.0.0.1
ellerdomain.tld
. Tjek fingeraftrykket for den webadresse, du er bekymret med ~!
Svar
Her er et shell-script (hovedsageligt Bourne-skal, men bruger local
nøgleord, som er tilgængeligt i de fleste moderne /bin/sh
) Jeg har skrevet for at gøre dette. Brug det som ssh-hostkey hostname
. Det viser både fingeraftryk fra sha256 og md5-format for alle værtsnøgler for det givne værtsnavn eller IP-adresse. Du kan også manuelt angive “md5
“eller” sha256
“som det andet argument for kun at vise det bestemte format.
Det bruger en midlertidig fil i stedet for piping for at gøre den kompatibel med ældre OpenSSH-pakker (som beskrevet i andre svar). Den midlertidige fil bruger /dev/shm
(delt hukommelse) hvis tilgængelig.
#!/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 god demo af indpakning af værktøjer på lavere niveau med kommandolinjemuligheder. Inkluderer en bonus på, hvordan man bruger delt hukommelse
/dev/shm
som jeg aldrig vidste var så praktisk at gøre. Tak for deling !
Svar
For min egen server bruger 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 svar når du allerede har adgang til serveren er:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Nu bruger du muligvis ikke RSA-tasten: hvis ssh
fortæller dig
ECDSA nøglefingeraftryk er SHA256: XXXXX
Du skal bruge /etc/ssh/ssh_host_ecdsa_key.pub
i stedet. (bemærk _ecdsa_ ). En mere universel kommando, der viser alle nøgler, kan således konstrueres ( kilde ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
Du kan skrive listen ned, når du opretter serveren, til fremtidig reference.En anden mulighed er at gemme dem i DNS-poster
Fra ssh-keygen (1) manpage:
-l
Vis fingeraftryk for den specificerede offentlige nøglefil. For RSA- og DSA-nøgler forsøger ssh-keygen at finde den matchende offentlige nøglefil og udskriver sit fingeraftryk. Hvis det kombineres med -v, leveres en visuel ASCII-kunstrepræsentation af nøglen med fingeraftrykket.
-f
filename
Angiver filnavnet på nøglefilen.
ssh-keygen -l -f - <(ssh-keyscan host)
dog?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
fungerer meget som forventet i ssh-keygen 7.2 og derover. Det producerer nogle kommentarlinjer til STDERR, der kan filtreres ud, som nævnt i svaret er af Anthony Geoghegan ellerssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Hvis du vil have det i det gamle format, skal du levere-E md5
og du ‘ vil se noget som2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.