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

  • Kanske gör ssh-keygen -l -f - <(ssh-keyscan host) dock?
  • OpenSSH > = 7.2 ssh-keyscan kan läsa från stdin: ssh-keyscan host | ssh-keygen -lf -
  • Gör bara: 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 eller ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Nya versioner av openssh (åtminstone 7.2) visar fingeravtrycket som SHA256 (ex: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Om du vill ha det i det gamla formatet, ange -E md5 och du ’ ser något som 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

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 verifiera ssh_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 i do_fingerprint() -funktionen fann jag att med versioner av OpenSSH före 7.2, användes funktionerna av ssh-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 eller domain.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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *