SSH सर्वर कुंजी फिंगरप्रिंट प्राप्त करें


82

क्या कोई ऐसा प्रोग्राम है जो इसे प्रमाणित किए बिना SSH सर्वर कुंजी फिंगरप्रिंट प्राप्त करने का एक तरीका है?

मैं कोशिश कर रहा हूँ ssh -v user@host false 2>&1 | grep "Server host key", लेकिन यदि कुंजी आधारित सेटअप सेटअप नहीं है तो यह पासवर्ड के इंतजार में लटका रहता है।

जवाबों:


71

आप संयोजन से ऐसा कर सकता है ssh-keyscanऔर 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

(दुर्भाग्य से बहुत सरल ssh-keyscan host | ssh-keygen -l -f /dev/stdinकाम नहीं करता है)


1
शायद ssh-keygen -l -f - <(ssh-keyscan host)करता है, हालांकि?
बजे एक CVn

21
OpenSSH> = 7.2 ssh-keycan स्टडिन से पढ़ने में सक्षम है:ssh-keyscan host | ssh-keygen -lf -
mykhal

1
बस करते हैं:ssh-keygen -l -f <(ssh-keyscan host)
क्रिस्टोफर

1
यह शेल स्क्रिप्ट के लिए एक बुरी अभिव्यक्ति है, क्योंकि यह एक शेल पर निर्भर करता है जो इसका समर्थन करता है, जो POSIX शेल नहीं करता है।
एंड्रियास विसे

2
ssh-keygen -l -f -ssh-keygen 7.2 और इसके बाद के संस्करण में अपेक्षा के अनुरूप काम करता है। यह STDERR के लिए कुछ टिप्पणी पंक्तियों का उत्पादन करता है जिसे फ़िल्टर किया जा सकता है, जैसा कि एंथोनी जोगेगन द्वारा उत्तर में उल्लेख किया गया हैssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
सेड्रिक नाइट

56

मुझे हाल ही में खुद ऐसा करना पड़ा था, इसलिए मैंने सोचा कि मैं एक उत्तर जोड़ूंगा जो दिखाता है कि यह कैसे किया जा सकता है ( ओपनएसएसएच 7.2 या नए संस्करण के साथ ) प्रक्रिया प्रतिस्थापन का उपयोग करके एक पंक्ति में:

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

निम्न पाठ बताता है कि ये कमांड कैसे काम करते हैं और ओपनएसएसएच उपयोगिताओं के पुराने और नए संस्करणों के बीच व्यवहार के कुछ अंतरों को उजागर करते हैं।

सार्वजनिक होस्ट कुंजी प्राप्त करें

ssh-keyscanआदेश विकसित किया गया था, ताकि उपयोगकर्ताओं को SSH सर्वर से प्रमाणित करने की जरूरत के बिना सार्वजनिक मेजबान कुंजियों को प्राप्त कर सकते हैं। इसके मैन पेज से:

ssh-keyscanकई मेजबानों की सार्वजनिक ssh होस्ट कीज़ को इकट्ठा करने की उपयोगिता है। इसे ssh_known_hostsफ़ाइलों के निर्माण और सत्यापन में सहायता के लिए डिज़ाइन किया गया था ।

मुख्य प्रकार से

कुंजी के प्रकार को -tविकल्प का उपयोग करके निर्दिष्ट किया जाता है।

  • rsa1 (अप्रचलित SSH प्रोटोकॉल संस्करण 1)
  • rsa
  • dsa
  • ecdsa (ओपनएसएसएच के हाल के संस्करण)
  • ed25519 (ओपनएसएसएच के हाल के संस्करण)

आधुनिक OpenSSH विज्ञप्ति में, डिफ़ॉल्ट कुंजी प्रकार प्राप्त किया जा करने के लिए कर रहे हैं rsa (के बाद से संस्करण 5.1), ecdsa(के बाद से संस्करण 6.0), और ed25519(संस्करण 6.7 के बाद से)।

