“Host_hosts में सही होस्ट कुंजी जोड़ें” / होस्टनाम प्रति एकाधिक ssh होस्ट कुंजी?


146

एक कंप्यूटर जिसे मैं नियंत्रित करता हूं, में ssh करने की कोशिश कर रहा हूं, मुझे परिचित संदेश मिल रहा है:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

मैंने वास्तव में कुंजी बदल दी है। और मैंने कुछ दर्जन पोस्टिंग पढ़ते हुए कहा कि इस समस्या को हल करने का तरीका known_hostsफ़ाइल से पुरानी कुंजी को हटा देना है ।

लेकिन मैं चाहूंगा कि ssh को पुरानी कुंजी और नई कुंजी दोनों को स्वीकार करना होगा। त्रुटि संदेश (" Add correct host key") में भाषा बताती है कि पुराने को हटाए बिना सही होस्ट कुंजी को जोड़ने का कोई तरीका होना चाहिए।

मैं यह पता नहीं लगा पाया कि पुराने को हटाए बिना नई होस्ट कुंजी को कैसे जोड़ा जाए।

क्या यह संभव है, या त्रुटि संदेश केवल बेहद भ्रामक है?


9
यह होस्ट कुंजी है जो त्रुटि उत्पन्न कर रही है। एक मेजबान के पास एक और केवल एक कुंजी होनी चाहिए। यह ग्राहक या उपयोगकर्ता कुंजी के साथ कुछ नहीं करना है। क्या आपके पास एक आईपी पता है जो अलग-अलग मेजबानों या कुछ के बीच तैरता है?
डेविड श्वार्ट्ज

4
मेरे मामले में मुझे पता है कि मैं कुछ चीजों के साथ काम करते हुए निकट भविष्य में दोनों कुंजियों के बीच स्विच करने जा रहा हूं। ऐसा लगता है कि यह आपके द्वारा सुझाए गए कई होस्ट स्थिति वाले एक आईपी में भी उपयोगी होगा। मुख्य रूप से मैं सिर्फ यह जानना चाहता हूं कि क्या यह मेरी अपनी शिक्षा के अलावा किसी विशेष व्यावहारिक अनुप्रयोग से संभव है।
सैमुअल एडविन वार्ड

जवाबों:


147
  1. अपने सर्वर की rsa कुंजी प्राप्त करें, जहां server_ipआपके सर्वर का IP पता है, जैसे 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    नमूना प्रतिक्रिया:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. और क्लाइंट पर, संपूर्ण प्रतिक्रिया पंक्ति की प्रतिलिपि बनाएँ server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG..., और इस कुंजी को अपनी ~/.ssh/known_hostsफ़ाइल के नीचे जोड़ें :

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    

12
यह काम किया! हालांकि, मैं "HashKnownHosts" का उपयोग कर रहा हूं, इसलिए प्रविष्टि थोड़ी जगह से बाहर दिख रही थी। सौभाग्य से ssh_config (5) ने ssh-keygen (1) की ओर इशारा किया, जिसमें बताया गया कि मैं अनशेड प्रविष्टियों को हैश करने के लिए "ssh-keygen -H" का उपयोग कर सकता हूं। धन्यवाद!
सैमुअल एडविन वार्ड

2
यह "काम करता है" लेकिन आप कुंजी को सत्यापित नहीं कर रहे हैं, इसलिए आप माइट हमलों के लिए कमजोर हैं ...
जैस्परवेल्स

3
@JasperWallace, जब तक पहला कदम सुरक्षित कनेक्शन पर किया जाता है (उदाहरण के लिए लोकलहोस्ट का उपयोग करके) यह बहुत सुरक्षित होना चाहिए, मुझे लगता है
ony

3
क्या सर्वर से सभी प्रमुख प्रकारों को इकट्ठा करने का कोई तरीका है? कभी-कभी आप नहीं जानते कि क्या वे आरएसए, डीएसए, ईसीडीएसए, आरएसए 1 ... इत्यादि हैं
सल्पाजो डी एरियेरेज़

3
@SopalajodeArrierez एक ही मैनपेज यह भी कहता है कि आप कॉमा के साथ अलग-अलग प्रकार कर सकते हैं, इसलिए करें ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- लेकिन खोजने rsa1और dsaकुंजियों का एकमात्र कारण उन सर्वरों की पहचान करना है जिन्हें अपग्रेड / पुन: कॉन्फ़िगर करने की आवश्यकता है
kbolino

93

