Is er een manier om programmatisch een vingerafdruk van de SSH-serversleutel te verkrijgen zonder em te verifiëren > naar het?
Ik “probeer ssh -v user@host false 2>&1 | grep "Server host key"
, maar dit blijft hangen terwijl ik wacht op een wachtwoord als key based auth niet is ingesteld.
Answer
Je zou dit kunnen doen door ssh-keyscan
en 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
(helaas werkt het veel eenvoudigere ssh-keyscan host | ssh-keygen -l -f /dev/stdin
niet)
Reacties
Antwoord
Ik moest dit onlangs zelf doen, dus ik dacht dat ik zou een antwoord toevoegen dat laat zien hoe dit gedaan kan worden (met versies van OpenSSH 7.2 of nieuwer ) op één regel met behulp van procesvervanging:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
De volgende tekst legt uit hoe deze commandos werken en belicht enkele van de verschillen in gedrag tussen oudere en nieuwere versies van de OpenSSH-hulpprogrammas.
Openbare hostsleutels ophalen
Het ssh-keyscan
commando is ontwikkeld zodat gebruikers publieke hostsleutels kunnen verkrijgen zonder zich te hoeven authenticeren bij de SSH-server. Van zijn man-pagina:
ssh-keyscan
is een hulpprogramma voor het verzamelen van de openbare ssh-hostsleutels van een aantal gastheren. Het is ontworpen om te helpen bij het bouwen en verifiëren vanssh_known_hosts
bestanden.
Sleuteltype
Het type sleutel dat moet worden opgehaald, wordt gespecificeerd met behulp van de -t
optie.
-
rsa1
(verouderd SSH-protocolversie 1) -
rsa
-
dsa
-
ecdsa
(recente versies van OpenSSH) -
ed25519
(recente versies van OpenSSH)
In moderne OpenSSH-releases zijn de standaard sleuteltypes die moeten worden opgehaald rsa
(sinds versie 5.1), ecdsa
(sinds versie 6.0), en ed25519
(sinds versie 6.7).
Met oudere versies van ssh-keyscan
(vóór OpenSSH versie 5.1), het standaard sleuteltype was het verouderde rsa1
(SSH-protocol 1) dus de sleuteltypen moeten expliciet worden gespecificeerd:
ssh-keyscan -t rsa,dsa hostname
Vingerafdruk-hashes van Base64-sleutels ophalen
ssh-keyscan
drukt de hostsleutel van de SSH-server af in Base64-gecodeerd formaat. Om dit naar een vingerafdrukhash te converteren, kan het ssh-keygen
hulpprogramma worden gebruikt met zijn -l
optie om de vingerafdruk van de opgegeven openbare sleutel af te drukken.
Als je Bash, Zsh (of de Korn-shell) gebruikt, kan processubstitutie worden gebruikt voor een handige one-liner:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Opmerking : met versies van OpenSSH vóór 7.2, de functies gebruikt door ssh-keygen
om te lezen bestanden, behandelde named pipes (FIFOs) niet erg goed, dus deze methode zou niet werken, waardoor het gebruik van tijdelijke bestanden nodig was.
Hashing-algoritmen
Recente versies van ssh-keygen
print SHA256 vingerafdruk-hashes van de sleutels. Om MD5 hashes van de serversleutelvingerafdrukken te krijgen (het oude gedrag), de -E
optie kan worden gebruikt om het hash-algoritme te specificeren:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Een pijplijn gebruiken
Als een POSIX-shell wordt gebruikt (zoals dash
) die geen procesvervanging biedt, zullen de andere oplossingen die tijdelijke bestanden gebruiken, werken. Met nieuwere versies van OpenSSH (sinds 7.2) kan echter een eenvoudige pijplijn worden gebruikt aangezien ssh-keygen
-
als bestandsnaam voor de standaard invoerstroom, waardoor een pijplijnopdracht van één regel mogelijk is.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Reacties
- Mooi en grondig antwoord, dit is zeker beter dan een tijdelijk bestand!Mag ik u aanraden om in het begin een TL; DR op te geven met de procesvervangingsversie, zodat ongeduldige mensen het sneller vinden? 🙂
- Lijkt niet te werken op Ubuntu 14.04 LTS; Ik krijg een foutmelding ” / dev / fd / 63 is geen bestand met openbare sleutel “. Het subproces werkt.
- @melleb Ik vond hetzelfde op een 12.04-systeem waartoe ik toegang heb. Ik vermoed dat
ssh-keygen
van oudere versies van OpenSSH problemen heeft met het lezen van de FIFO / named pipe. Ik ‘ zal dit onderzoeken (en mijn antwoord bijwerken) wanneer ik wat vrije tijd krijg. - @melleb Na mijn lange tijd besteed te hebben aan het downloaden van verschillende broncode-releases en het invoegen van debugging
printf
statements in dedo_fingerprint()
functie, ik ontdekte dat met versies van OpenSSH vóór 7.2, de functies gebruikt doorssh-keygen
om bestanden te lezen, behandelde named pipes (FIFOs) niet erg goed, dus de procesvervangingsmethode zou niet werken. - Dit werkt, maar als je het gebruikt om een vingerafdruk te verifiëren, gebruikers moeten zich ervan bewust zijn dat er ‘ een racevoorwaarde is: de vingerafdruk die u controleert met deze opdracht is niet ‘ die van de sleutel die u fetch, tenzij je de sleutel dump voordat je ssh-keygen erop aanroept.
Answer
nmap
biedt deze mogelijkheid door het ssh-hostkey
-script te gebruiken.
Om de hexadecimale vingerafdruk van de sleutel terug te geven:
$ nmap [SERVER] --script ssh-hostkey
Om de inhoud van de sleutel terug te geven:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Om de visuele ballon van de sleutel terug te geven
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
Om al het bovenstaande te retourneren:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Bron: nmap docs
Opmerkingen
- Gaan deze voorbeelden aan dat SSH altijd op poort 22 draait? Wat als ssh luistert op een niet-standaard poort?
- @MartinVegter (parafraseert Guarin42, wie kon ‘ t comment 🙂 nmap heeft de
-p
optie die een poort kan specificeren, bijv.-p 22000
. ‘ s is ook mogelijk om de-vv
optie te gebruiken om de breedsprakigheid (hoeveelheid gegeven informatie) te vergroten
Answer
filezilla toont sleutels gehasht met md5 in hexadecimaal formaat.
om dit op uw ubuntu linux machine te vinden, gebruikt u dit commando:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
opmerking: vervang “localhost” door het ip-adres van de machine die u wilt controleren.
Opmerkingen
- Dit werkte voor mij op Ubuntu 18, maar let op, je krijgt verschilresultaten voor
localhost
127.0.0.1
ofdomain.tld
. Controleer de vingerafdruk voor de URL waar u zich zorgen over maakt ~!
Answer
Hier is een shellscript (voornamelijk Bourne-shell maar met behulp van local
sleutelwoord, dat beschikbaar is in de meeste moderne /bin/sh
) die ik heb geschreven om dit te doen. Gebruik het als ssh-hostkey hostname
. Het toont zowel de sha256- als de md5-vingerafdrukken voor alle hostsleutels voor de opgegeven hostnaam of het opgegeven IP-adres. U kunt ook handmatig “md5
specificeren “of” sha256
“als het tweede argument om alleen dat specifieke formaat weer te geven.
Het gebruikt een tijdelijk bestand in plaats van piping om het compatibel te maken met oudere OpenSSH-pakketten (zoals beschreven in andere antwoorden). Het tijdelijke bestand gebruikt /dev/shm
(gedeeld geheugen) indien beschikbaar.
#!/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 "$@"
Opmerkingen
- Dit is een mooie demo van het verpakken van tools op een lager niveau met opdrachtregelopties. Bevat een bonus voor het gebruik van gedeeld geheugen
/dev/shm
waarvan ik nooit wist dat het zo handig was om te doen. Bedankt voor het delen !
Antwoord
Voor mijn eigen server gebruik ik dit:
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)
Antwoord
Het simpele antwoord als je al toegang hebt naar de server is:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Het kan zijn dat je de RSA-sleutel niet gebruikt: als bij het verbinden, ssh
vertelt je
ECDSA sleutelvingerafdruk is SHA256: XXXXX
U moet in plaats daarvan /etc/ssh/ssh_host_ecdsa_key.pub
gebruiken. (opmerking _ecdsa_ ). Een meer universele opdracht die alle sleutels opsomt, kan dus worden geconstrueerd ( source ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
U kunt de lijst noteren bij het opzetten van de server, voor toekomstig gebruik.Een andere optie is om op te slaan in DNS-records
Van de manpage ssh-keygen (1):
-l
Vingerafdruk van opgegeven bestand met openbare sleutel weergeven. Voor RSA- en DSA-sleutels probeert ssh-keygen het overeenkomende openbare sleutelbestand te vinden en drukt zijn vingerafdruk af. Indien gecombineerd met -v, wordt een visuele ASCII-kunstweergave van de sleutel geleverd met de vingerafdruk.
-f
filename
Specificeert de bestandsnaam van het sleutelbestand.
ssh-keygen -l -f - <(ssh-keyscan host)
dat wel?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
werkt zoals verwacht in ssh-keygen 7.2 en hoger. Het produceert enkele commentaarregels naar STDERR die kunnen worden uitgefilterd, zoals vermeld in het antwoord er door Anthony Geoghegan ofssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Als je het in het oude formaat wilt, geef dan-E md5
op en je ‘ zal iets zien als2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.