SSH कुंजी फिंगरप्रिंट क्या है और यह कैसे उत्पन्न होता है?


128

मुझे हमेशा लगता है कि जब मैं sshएक नई मशीन में होता हूं तो मुझे यह संदेश मिलता है :

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

इसका मतलब क्या है? क्या हर मशीन में हर बार एक ही फिंगरप्रिंट होगा?

ये फिंगरप्रिंट कैसे उत्पन्न होते हैं? वे किन मापदंडों पर निर्भर करते हैं?

जवाबों:


65

फ़िंगरप्रिंट होस्ट की सार्वजनिक कुंजी पर आधारित होता है, जो आमतौर पर "/etc/ssh/ssh_host_rsa_key.pub" पर आधारित होता है। आम तौर पर आप जिस होस्ट से कनेक्ट हो रहे हैं उसकी आसान पहचान / सत्यापन के लिए।

यदि फिंगरप्रिंट बदलता है, तो आप जिस मशीन से जुड़ रहे हैं, उन्होंने अपनी सार्वजनिक कुंजी बदल दी है। यह एक बुरी बात नहीं हो सकती है (ssh को पुन: स्थापित करने से होता है), लेकिन यह संकेत भी दे सकता है कि आप एक ही मशीन / आईपी पर एक अलग मशीन से कनेक्ट हो रहे हैं (तब होता है जब आप लोड बैलेंसर जैसी किसी चीज से जुड़ रहे होते हैं) या आप एक आदमी के बीच-बीच के हमले के साथ लक्षित किया जा रहा है, जहां हमलावर किसी तरह एक दूसरे मेजबान से जुड़ने के लिए आपके ssh कनेक्शन को रोक रहा है / रोक रहा है जो आपके उपयोगकर्ता / pw को स्नूपिंग कर सकता है।

नीचे पंक्ति: यदि आपको एक बदले हुए फिंगरप्रिंट की चेतावनी मिलती है, तो सतर्क रहें और दोहराएं कि आप वास्तव में एक सुरक्षित कनेक्शन पर सही होस्ट से जुड़ रहे हैं। हालांकि अधिकांश समय यह हानिरहित है, यह एक संभावित मुद्दे का संकेत हो सकता है

देखें: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
और: http://en.wikipedia.org/ wiki / Public_key_fingerprint


5
"" सतर्क और दोहरी जांच करें कि आप वास्तव में एक सुरक्षित कनेक्शन पर सही मेजबान से जुड़ रहे हैं "- बेवकूफ सवाल, लेकिन आप इसे आसानी से कैसे कर सकते हैं?
सवारा

1
@Savara जब आप SSH सर्वर से कनेक्ट कर रहे हैं, जिसे आपने पहले कनेक्ट नहीं किया था, तो आपको सर्वर व्यवस्थापक से SSH सर्वर की सार्वजनिक कुंजी का अनुरोध करना चाहिए। सर्वर एडमिन आपको टेक्स्ट का एक टुकड़ा देगा। आपको इस पाठ को फ़ाइल में जोड़ना चाहिए ~/.ssh/known_hosts। इस तरह, जब आप सर्वर से जुड़ते हैं, तो आपका SSH क्लाइंट इस सर्वर को पहचान लेगा, क्योंकि आपने इसकी सार्वजनिक कुंजी को सहेज लिया है known_hosts। इसलिए, वास्तव में आपको कभी भी "हां" नहीं कहना चाहिए जब एसएसएच क्लाइंट आपको बताता है कि "मेजबान की प्रामाणिकता स्थापित नहीं की जा सकती है"। आपको सर्वर की सार्वजनिक कुंजी को पहले से जोड़ना चाहिए।
उत्कु

@ सावरा अगर आप ऐसा करते हैं, तो आपको पता चल जाएगा कि जब आपका SSH क्लाइंट "क्लाइंट की प्रामाणिकता स्थापित नहीं कर सकता है" या जब यह आपको बताता है कि "सर्वर की सार्वजनिक कुंजी बदल दी गई है" तो कुछ गड़बड़ हो रही है। इसलिए, आपको हमेशा सर्वर की सार्वजनिक कुंजी को अपनी ~/.ssh/known_hostsफ़ाइल में पहले से जोड़ना चाहिए और कभी भी हाँ नहीं कहना चाहिए जब आपका एसएसएच क्लाइंट आपको बताता है "क्लाइंट की प्रामाणिकता स्थापित नहीं की जा सकती है" या जब यह आपको बताता है "सर्वर की सार्वजनिक कुंजी है बदला हुआ"।
उत्कु

3
हाँ, मैं पूरी तरह से जानता हूँ कि एसएसएच फिंगरप्रिंट्स देखने का मैकेनिक कैसे काम करता है, लेकिन समय का एक बड़ा प्रतिशत आपके पास दूसरे चैनल के माध्यम से फिंगरप्रिंट प्राप्त करने का विकल्प नहीं है। TOFU दुख की बात है सबसे अच्छा हम अक्सर मिलता है।
सवारा

क्या "हां" का जवाब देने के बाद भी प्रामाणिकता की जांच करने का एक तरीका है?
विनिमय

104

आप सार्वजनिक कुंजी के लिए एक फिंगरप्रिंट उत्पन्न कर सकते हैं ssh-keygenजैसे कि:

ssh-keygen -lf /path/to/key.pub

ठोस उदाहरण (यदि आप RSA सार्वजनिक कुंजी का उपयोग करते हैं):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