उस प्रविष्टि का उपयोग करके ज्ञात_होस्ट से निकालें:

ssh-keygen -R *ip_address_or_hostname*

यह ज्ञात_होस्ट फ़ाइल से समस्याग्रस्त आईपी या होस्टनाम को हटा देगा और फिर से कनेक्ट करने का प्रयास करेगा।

आदमी पृष्ठों से:

-R hostname
किसी ज्ञात_होस्ट फ़ाइल से होस्टनाम से संबंधित सभी कुंजियों को निकालता है। यह विकल्प हैशेड होस्ट (ऊपर -H विकल्प देखें) को हटाने के लिए उपयोगी है।


11
"पुराने को हटाए बिना नई होस्ट कुंजी कैसे जोड़ें।"
शमूएल एडविन वार्ड

4
यह सबसे अच्छा उपाय है!
थॉमस डेकाक्स

8
इसमें 19 वोट कैसे हैं? यह पूछे गए सवाल का जवाब देने के करीब नहीं आता है ..
मोलोमबी

2
आपका प्रश्न दूसरा तब आता है जब मैं "git ssh update host key के लिए स्वचालित रूप से" गूगल करता हूँ। यह उत्तर वही है जिसकी मुझे तलाश थी। एक नया प्रश्न खोलना कि मैं क्या चाहता हूं, इसे डुप्लिकेट के रूप में बंद कर सकता है।
जेसन गोएमाट

होस्टनाम भी काम करता है
डैमलूआर

18

एक बहुत ही सरल तरीका है:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

फिर मूल कुंजी को साफ़ करने के लिए ज्ञात_होस्ट को संपादित करें, फिर मेजबान का उपयोग करके ssh:

ssh name@computer

यह नई कुंजी को स्वचालित रूप से जोड़ देगा; फिर दो फाइलों की तुलना करें। मेलड जैसे प्रोग्राम दो फाइलों की तुलना करने का एक अच्छा तरीका है। फिर ज्ञात_होस्ट बनाने के लिए फ़ाइलों को मर्ज करें जिसमें दोनों कुंजियाँ हों

दो चाबियाँ रखने का मेरा 'कारण' यह है कि गंतव्य प्रणाली मल्टीबूट है, हालांकि मैं कहता हूं कि स्थापना के दौरान कुंजियों को सिंक्रनाइज़ करने का एक तरीका है, कई कुंजियों की अनुमति देने के लिए यह अधिक सीधा लगता है।

EDIT 2015/06

मुझे इसे जोड़ना चाहिए, इसे अब फिर से देखना, कि मैं एक और भी सरल तरीका नोटिस करता हूं [जब तक कि प्रवेश पहचान योग्य है, आम तौर पर होस्टनाम / आईपी पते से त्रुटि संदेश से काफी अलग इसकी विशिष्ट स्थान को संदर्भित करता है];

  1. अस्थायी रूप से ज्ञात_होस्ट में 'पुरानी' प्रविष्टि की शुरुआत में # जोड़ने के लिए ज्ञात_होस्ट संपादित करें
  2. कनेक्ट [ssh होस्ट करने के लिए], नई कुंजी 'स्वचालित रूप से' जोड़ने के लिए संकेत के लिए सहमत
  3. फिर # हटाने के लिए know_hosts को फिर से संपादित करें

यहाँ तक कि विकल्प HostKeyAlias ​​भी है

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

तब बाद में, ssh क्लाइंट ने उपनाम के तहत नई कुंजी जोड़ दी, आप या तो ज्ञात_होस्ट को संपादित कर सकते हैं और उपनाम के लिए 'वास्तविक' होस्टनाम / आईपी एड्रेस को स्थानापन्न कर सकते हैं या अन्य होस्ट के उपनाम के साथ कनेक्ट कर सकते हैं



वह मेल्ड है :) apt-get / yum इनस्टॉल नाम केवल मेल्ड है
मार्क

मैंने आपके सुझाव का एक प्रकार किया, जिसमें cp, mv, के बाद ssh, फिर cat ~ / .ssh / ज्ञात_hosts.bak ~ / .ssh / ज्ञात_hosts> tmp; mv tmp ~ / .ssh / ज्ञात_होस्ट्स
पीटर एन लुईस

6

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

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

ज्ञात_होस्ट फ़ाइल होस्ट नाम से फ़िंगरप्रिंट को बचाता है, भले ही यह एक ही आईपी पता हो, प्रत्येक अद्वितीय होस्ट नाम को एक अलग प्रविष्टि मिलती है।