साथ पुराने संस्करणों की ssh-keyscan(OpenSSH संस्करण 5.1 से पहले), डिफ़ॉल्ट कुंजी प्रकार बाहर दिनांकित था rsa1(SSH प्रोटोकॉल 1) तो कुंजी प्रकार स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी:

ssh-keyscan -t rsa,dsa hostname

Base64 कुंजियों का फ़िंगरप्रिंट हैश प्राप्त करें

ssh-keyscanBaseH- एन्कोडेड प्रारूप में SSH सर्वर की होस्ट कुंजी प्रिंट करता है । इसे फिंगरप्रिंट हैश में बदलने के लिए, ssh-keygenउपयोगिता को इसके -lविकल्प के साथ निर्दिष्ट सार्वजनिक कुंजी के फिंगरप्रिंट को प्रिंट करने के लिए इस्तेमाल किया जा सकता है ।

यदि बैश, जेडश (या कोर्न शेल) का उपयोग किया जाता है , तो प्रक्रिया प्रतिस्थापन का उपयोग एक आसान वन-लाइनर के लिए किया जा सकता है:

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

नोट : 7.2% से पहले ओपनएसएसएच के संस्करणों के साथ, ssh-keygenफ़ाइलों को पढ़ने के लिए उपयोग किए जाने वाले फ़ंक्शन , पाइप नाम (FIFOs) को बहुत अच्छी तरह से संभाल नहीं करते थे, इसलिए यह विधि काम नहीं करेगी, इस प्रकार अस्थायी फ़ाइलों के उपयोग की आवश्यकता होती है।

हैशिंग एल्गोरिदम

हाल ही में SHA256 फ़िंगरप्रिंट हैश की चाबियों के ssh-keygenप्रिंट संस्करण । सर्वर कुंजी फिंगरप्रिंट (पुराने व्यवहार) के एमडी 5 हैश पाने के लिए, हैश एल्गोरिथ्म को निर्दिष्ट करने के लिए विकल्प का उपयोग किया जा सकता है:-E

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

एक पाइपलाइन का उपयोग करना

यदि POSIX शेल (जैसे कि dash) का उपयोग किया जाए, जिसमें प्रक्रिया प्रतिस्थापन की सुविधा नहीं है, तो अस्थायी फ़ाइलों का उपयोग करने वाले अन्य समाधान काम करेंगे। हालांकि, ओपनएसएसएच (7.2 के बाद से) के नए संस्करणों के साथ, एक सरल पाइपलाइन का उपयोग किया जा सकता है क्योंकि मानक इनपुट स्ट्रीम के लिए एक फ़ाइल नाम के रूप में ssh-keygenस्वीकार करेगा -, एक लाइन पाइपलाइन कमांड की अनुमति देता है।

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

अच्छा और पूरी तरह से जवाब, यह निश्चित रूप से एक अस्थायी फ़ाइल होने से बेहतर है! क्या मेरा सुझाव है कि आप एक टीएल प्रदान करें? प्रक्रिया प्रतिस्थापन संस्करण के साथ शुरुआत में, अधीर लोगों को तेजी से खोजने के लिए? :)
गोनोकॉप्प

3
उबंटू 14.04 एलटीएस पर काम नहीं करता है; मुझे एक त्रुटि मिलती है "/ dev / fd / 63 एक सार्वजनिक कुंजी फ़ाइल नहीं है"। उपप्रकार काम करता है।
मेलले

@ मैलेब मुझे 12.04 सिस्टम पर वही चीज़ मिली जिसकी मुझे एक्सेस है। मुझे संदेह है कि ssh-keygenओपनएसएसएच के पुराने संस्करणों से एफआईएफओ / नामित पाइप से पढ़ने में समस्या है। जब मुझे कुछ खाली समय मिलेगा, तो मैं इस पर ध्यान दूंगा (और अपने उत्तर को अपडेट करूंगा)।
एंथोनी जोगेगन

