في محاولة للدخول في جهاز كمبيوتر أتحكم فيه ، أتلقى الرسالة المألوفة:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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تقترح اللغة في رسالة الخطأ (" ") أنه يجب أن تكون هناك طريقة ما لإضافة مفتاح المضيف الصحيح دون إزالة المفتاح القديم.

لم أتمكن من معرفة كيفية إضافة مفتاح المضيف الجديد دون إزالة المفتاح القديم.

هل هذا ممكن أم أن رسالة الخطأ مضللة للغاية؟

answer
  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)
    

قم بإزالة هذا الإدخال من known_hosts باستخدام:

ssh-keygen -R *ip_address_or_hostname*

سيؤدي هذا إلى إزالة عنوان IP أو اسم المضيف المشكل من ملف known_hosts ومحاولة الاتصال مرة أخرى.

من صفحات الرجل:

-R hostname
Removes all keys belonging to hostname from a known_hosts file. This option is useful to delete hashed hosts (see the -H option above).

طريقة بسيطة للغاية هي:

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

ثم قم بتحرير known_hosts لمسح المفتاح الأصلي ، ثم ssh إلى المضيف باستخدام:

ssh [email protected]

ستضيف المفتاح الجديد تلقائيًا ؛ ثم قارن بين الملفين. يعد برنامج مثل meld طريقة جيدة لمقارنة الملفين. ثم ادمج الملفات لجعل known_hosts تحتوي على كلا المفتاحين

السبب وراء الاحتفاظ بمفتاحين هو أن نظام الوجهة متعدد التمهيد ، على الرغم من أنني أجرؤ على القول بأن هناك طريقة لمزامنة المفاتيح عبر عمليات التثبيت ، يبدو أن السماح بمفاتيح متعددة أكثر وضوحًا.

تحرير 2015/06

يجب أن أضيف ، مع إعادة النظر فيه الآن ، أنني لاحظت طريقة أبسط [طالما أن الإدخال قابل للتحديد ، عادةً من اسم المضيف / عنوان IP بعيدًا تمامًا عن رسالة الخطأ التي تشير إلى موقعه المحدد] ؛

  1. قم بتحرير known_hosts لإضافة # في بداية الإدخال "القديم" في known_hosts مؤقتًا
  2. قم بتوصيل [ssh بالمضيف] ، وافق على المطالبة بإضافة المفتاح الجديد "تلقائيًا"
  3. ثم أعد تعديل known_hosts لإزالة علامة #

حتى أن هناك خيار HostKeyAlias ​​كما هو الحال في

ssh -o HostKeyAlias=mynewaliasforthemachine [email protected]

بعد ذلك ، بعد أن يضيف عميل ssh المفتاح الجديد تحت الاسم المستعار ، يمكنك إما تحرير known_hosts لاستبدال عنوان المضيف / IP "الحقيقي" للاسم المستعار أو الاتصال بهذا التجسيد لهذا المضيف باستخدام خيار الاسم المستعار إلى الأبد

لدي نفس المشكلة مع raspberry pi الذي أقوم بتمهيده باستخدام عدة أنظمة مختلفة (نظام dev لتجميع ثنائيات الذراع ، والمشروع ، و xbmc ، وما إلى ذلك) وقد واجهت نفس المشكلة. يستخدمون DHCP على شبكة محلية وجهاز التوجيه الخاص بي يعيد استخدام نفس عنوان IP دائمًا لأن عنوان MAC كان هو نفسه. لقد قمت بحلها باستخدام أسماء نطاقات مختلفة في ملف المضيفين الخاص بي:

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

يحفظ ملف known_hosts بصمات الأصابع حسب اسم المضيف ، لذلك على الرغم من أنه نفس عنوان IP ، يحصل كل اسم مضيف فريد على إدخال مختلف.

لقد سئمت من إضافة الأسماء إلى ملفات المضيفين في كل مرة أستخدم فيها نظامًا جديدًا ، لذلك توصلت إلى طريقة أكثر كسلاً باستخدام الأصفار البادئة على عناوين IP مثل:

$ ssh [email protected]
$ ssh [email protected]
$ ssh [email protected]

كل اختلاف في عنوان IP (غير المتعارف عليه) يحصل على إدخاله الخاص في known_hosts.

إذا كان كل من العميل والخادم يحتويان على OpenSSH 6.8 أو أحدث ، يمكنك استخدام UpdateHostKeys yesالخيار في ملفك ssh_configأو ~/.ssh/config. على سبيل المثال:

Host *
    UpdateHostKeys yes