मैं हर बार जब मैं एक नई प्रणाली का उपयोग करता था तो मेजबानों की फाइलों में नाम जोड़ने के लिए बीमार हो गया था, इसलिए मैं आईपी पते पर अग्रणी शून्य का उपयोग करके एक समान तरीके से आया था जैसे:

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110

(गैर-विशिष्ट) आईपी पते की प्रत्येक भिन्नता ज्ञात_होस्ट में स्वयं की प्रविष्टि है।


1
ओपनएसएसएच लोगों ने मुझे समझदार बना दिया, यह खामी अब और अधिक हाल के संस्करणों में काम नहीं करती है।
माइक

आप उपयोग कर सकते हैं CheckHostIP noमें ~/.ssh/configअभी भी बचाव का उपयोग करने में सक्षम हो। आप अपने उपनामों को भी वहां परिभाषित कर सकते हैं ताकि आपको केवल इस 3 होस्टनाम के साथ फिडेल /etc/hostsऔर परिभाषित न करना पड़े CheckHostIP no
GnP

3

यदि आपके क्लाइंट और सर्वर दोनों में OpenSSH 6.8 या नया है, तो आप UpdateHostKeys yesअपने ssh_configया में विकल्प का उपयोग कर सकते हैं ~/.ssh/config। उदाहरण के लिए:

Host *
    UpdateHostKeys yes

यह SSH सर्वर द्वारा होस्ट की गई सभी होस्ट कुंजियों को संग्रहीत करता है known_hosts, और जब सर्वर एक होस्ट कुंजी को बदलता है या हटाता है, तो कुंजी भी बदल जाती है या आपके द्वारा हटा दी जाती है known_hosts


यह अब तक का सबसे उपयोगी उत्तर है! यद्यपि यह स्पष्ट रूप से मूल प्रश्न को हल करने का एक तरीका प्रदान नहीं करता है यदि एक होस्ट कुंजी पहले से ही बदल गई थी, अन्य सभी उत्तर असुरक्षित हैं क्योंकि वे नई होस्ट कुंजी को सत्यापित नहीं करते हैं। यह विकल्प आपको नए होस्ट कुंजियों के लिए सुरक्षित रोलओवर करने की अनुमति देता है।
जाप एल्डरिंग

1

मैं यह नहीं देखता कि आप दो कुंजियों के साथ काम क्यों करना चाहते हैं, लेकिन आप निश्चित रूप से एक से अधिक मान्य कुंजी को ~/.ssh/known_hostsफ़ाइल में जोड़ सकते हैं , लेकिन आपको इसे मैन्युअल रूप से करना होगा।

एक अन्य समाधान StrictHostKeyChecking=noइस विशिष्ट मेजबान के लिए विकल्प का उपयोग करने के लिए हो सकता है :

ssh -o StrictHostKeyChecking=no user@host

जो आप अपने ~/.profileया कुछ इसी तरह एक उपनाम में डाल सकते हैं ।

alias hc=ssh -o StrictHostKeyChecking=no user@host

StrictHostKeyChecking इस मामले में मदद नहीं करता है; जाहिरा तौर पर यह केवल व्यवहार को निर्दिष्ट करता है जब होस्ट ज्ञात_होस्ट्स फ़ाइल में नहीं होता है। यहाँ उल्लेख किया गया है: gossamer-threads.com/lists/openssh/dev/45349#45349
सैमुअल एडविन वार्ड

यह यहां काम करता है। आपको चेतावनी मिलेगी, लेकिन लॉगिन जारी है।
स्वेन :

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

1

यदि आप केवल एक स्थानीय नेटवर्क पर ssh ...

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

जैसे

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

फिर नए बफर (फ़ाइल) को बचाने के लिए स्पेस, बैकस्पेस cntl + x और 'y' दबाएं। इसका बुरा व्यवहार लेकिन ठीक है कि आप नियमित रूप से अपने स्थानीय नेटवर्क के बाहर ssh'ing नहीं कर रहे हैं (जैसे एक यूआई या कार्य सर्वर)

एक सुरक्षित स्थानीय नेटवर्क पर यह सुरक्षित है क्योंकि आप बस एक आदमी को बीच में हमला नहीं कर सकते।

यह हमेशा आप समझ कोड का उपयोग करने के लिए बेहतर है!