पहला भाग (2048)बिट्स में महत्वपूर्ण लंबाई है, दूसरा भाग (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)सार्वजनिक कुंजी का फिंगरप्रिंट है और तीसरा भाग सार्वजनिक कुंजी फ़ाइल का स्थान है।


क्या आप जानते हैं कि 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 का यह प्रारूप उस सार्वजनिक कुंजी से है?
किट हो

@ किथो मुझे यकीन नहीं है अगर मैं आपके प्रश्न को समझता हूं। मैंने उदाहरण को अपडेट किया, जैसा कि मुझे लगता ssh-keygen -lfहै कि आप क्या चाहते हैं।
बेंजामिन ने

5
जब एसएसएच-आईएनजी एक नई मशीन में, जो देखता है , वह उपयोगकर्ता का पुतला फिंगरप्रिंट नहीं है, बल्कि मेजबान का पुतला फिंगरप्रिंट है। तो सवाल के संदर्भ के लिए एक बेहतर उदाहरण है ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub। यह उस फिंगरप्रिंट को दिखाता है जो SSH के लॉगिन पर लोकलहोस्ट को दिखाया जाता है।
तानीस

57
मेरी ssh-keygenसूचना दी sha256उँगलियों के निशान। md5उंगलियों के निशान पाने के लिए मैं भागा ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub। #archlinux
जस्टिन सी

5
(@JustinC) ओपनएसएसएच संस्करण 6.8 (मार्च 2015) और SHA256 में बदल गया, डिफ़ॉल्ट रूप से हेक्स के बजाय बेस 64 में प्रदर्शित किया गया। ग्राहक उपयोग के लिए ssh -o FingerprintHash=md5या में बराबर ssh_configऔर चीजें हैं जो का उपयोग पर sshकी तरह scp
dave_thompson_085

72

Base64- एन्कोडेड सार्वजनिक कुंजी के भीतर बाइनरी डेटा पर फिंगरप्रिंट MD5 है।

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Md5sum 6530389635564f6464e8e3a47d593e19 कुंजी को अलग किए गए कॉलनों के बिना उत्पन्न होने पर प्रदर्शित किया जाता है।


हालाँकि, अगर आप उन उंगलियों के निशान से निपट रहे हैं जो अमेज़ॅन ईसी 2 कुंजी जोड़े कंसोल में दिखाते हैं, तो दुर्भाग्य से यह एक अलग जानवर हो सकता है । यदि यह 32-अंकीय हेक्स स्ट्रिंग है, तो यह मानक MD5 SSH सार्वजनिक कुंजी फिंगरप्रिंट ऊपर है। लेकिन अगर यह 40 अंकों का अंक है, तो यह वास्तव में PKCS # 8 प्रारूप में निजी कुंजी के SHA1 को ले कर गणना की गई एक फिंगरप्रिंट है :

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58

1
मुझे यह उत्तर निम्नलिखित परिदृश्य में मददगार लगा। आपका सिस्टम फिंगरप्रिंट की गणना करने के लिए SHA1 का उपयोग करता है, लेकिन आपके मित्र md5 का उपयोग करता है। मैंने एक फिंगरप्रिंट साझा किया था जो SHA1 था और यह MD5 से उत्पन्न उसकी प्रणाली से मेल नहीं खाता था। इससे मदद मिली - धन्यवाद! sed 's | ^ ssh-rsa || /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==। *। * $ | ==' | Base64 -d | md5sum
लाइसेंसजिप्पा

यह समझने में अत्यधिक प्रासंगिक है कि यह फिंगरप्रिंट DNS SSHFP रिकॉर्ड में उन लोगों से मेल नहीं खाएगा, क्योंकि वे SHA-1 या SHA-256 डाइजेस्ट का उपयोग करते हैं।
नीरभोज

1
@Liczyrzepa publickey फ़ील्ड कुंजी प्रकार और बिट्स के आधार पर अंत में '==' हो सकती है या नहीं हो सकती है; सुरक्षित और IMO का उपयोग करना आसान awk '{print $2}' /path/to/keyfile.pubया समान।
dave_thompson_085

13
यह एकमात्र उत्तर है जो बताता है कि फिंगरप्रिंट की गणना कैसे की जाती है
greuze

2
हालाँकि लिनक्स मिंट में कमांड है:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze

13

यदि आप यह देखने के लिए SSH कुंजी फ़ाइल की जांच करना चाहते हैं कि क्या यह उसी तरह है जैसा कि गितुब द्वारा "डिप्लॉय की" के रूप में बताया गया है, तो यह आपके लिए है ...

निजी URL से: https://github.com/<username>/<repo_name>/settings/key जो आप देखेंगे जीथब से स्क्रीनशॉट

टर्मिनल पर:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

आप ध्यान देंगे कि आपको निजी और सार्वजनिक दोनों कीज़ के लिए एक ही फिंगरप्रिंट मिलता है।

इसी कमांड को GitHub की एक साफ सुविधा के साथ जोड़ा जा सकता है, जो कि यह तथ्य है कि वे सार्वजनिक रूप से उपयोगकर्ताओं की SSH सार्वजनिक कुंजी https://github.com/<username>.keys पर सेवा करते हैं।

यहाँ एक-लाइनर है जिसका उपयोग आप इसका लाभ उठाने के लिए कर सकते हैं।

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B

1
ssh-keygen -r host.name.com

एक sshd उदाहरण पर सभी कॉन्फ़िगर सार्वजनिक कुंजियों के लिए उंगलियों के निशान का उत्पादन करेगा।

फिर इन्हें DNS SSHFP रिकॉर्ड में डाला जा सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.