Existuje způsob, jak programově získat otisk klíče serveru SSH bez ověření na to?
Snažím se ssh -v user@host false 2>&1 | grep "Server host key"
, ale čeká na heslo, pokud není nastaveno ověřování pomocí klíče.
Odpověď
Toho lze dosáhnout kombinací ssh-keyscan
a 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
(bohužel mnohem jednodušší ssh-keyscan host | ssh-keygen -l -f /dev/stdin
nefunguje)
Komentáře
Odpověď
Nedávno jsem to musel udělat sám, takže jsem si myslel, že Přidejte odpověď, která ukazuje, jak toho lze dosáhnout (s verzemi OpenSSH 7.2 nebo novější ) v jednom řádku pomocí substituce procesu:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Následující text vysvětluje, jak tyto příkazy fungují, a zdůrazňuje některé rozdíly v chování mezi starší a novější verzí obslužných programů OpenSSH.
Načíst veřejné klíče hostitele
Příkaz ssh-keyscan
byl vyvinut tak, aby uživatelé mohli získat veřejné klíče hostitele, aniž by se museli ověřovat na serveru SSH. Z jeho manuálové stránky:
ssh-keyscan
je nástroj pro shromažďování veřejných ssh hostitelských klíčů řady hostitelé. Byl navržen jako pomůcka při vytváření a ověřováníssh_known_hosts
souborů.
Typ klíče
Typ klíče, který se má načíst, se zadává pomocí možnosti -t
.
-
rsa1
(zastaralé) Protokol SSH verze 1) -
rsa
-
dsa
-
ecdsa
(nejnovější verze OpenSSH) -
ed25519
(nejnovější verze OpenSSH)
V moderních verzích OpenSSH jsou výchozí typy klíčů, které mají být načteny, rsa
(od verze 5.1), ecdsa
(od verze 6.0) a ed25519
(od verze 6.7).
Se staršími verzemi ssh-keyscan
(před OpenSSH verze 5.1), výchozí typ klíče byl zastaralý rsa1
(protokol SSH 1), takže typy klíčů by musely být výslovně specifikovány:
ssh-keyscan -t rsa,dsa hostname
Získejte hash otisků klíčů Base64
ssh-keyscan
vytiskne klíč hostitele serveru SSH v Formát kódovaný Base64 . Chcete-li toto převést na hash otisku prstu, lze k vytištění otisku zadaného veřejného klíče použít nástroj ssh-keygen
s možností -l
.
Pokud používáte Bash, Zsh (nebo shell Korn), lze pro praktickou jednorázovou linii použít náhradu procesu :
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Poznámka : U verzí OpenSSH před 7.2 jsou funkce, které ssh-keygen
používá ke čtení soubory, nezvládal pojmenované kanály (FIFO) velmi dobře, takže tato metoda nefungovala, což vyžadovalo použití dočasných souborů.
Algoritmy hashování
Nedávné verze ssh-keygen
print SHA256 otisky prstů klíčů. Chcete-li MD5 hash klíčových otisků serveru (staré chování), použijte -E
:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Použití kanálu
Pokud použijete prostředí POSIX (například dash
), který neobsahuje náhradu procesu, ostatní řešení využívající dočasné soubory budou fungovat. U novějších verzí OpenSSH (od 7.2) však lze použít jednoduchý kanál, protože ssh-keygen
přijme -
jako název souboru pro standardní vstupní proud, který umožňuje jednorázový příkaz potrubí.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Komentáře
- Pěkné a důkladné odpověď, to je určitě lepší než mít dočasný soubor!Mohu navrhnout, abyste poskytli TL; DR na začátku s verzí substituce procesu, aby ji netrpěliví lidé našli rychleji? 🙂
- Nezdá se, že by fungoval na Ubuntu 14.04 LTS; Zobrazuje se mi chyba “ / dev / fd / 63 není soubor veřejného klíče „. Subproces funguje.
- @melleb Našel jsem totéž v systému 12.04, ke kterému mám přístup. Mám podezření, že
ssh-keygen
ze starších verzí OpenSSH má problém se čtením z kanálu FIFO / named. Až se dostanu do volného času, ‚ se na to podívám (a aktualizuji svou odpověď). - @melleb Poté, co jsem strávil čas stažením různých vydání zdrojového kódu a vložením ladicích
printf
příkazů do funkcedo_fingerprint()
jsem zjistil, že u verzí OpenSSH před 7.2 jsou funkce používanéssh-keygen
ke čtení souborů nezvládl pojmenované kanály (FIFO) velmi dobře, takže metoda náhrady procesu nebude fungovat. - Funguje to, ale pokud ji použijete k ověření otisku prstu, uživatelé by si měli být vědomi toho, že ‚ sa podmínka závodu: otisk prstu, který kontrolujete pomocí tohoto příkazu, není nutně ‚ klíčem, který používáte načíst, pokud nevyložíte klíč, než na něj zavoláte ssh-keygen.
Odpovědět
poskytuje tuto schopnost pomocí skriptu ssh-hostkey
.
Chcete-li vrátit šestnáctkový otisk klíče:
$ nmap [SERVER] --script ssh-hostkey
Chcete-li vrátit obsah klíče:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Chcete-li vrátit vizuální bublinu klíče
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
Chcete-li vrátit všechny výše uvedené:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Zdroj: nmap docs
Komentáře
- Předpokládají tyto příklady, že SSH vždy běží na portu 22? Co když ssh poslouchá na nestandardním portu?
- @MartinVegter (parafrázuje Guarin42, kdo nemohl ‚ t komentář 🙂 nmap má možnost
-p
, která může specifikovat port, např.-p 22000
. ‚ je také možné použít možnost-vv
ke zvýšení výřečnosti (množství poskytovaných informací)
Odpověď
filezilla zobrazuje klíče hashované s md5 v hexadecimálním tvaru formát.
Chcete-li to najít na svém počítači ubuntu linux , použijte tento příkaz:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
poznámka: nahraďte „localhost“ IP zařízením, které chcete zkontrolovat.
Komentáře
- Toto fungovalo pro mě na Ubuntu 18, ale všimněte si, že získáte výsledky rozdílu pro
localhost
127.0.0.1
nebodomain.tld
. Zkontrolujte otisk prstu adresy URL, které vás zajímají ~!
Odpověď
Zde je skript prostředí (hlavně Bourne shell, ale používám klíčové slovo local
, které je k dispozici ve většině moderních /bin/sh
), které jsem k tomu napsal. Použijte jej jako ssh-hostkey hostname
. Zobrazí se otisky prstů ve formátu sha256 i md5 pro všechny klíče hostitele pro daný název hostitele nebo IP adresu. Můžete také ručně zadat „md5
„or“ sha256
„jako druhý argument pouze k zobrazení konkrétního formátu.
Aby byl kompatibilní se staršími balíčky OpenSSH, používá místo pipingu dočasný soubor. (jak je popsáno v jiných odpovědích). Dočasný soubor používá /dev/shm
(sdílená paměť), pokud je k dispozici.
#!/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 "$@"
Komentáře
- Toto je pěkná ukázka zabalení nástrojů nižší úrovně s možnostmi příkazového řádku. Zahrnuje bonus k použití sdílená paměť
/dev/shm
, o které jsem nikdy nevěděl, že je to tak pohodlné. Děkujeme za sdílení !
Odpověď
Pro svůj vlastní server používám toto:
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)
Odpověď
Jednoduchá odpověď , když již máte přístup na server je:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Nyní možná nepoužíváte klíč RSA: pokud při připojování, ssh
vám říká
ECDSA klíčový otisk prstu je SHA256: XXXXX
Místo toho musíte použít /etc/ssh/ssh_host_ecdsa_key.pub
. (upozornění _ecdsa_ ). Lze tedy sestavit univerzálnější příkaz se seznamem všech klíčů ( zdroj ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
Seznam můžete zapsat při nastavování serveru pro budoucí potřebu.Další možností je uložit je do záznamů DNS
Na stránce ssh-keygen (1):
-l
Zobrazit otisk zadaného souboru veřejného klíče. U klíčů RSA a DSA se ssh-keygen pokusí najít odpovídající soubor veřejného klíče a vytiskne jeho otisk prstu. Pokud je zkombinováno s -v, je s otiskem prstu dodávána vizuální ASCII umělecká reprezentace klíče.
-f
filename
Určuje název souboru klíče.
ssh-keygen -l -f - <(ssh-keyscan host)
ano?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
funguje s očekáváním v ssh-keygen 7.2 a novějších verzích. Produkuje několik řádků komentářů k STDERR, které lze odfiltrovat, jak je uvedeno v od Anthony Geoghegana nebossh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Pokud to chcete ve starém formátu, zadejte-E md5
a uvidíte ‚ něco jako2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.