SSH sunucusu anahtar parmak izini alın


82

Kimlik doğrulaması yapmadan programlı bir SSH sunucusu anahtar parmak izi edinmenin bir yolu var mı ?

Deniyorum ssh -v user@host false 2>&1 | grep "Server host key", ancak anahtar temelli auth ayarlanmadıysa bu şifre beklemede kalıyor.

Yanıtlar:


71

Bunu ssh-keyscanve ssh-keygenaşağıdakileri birleştirerek yapabilirsiniz :

$ 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

(ne yazık ki çok daha basit ssh-keyscan host | ssh-keygen -l -f /dev/stdinçalışmıyor)


1
Belki de ssh-keygen -l -f - <(ssh-keyscan host)öyle mi?
CVn

21
OpenSSH> = 7.2 ssh- ssh-keyscan host | ssh-keygen -lf -
keyscan

1
Sadece yapın:ssh-keygen -l -f <(ssh-keyscan host)
Christopher,

1
Bu, POSIX kabuğunun desteklemediği bir kabuğa bağlı olduğundan, kabuk komut dosyaları için oldukça kötü bir ifadedir.
Andreas Wiese

2
ssh-keygen -l -f -ssh-keygen 7.2 ve üzeri sürümlerde beklendiği gibi çalışır. Anthony Geoghegan ya dassh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Cedric Knight

56

Son zamanlarda bunu kendim yapmak zorunda kaldım, bu yüzden proses ikameini kullanarak bir satırda bunun ( OpenSSH 7.2 veya daha yeni sürümlerle) nasıl yapılabileceğini gösteren bir cevap ekleyeceğimi düşündüm :

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

Aşağıdaki metin, bu komutların nasıl çalıştığını açıklar ve OpenSSH yardımcı programlarının eski ve daha yeni sürümleri arasındaki davranış farklarından bazılarını vurgular.

Genel ana bilgisayar anahtarlarını al

ssh-keyscanKullanıcıların SSH sunucusuna kimlik gerek kalmadan kamu konak anahtarlarını elde edebileceği şekilde komut geliştirildi. Man sayfasından:

ssh-keyscanbir dizi ana bilgisayarın genel ssh ana bilgisayar anahtarlarını toplamak için bir yardımcı programdır. ssh_known_hostsDosyaların oluşturulmasına ve doğrulanmasına yardımcı olmak için tasarlanmıştır .

Anahtar türü

Alınacak anahtarın türü, -tseçenek kullanılarak belirlenir .

  • rsa1 (eski SSH Protokolü sürüm 1)
  • rsa
  • dsa
  • ecdsa (OpenSSH'nin son sürümleri)
  • ed25519 (OpenSSH'nin son sürümleri)

Modern OpenSSH sürümlerinde alınacak varsayılan anahtar türleri rsa (sürüm 5.1'den beri), ecdsa(sürüm 6.0'dan beri) ve ed25519(sürüm 6.7'den beri).

İle eski sürümleri arasında ssh-keyscan(OpenSSH sürümü 5.1 öncesi), varsayılan anahtar türü demode olduğunu rsa1açıkça belirtilmiş olması gerekir (SSH Protokolü 1) böylece anahtar türleri:

ssh-keyscan -t rsa,dsa hostname

Base64 tuşlarının parmak izi değerlerini alın

ssh-keyscanSSH sunucusunun ana bilgisayar anahtarını Base64 kodlu biçimde basar . Bunu bir parmak izi karmağına dönüştürmek için, ssh-keygenyardımcı program -lbelirtilen ortak anahtarın parmak izini yazdırma seçeneği ile birlikte kullanılabilir .

Bash, Zsh (veya Korn kabuğu) kullanıyorsanız, işlem ikame kullanışlı bir tek astar için kullanılabilir:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

Not : 7.2'den önceki OpenSSH sürümlerinde, ssh-keygendosyaları okumak için kullanılan işlevler , adlandırılmış yöneltmeler (FIFO'lar) çok iyi işleyemedi, bu nedenle bu yöntem işe yaramazdı, bu nedenle geçici dosyaların kullanılmasını gerektiriyordu.

Karma algoritmalar

Anahtarların son SHA256 parmak izi karelerini ssh-keygenyazdırma sürümleri . Sunucu anahtarı parmak izlerinin (eski davranış) MD5 karmasını elde etmek için , seçenek karma algoritmasını belirtmek için kullanılabilir:-E

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

Bir boru hattı kullanarak

dashİşlem değiştirme özelliğine sahip olmayan bir POSIX kabuğu (örneğin ) kullanıyorsanız, geçici dosyaları kullanan diğer çözümler işe yarayacaktır. Bununla birlikte, OpenSSH'nin daha yeni sürümleriyle (7.2'den beri), tek satırlık bir boru hattı komutuna izin veren standart giriş akışı için bir dosya adı olarak ssh-keygenkabul edeceğinden basit bir boru hattı kullanılabilir -.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -

Güzel ve kapsamlı bir cevap, bu kesinlikle geçici bir dosyaya sahip olmaktan iyidir! Sabırsız insanlara daha hızlı bulmalarını sağlamak için işlem yerine koyma versiyonuyla birlikte başlangıçta bir TL sağlamanızı tavsiye edebilir miyim? :)
goncalopp