4
known_hostsहर बार पूरी फाइल को पोंछना सुरक्षा के अधिकांश को नकारना है अन्यथा एसएचएस द्वारा प्रदान किया गया है।
कैस्परल्ड

दरअसल, मेरा तर्क है कि सुरक्षित आंतरिक नेटवर्क पर, यह आपके कोड को समझने और सुरक्षा को ध्यान से कॉपी कोड की तुलना में कम करने के लिए सुरक्षित है। बाहरी नेटवर्क पर तो स्थिति अलग होगी।
एरोन

-1

इतने सारे उत्तर, लेकिन इतने सारे कि पूरी तरह से सख्त मेजबान जाँच को बंद करके सुरक्षा को छोड़ देते हैं, या असंबंधित मेजबान जानकारी को नष्ट कर देते हैं या उपयोगकर्ता को अंतःक्रियात्मक रूप से, जब यह अप्रत्याशित है, तो संभवत: बाद में बिंदु पर कुंजी स्वीकार करने के लिए मजबूर करता है।

यहां आपको एक सरल तकनीक दी गई है जिससे आप सख्त होस्ट चेकिंग को छोड़ सकते हैं, लेकिन कुंजी को नियंत्रित तरीके से अपडेट कर सकते हैं , जब आप इसे बदलने की उम्मीद करते हैं:

  • पुरानी कुंजी को निकालें और एक कमांड में अपडेट करें

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • आईपी ​​पते (तों) या अन्य होस्ट नामों के साथ दोहराएं यदि आप उनका उपयोग करते हैं।

इस दृष्टिकोण का लाभ यह है कि यह सर्वर को एक बार ठीक करता है। Ssh-keygen के अधिकांश संस्करणों को एक त्रुटि वापस नहीं आती है यदि आप जिस सर्वर को हटाने का प्रयास करते हैं वह ज्ञात होस्ट फ़ाइल में मौजूद नहीं है, यदि यह आपके लिए एक समस्या है, तो क्रम में दो आदेशों का उपयोग करें।

यह दृष्टिकोण कनेक्टिविटी की पुष्टि भी करता है और ssh कमांड में लॉग के लिए एक अच्छा संदेश देता है (जो लॉग इन करता है, होस्ट कुंजी को अपडेट करता है, और SSH होस्ट कुंजी को अपडेट करता है और फिर तुरंत बाहर निकलता है।

यदि आपका ssh-keygen का संस्करण एक गैर-शून्य निकास कोड देता है, और आप इसे बिना किसी त्रुटि के संभालना पसंद करते हैं, भले ही या पूर्व कनेक्शन, बस क्रम में दो आदेशों का उपयोग करें, ssh-keygen कमांड पर किसी भी त्रुटि को अनदेखा करते हुए।

यदि आप इस तकनीक का उपयोग करते हैं, तो आपको अपने ssh कमांड को अलग करने की आवश्यकता नहीं है, या उस एक ssh कमांड के अलावा होस्ट चेकिंग को बंद करना है। आप सुनिश्चित कर सकते हैं कि भविष्य के ssh सत्र संघर्ष के बिना काम करेंगे या किसी नई कुंजी को स्पष्ट रूप से स्वीकार करने की आवश्यकता होगी, जब तक कि ऊपर ssh कमांड बिना किसी त्रुटि के चलता है।


-3

मुझे भी यही समस्या थी।

सब मैंने किया sudo nano /home/user/.ssh/ host_allowऔर चाबी को मिटा दिया।

जब मैंने सर्वर पर वापस ssh किया तो इसमें एक नई कुंजी जोड़ी गई।


2
ऐसा क्यों होता है इसके बारे में कुछ और जानकारी उत्तर के लिए उपयोगी होगी।
ड्रू खुरई

-4

आक्रामक कमांड को हटाने के लिए sed कमांड का उपयोग करें

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

ज्ञात होस्ट्स में बताई गई लाइन 86 को हटा दें।

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

अगली बार जब ssh का उपयोग करते हुए सिस्टम स्वचालित रूप से नई कुंजी जोड़ देगा।

ssh के नए संस्करण

उपयोग:

ssh-keygen -R <hostname|ip address>

यह होस्ट नाम प्रविष्टि को निकालने और पुराने का बैकअप ले जाएगा .known_hostके रूप मेंknown_hosts.old


4
"लेकिन मैं चाहूंगा कि ssh को पुरानी कुंजी और नई कुंजी दोनों को स्वीकार करना होगा।" आपका उत्तर ऐसा नहीं करता है।
शमूएल एडविन वार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.