3
@melleb अपने लुक-टाइम को विभिन्न स्रोत कोड रिलीज़ को डाउनलोड करने और फ़ंक्शन printfमें डिबगिंग स्टेटमेंट डालने के बाद do_fingerprint(), मैंने पाया कि ओपनएसएसएच के संस्करणों के साथ 7.2 से पहले, ssh-keygenफ़ाइलों को पढ़ने के लिए उपयोग किए जाने वाले फ़ंक्शंस , नामित पाइप (एफआईएफओ) को बहुत अच्छी तरह से नहीं संभालते थे प्रक्रिया प्रतिस्थापन विधि काम नहीं करेगी।
एन्थोनी गेघेगन

यह काम करता है, लेकिन अगर इसे फिंगरप्रिंट को सत्यापित करने के लिए उपयोग किया जाता है, तो उपयोगकर्ताओं को पता होना चाहिए कि एक दौड़ की स्थिति है: इस कमांड के साथ आप जिस फिंगरप्रिंट की जांच कर रहे हैं, जरूरी नहीं कि वह आपके द्वारा लाया गया हो, जब तक कि आप ssh को कॉल करने से पहले कुंजी को डंप न करें- इस पर keygen।
CodeGnome

20

nmapssh-hostkeyस्क्रिप्ट का उपयोग करके यह क्षमता प्रदान करता है ।

कुंजी का हेक्साडेसिमल फिंगरप्रिंट वापस करने के लिए:

$ nmap [SERVER] --script ssh-hostkey

कुंजी की सामग्री वापस करने के लिए:

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

कुंजी के दृश्य बुलबुले को वापस करने के लिए

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

उपरोक्त सभी वापस करने के लिए:

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

स्रोत: नैम्प डॉक्स


3
क्या ये उदाहरण मानते हैं कि SSH हमेशा पोर्ट 22 पर चल रहा है? क्या होगा यदि ssh एक गैर-मानक पोर्ट पर सुनता है?
मार्टिन वेग्टर

3
@MartinVegter (Guarin42 को paraphrasing, जो टिप्पणी नहीं कर सकता :) nmap में एक -pविकल्प है जो एक पोर्ट निर्दिष्ट कर सकता है, उदा -p 22000-vvवर्बोसिटी (दी गई जानकारी की मात्रा) को बढ़ाने के लिए विकल्प का उपयोग करना भी संभव है
गोनोकॉपॉप

2

फ़ाइलज़िला हेक्साडेसिमल प्रारूप में md5 के साथ हैशेड प्रदर्शित करता है ।

अपने ubuntu linux मशीन पर इसे खोजने के लिए इस कमांड का उपयोग करें:

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

नोट: "लोकलहोस्ट" को उस मशीन के आईपी से बदलें, जिसे आप चेक करना चाहते हैं।


1

यहां एक शेल स्क्रिप्ट है (मुख्य रूप से बॉर्न शेल लेकिन localकीवर्ड का उपयोग करके , जो कि सबसे आधुनिक में उपलब्ध है /bin/sh) मैंने ऐसा करने के लिए लिखा है। इसका उपयोग करें ssh-hostkey hostname। यह दिए गए होस्टनाम या आईपी पते के लिए सभी hostkeys के लिए sha256 और md5 प्रारूप फ़िंगरप्रिंट दोनों दिखाएगा। आप विशेष रूप से केवल उस विशेष प्रारूप को दिखाने के लिए दूसरे तर्क के रूप में " md5" या " sha256" मैन्युअल रूप से निर्दिष्ट कर सकते हैं ।

यह पुराने ओपनएसएसएच पैकेज (जैसा कि अन्य उत्तरों में वर्णित है) के साथ संगत बनाने के लिए पाइपिंग के बजाय एक अस्थायी फ़ाइल का उपयोग करता है। अस्थायी फ़ाइल /dev/shmउपलब्ध होने पर (साझा मेमोरी) का उपयोग करती है।

#!/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 "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.