3
Ubuntu 14.04 LTS üzerinde çalışıyor gibi görünmüyor; "/ Dev / fd / 63 ortak anahtar dosyası değil" hatası alıyorum. Alt işlem çalışıyor.
Melle

@melleb Erişebileceğim bir 12.04 sisteminde de aynı şeyi buldum. Ben şüpheli ssh-keygenOpenSSH eski sürümlerine FIFO / adlı kanal okunurken bir sorun var. Biraz boş zamanlarımda buna bakacağım (ve cevabımı güncelleyeceğim).
Anthony Geoghegan

3
@melleb Çok uzun zamanımı çeşitli kaynak kod bültenleri indirerek ve hata ayıklama printfifadelerini do_fingerprint()fonksiyona ekleyerek harcadıktan sonra , OpenSSH'nin 7.2'den önceki sürümlerinde, ssh-keygendosyaları okumak için kullanılan işlevlerin , adlandırılmış yöneltmeler (FIFO'lar) çok iyi işleyemediğini öğrendim. işlem değiştirme yöntemi işe yaramaz.
Anthony Geoghegan

Bu işe yarar, ancak bir parmak izini doğrulamak için kullanıyorsanız, kullanıcılar bir yarış koşulu bulunduğunun farkında olmalıdır: Bu komutla kontrol ettiğiniz parmak izinin, ssh'yi çağırmadan önce anahtarı terketmediğiniz sürece, getirdiğiniz anahtarınki olması gerekmez. üzerine keygen.
CodeGnome

20

nmapssh-hostkeybetiği kullanarak bu yeteneği sağlar .

Anahtarın onaltılık parmak izini döndürmek için:

$ nmap [SERVER] --script ssh-hostkey

Anahtarın içeriğini döndürmek için:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

Anahtarın görsel balonunu geri göndermek için

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

Yukarıdakilerin tümünü iade etmek için:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

Kaynak: nmap docs


3
Bu örnekler SSH'nin her zaman 22 numaralı bağlantı noktasında çalıştığını mı varsayıyor? Ssh standart olmayan bir bağlantı noktasında dinlerse ne olur?
Martin Vegter

3
@MartinVegter (yorum yapamayacağını Guarin42, başka sözcüklerle :) nmap vardır -pörneğin bir bağlantı noktası belirtebilirsiniz seçeneği -p 22000. -vv
Ayrıntıları

2

filezilla , md5 ile şifrelenmiş anahtarları onaltılık biçimde görüntüler.

ubuntu linux makinenizde bunu bulmak için bu komutu kullanın:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

not: "localhost" yerine, kontrol etmek istediğiniz makinenin ipini değiştirin.


1

İşte bir kabuk betiği (çoğunlukla Bourne kabuğu, ancak localen modern şekilde kullanılabilen anahtar sözcüğü kullanarak /bin/sh) bunu yapmak için yazdım. Gibi kullanın ssh-hostkey hostname. Verilen ana bilgisayar adı veya IP adresi için tüm ana bilgisayar anahtarları için sha256 ve md5 biçiminde parmak izlerini gösterir. Ayrıca , yalnızca " md5" veya " sha256" ifadesini, yalnızca bu belirli formatı gösterecek ikinci argüman olarak da belirleyebilirsiniz.

Eski OpenSSH paketleriyle uyumlu hale getirmek için boru yerine geçici bir dosya kullanır (diğer cevaplarda açıklandığı gibi). Geçici dosya /dev/shmvarsa (paylaşılan hafıza) kullanır .

#!/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 "$@"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.