هذا يجعل SSH يخزن جميع مفاتيح المضيف التي يجب على الخادم تخزينها known_hosts، وعندما يغير الخادم أو يزيل مفتاح مضيف واحد ، يتم أيضًا تغيير المفتاح أو إزالته من ملف known_hosts.

لا أرى سبب رغبتك في العمل بمفتاحين ، ولكن يمكنك بالتأكيد إضافة أكثر من مفتاح صالح إلى ~/.ssh/known_hostsالملف ، ولكن سيتعين عليك القيام بذلك يدويًا.

قد يكون الحل الآخر هو استخدام StrictHostKeyChecking=noالخيار لهذا المضيف المحدد:

ssh -o StrictHostKeyChecking=no [email protected]

التي يمكنك وضعها في الاسم المستعار الخاص بك ~/.profileأو شيء مشابه.

alias hc=ssh -o StrictHostKeyChecking=no [email protected]

إذا كنت فقط SSH على الشبكة المحلية ثم ...

حل بسيط هو مسح ملف المفتاح القديم واستبداله بملف فارغ. سيسمح لك ذلك بإعادة ترخيص جميع اتصالاتك بمفاتيح جديدة. إذا كان لديك مفاتيح ssh مخزنة لمواقع خارج شبكتك المحلية ، فأنت بحاجة إلى التأكد من أن اتصالك الأولي آمن كما فعلت في المرة الأولى التي قمت فيها بالاتصال بهذا الخادم.

على سبيل المثال

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

ثم اضغط على space و backspace cntl + x و 'y' لحفظ المخزن المؤقت الجديد (ملف). إنها ممارسة سيئة ولكن لا بأس إذا لم تكن تعمل بانتظام خارج شبكتك المحلية (على سبيل المثال ، uni أو خادم العمل)

هذا آمن على شبكة محلية آمنة لأنك ببساطة لا تستطيع الحصول على رجل في منتصف الهجوم.

من الأفضل دائمًا استخدام الكود الذي تفهمه!

تحتاج إلى إزالة المفتاح القديم من خادم العميل

ssh-keygen -R 192.168.0.25 #1st remove on client server

ثم إعادة إنشاء المفتاح

ssh -o HostKeyAlias=192.168.0.25 [email protected] #on client server

تحقق من وجود خط جديد

nano ~/.ssh/known_hosts

العديد من الإجابات ، ولكن الكثير منها يتخلى عن الحماية عن طريق إيقاف فحص المضيف الصارم تمامًا ، أو تدمير معلومات المضيف غير ذات الصلة أو إجبار المستخدم على قبول المفاتيح بشكل تفاعلي ، ربما في وقت لاحق ، عندما يكون ذلك غير متوقع.

فيما يلي أسلوب بسيط للسماح لك بترك فحص مضيف صارم ، ولكن قم بتحديث المفتاح بطريقة مسيطر عليها ، عندما تتوقع تغييره:

  • قم بإزالة المفتاح القديم والتحديث في أمر واحد

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • كرر مع عنوان (عناوين) IP أو أسماء مضيف أخرى إذا كنت تستخدمها.

تتمثل ميزة هذا الأسلوب في أنه يعيد تشغيل الخادم مرة واحدة بالضبط. يبدو أن معظم إصدارات ssh-keygen لا تعرض خطأ إذا كان الخادم الذي تحاول حذفه غير موجود في ملف المضيفين المعروف ، إذا كانت هذه مشكلة بالنسبة لك ، فاستخدم الأمرين بالتسلسل.

يتحقق هذا النهج أيضًا من الاتصال ويصدر رسالة لطيفة للسجلات في الأمر ssh (الذي يسجل الدخول ويحدّث مفتاح المضيف ويخرج مفتاح مضيف SSH محدثًا ثم يخرج على الفور.

إذا كان إصدارك من ssh-keygen يُرجع رمز خروج غير صفري ، وتفضل التعامل مع هذا بدون خطأ ، بغض النظر عن الاتصال أو الاتصال المسبق ، ببساطة استخدم الأمرين بالتسلسل ، متجاهلاً أي أخطاء في الأمر ssh-keygen.

إذا كنت تستخدم هذه التقنية ، فلن تحتاج أبدًا إلى تغيير أمر ssh ، أو إيقاف تشغيل فحص المضيف إلا أثناء أمر ssh. يمكنك التأكد من أن جلسات ssh المستقبلية ستعمل دون تعارض أو الحاجة إلى قبول مفتاح جديد صراحة ، طالما أن الأمر ssh أعلاه يعمل بدون أخطاء.

كان لي نفس المشكلة.

كل ما فعلته هو sudo nano /home/user/.ssh/ host_allowومسح المفتاح.

عندما أعود إلى الخادم ، أضافت مفتاحًا جديدًا.

استخدم الأمر 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