Finns det ett sätt att programmera få ett SSH-servernyckelfingeravtryck utan att autentisera till det?
Jag försöker ssh -v user@host false 2>&1 | grep "Server host key"
, men det här väntar på ett lösenord om nyckelbaserad autentisering inte är inställd.
Svar
Du kan göra detta genom att kombinera ssh-keyscan
och 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
(tyvärr fungerar den mycket enklare ssh-keyscan host | ssh-keygen -l -f /dev/stdin
inte)
Kommentarer
Svar
Jag var nyligen tvungen att göra det själv så jag trodde att jag skulle lägga till ett svar som visar hur detta kan göras (med versioner av OpenSSH 7.2 eller nyare ) på en rad med processersättning:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Följande text förklarar hur dessa kommandon fungerar och belyser några av skillnaderna i beteende mellan äldre och nyare versioner av OpenSSH-verktygen.
Hämta offentliga värdnycklar
Kommandot ssh-keyscan
har utvecklats så att användare kan få offentliga värdnycklar utan att behöva autentisera till SSH-servern. Från sin mansida:
ssh-keyscan
är ett verktyg för att samla de offentliga ssh-värdnycklarna för ett antal värdar. Den var utformad för att hjälpa till att bygga och verifierassh_known_hosts
filer.
Nyckeltyp
Typ av nyckel som ska hämtas anges med alternativet -t
.
-
rsa1
(föråldrad SSH-protokoll version 1) -
rsa
-
dsa
-
ecdsa
(senaste versioner av OpenSSH) -
ed25519
(senaste versioner av OpenSSH)
I moderna OpenSSH-utgåvor är standard nyckeltyper som ska hämtas rsa
(sedan version 5.1), ecdsa
(sedan version 6.0) och ed25519
(sedan version 6.7).
Med äldre versioner av ssh-keyscan
(före OpenSSH version 5.1) var nyckeltypens standard föråldrad rsa1
(SSH Protocol 1) nyckeltyperna måste specifikt anges:
ssh-keyscan -t rsa,dsa hostname
Få fingeravtryckshashar av Base64-tangenter
ssh-keyscan
skriver ut värdnyckeln för SSH-servern i Base64-kodat format. För att konvertera detta till en fingeravtryckshash kan verktyget ssh-keygen
användas med alternativet -l
för att skriva ut fingeravtrycket för den angivna offentliga nyckeln.
Om du använder Bash, Zsh (eller Korn-skalet) kan processbyte användas för en praktisk one-liner:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Obs : Med versioner av OpenSSH före 7.2 används de funktioner som ssh-keygen
läser filer, hanterade inte namngivna rör (FIFO) särskilt bra så den här metoden skulle inte fungera, vilket kräver användning av tillfälliga filer.
Hashing-algoritmer
Senaste versioner av ssh-keygen
skriv ut SHA256 fingeravtryckshash av tangenterna. För att få MD5 hash av servernyckelns fingeravtryck (det gamla beteendet), -E
kan användas för att ange hashalgoritmen:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Använda en pipeline
Om du använder ett POSIX-skal (som dash
) som inte har processersättning, de andra lösningarna som använder temporära filer fungerar. Men med nyare versioner av OpenSSH (sedan 7.2) kan en enkel pipeline användas eftersom ssh-keygen
accepterar -
som ett filnamn för standardinmatningsflöde, vilket möjliggör ett pipeline-kommando med en rad.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Kommentarer
- Trevligt och grundligt svar, det här är verkligen bättre än att ha en tillfällig fil!Får jag föreslå att du tillhandahåller en TL; DR i början med versionen av processersättning, för att få otåliga människor att hitta det snabbare? 🙂
- Verkar inte fungera på Ubuntu 14.04 LTS; Jag får ett fel ” / dev / fd / 63 är inte en offentlig nyckelfil ”. Underprocessen fungerar.
- @melleb Jag hittade samma sak på ett 12.04-system som jag har tillgång till. Jag misstänker att
ssh-keygen
från äldre versioner av OpenSSH har problem med att läsa från FIFO / namnet pipe. Jag ’ Jag kommer att undersöka detta (och uppdatera mitt svar) när jag får lite ledig tid. - @melleb Efter att ha spenderat min tid på att ladda ner olika källkodsreleaser och infogade debugging
printf
-uttalanden ido_fingerprint()
-funktionen fann jag att med versioner av OpenSSH före 7.2, användes funktionerna avssh-keygen
för att läsa filer, hanterade inte namngivna rör (FIFO) mycket bra så processersättningsmetoden skulle inte fungera. - Det fungerar, men om du använder det för att verifiera ett fingeravtryck, användare bör vara medvetna om att det ’ ett race-tillstånd: fingeravtrycket du kontrollerar med det här kommandot är inte ’ t nödvändigtvis det för den nyckel du hämta, såvida du inte släpper nyckeln innan du ringer till ssh-keygen på den.
Svar
nmap
ger denna möjlighet genom att använda skriptet ssh-hostkey
.
För att returnera nyckelns hexadecimala fingeravtryck:
$ nmap [SERVER] --script ssh-hostkey
För att returnera nyckelns innehåll:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
För att returnera nyckelns visuella bubbla
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
För att returnera allt ovanstående:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Källa: nmap docs
Kommentarer
- Antar dessa exempel att SSH alltid körs på port 22? Vad händer om ssh lyssnar på en icke-standardport?
- @MartinVegter (omskrivning av Guarin42, vem kunde inte ’ t kommentar 🙂 nmap har alternativet
-p
som kan ange en port, t.ex.-p 22000
. ’ är också möjligt att använda alternativet-vv
för att öka informationen (mängd information som ges)
Svar
filezilla visar nycklar hashad med md5 i hexadecimal -format.
för att hitta detta på din ubuntu linux använder detta kommando:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
Obs: ersätt ”localhost” med IP-adressen för den maskin du vill kontrollera.
Kommentarer
- Detta fungerade för mig på Ubuntu 18, men notera, du får skillnadsresultat för
localhost
127.0.0.1
ellerdomain.tld
. Kontrollera fingeravtrycket för den webbadress du är intresserad av ~!
Svar
Här är ett skalskript (främst Bourne-skal men använder local
nyckelord, som finns i de modernaste /bin/sh
) Jag har skrivit för att göra detta. Använd det som ssh-hostkey hostname
. Det kommer att visa både fingeravtryck i formatet sha256 och md5 för alla värdnycklar för det angivna värdnamnet eller IP-adressen. Du kan också ange ”md5
”eller” sha256
”som det andra argumentet för att bara visa det specifika formatet.
Den använder en tillfällig fil istället för piping för att göra den kompatibel med äldre OpenSSH-paket (som beskrivs i andra svar.) Den tillfälliga filen använder /dev/shm
(delat minne) om tillgängligt.
#!/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
- Det här är en trevlig demo av att lägga in verktyg på lägre nivå med kommandoradsalternativ. Inkluderar en bonus på hur man använder delat minne
/dev/shm
som jag aldrig visste var så bekvämt att göra. Tack för delning !
Svar
För min egen server använder jag det här:
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 enkla svaret när du redan har åtkomst till servern är:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Nu kanske du inte använder RSA-tangenten: om du ansluter, ssh
berättar
ECDSA nyckelfingeravtrycket är SHA256: XXXXX
Du måste använda /etc/ssh/ssh_host_ecdsa_key.pub
istället. (meddelande _ecdsa_ ). Ett mer universellt kommando som listar alla nycklar kan således konstrueras ( källa ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
Du kan skriva ner listan när du ställer in servern för framtida referens.Ett annat alternativ är att lagra dem i DNS-poster
Från manusidan ssh-keygen (1):
-l
Visa fingeravtryck för angiven offentlig nyckelfil. För RSA- och DSA-nycklar försöker ssh-keygen hitta den matchande publika nyckelfilen och skriver ut sitt fingeravtryck. Om den kombineras med -v levereras en visuell ASCII-konstrepresentation av nyckeln med fingeravtrycket.
-f
filename
Anger filnamnet på nyckelfilen.
ssh-keygen -l -f - <(ssh-keyscan host)
dock?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
fungerar mycket som förväntat i ssh-keygen 7.2 och högre. Det ger några kommentarrader till STDERR som kan filtreras bort, som nämnts i svaret er av Anthony Geoghegan ellerssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Om du vill ha det i det gamla formatet, ange-E md5
och du ’ ser något som2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.