فهرست محتوایی این مقاله
همه ما مهندسان DevOps این لحظه رو تجربه کردیم… وقتی یه سرور جدید راهاندازی میکنیم، اولین دستور SSH رو میزنیم و یهو ترمینال با قاطعیت خطا میده: “Host key verification failed!” در این مقاله به شما آموزش خواهیم داد که در پس این اتفاق چه میگذرد و سه راهحل ساده را برای رفع خطای عدم تطابق کلید میزبان در VPS ارائه خواهیم کرد.
SSH چگونه کار میکند؟
وقتی برای اولین بار از طریق SSH به یک سرور راه دور متصل میشوید، کلاینت شما یک کلید رمزنگاری مخصوص به IP یا نام میزبان آن سرور ایجاد و ذخیره میکند. این کلید مثل یک اثر انگشت دیجیتال منحصربهفرد عمل میکند و هویت سروری که به آن وصل شدید را تأیید میکند. دفعههای بعد که بخواهید دوباره به آن سرور وصل شوید، SSH بررسی میکند که آیا کلید ارائهشده توسط سرور همان کلیدی است که قبلاً در فایل known_hosts ذخیره کردهاید یا خیر.
این فرآیند، اتصال شما را در برابر حملات ” man-in-the-middle ” که ممکن است فرد دیگری تلاش کند تا ارتباطتان را قطع کرده و به جای سرور اصلی خودش را جا بزند، ایمن میکند. بدون این اعتبارسنجی، هیچ راهی برای اطمینان از اینکه واقعاً به سرور درست متصل شدید و نه به یک سرور جعلی وجود نخواهد داشت.
- سرورها را بهطور منحصربهفرد شناسایی میکنند.
- از جعل هویت یا حملات ” man-in-the-middle ” یا مرد میانی جلوگیری میکنند.
- بهطور محلی روی کلاینت شما برای تأیید در آینده ذخیره میشوند.

چه چیزی باعث ایجاد خطای عدم تطابق کلید میزبان در VPS میشود؟
این خطا زمانی پیش میآید که SSH متوجه شود کلید میزبان ذخیرهشده روی دستگاه شما با کلید میزبان فرستاده شده از طرف سرور یکی نیست. در ادامه، به چند دلیل این اتفاق اشاره میکنیم:
- سرور دوباره نصب یا بهروزرسانی شده که ممکن است کلید میزبان جدیدی ایجاد کرده یا فرمت یا الگوریتم کلید میزبان را تغییر داده باشد.
- سرور کلید میزبان خود را تغییر داده که این یک روش امنیتی خوب است تا از نفوذ یا افشای کلید میزبان جلوگیری شود.
- پیکربندی شبکه سرور تغییر کرده، مانند آدرس IP یا نام میزبان.
- فایل known_hosts روی دستگاه کلاینت تغییر کرده یا خراب شده، که ممکن است ورودی کلید میزبان برای سرور را حذف یا تغییر دهد.
مراحل بررسی خطا
در زیر مراحلی را ذکر کردهایم که میتوانید از آنها در هنگام مواجه با این خطا انجام دهید:
- بررسی کنید که آیا اثر انگشت کلید میزبان سرور با انتظارات شما مطابقت دارد یا خیر. اثر انگشت کلید میزبان را با آنچه در فایل known_hosts ذخیره شده مقایسه کنید. اگر اثر انگشتها مطابقت دارند، میتوانید فرض کنید که کلید میزبان به دلایل دیگری همچون (بهروزرسانی یا افزایش امنیت) تغییر کرده و به مرحله بعدی بروید. اما اگر اثر انگشتها مطابقت ندارند، باید احتیاط کنید و قبل از اتصال به سرور، تحقیقات بیشتری انجام دهید.

- بررسی کنید که آیا تغییراتی در آدرس IP یا DNS سرور وجود دارد یا خیر. اطمینان حاصل کنید که آدرس IP یا نام میزبان سروری که میخواهید به آن متصل شوید، همانند آدرسی است که قبلاً استفاده کردهاید. میتوانید از ابزارهایی مانند ping، nslookup یا dig برای بررسی آدرس IP یا رکوردهای DNS سرور استفاده کنید. اگر آدرس IP یا نام میزبان تغییر کرده باشد، باید فرمان SSH یا تنظیمات خود را بهروزرسانی کنید تا از آدرس جدید استفاده کنید.
- بررسی کنید که آیا سرور پشت یک فایروال، پروکسی یا دستگاه NAT قرار دارد که ممکن است بر اتصال SSH تأثیر بگذارد یا خیر. (دستگاه NAT به چندین دستگاه اجازه میدهد تا از یک آدرس IP عمومی مشترک استفاده کنند و این کار میتواند بر ترافیک شبکه تأثیر بگذارد.) از ابزارهایی مانند nmap، telnet یا traceroute برای بررسی اتصال و پیکربندی شبکه سرور استفاده کنید. اگر سرور پشت یک فایروال، پروکسی یا دستگاه NAT باشد، ممکن است نیاز داشته باشید فرمان SSH یا تنظیمات خود را بهگونهای تغییر دهید که از آدرس IP، پورت یا پروتکل درست استفاده کنید.

- بررسی کنید که آیا پیکربندی سرور SSH و فایلهای کلید میزبان تغییر کردهاند یا خیر. با استفاده از روشهای دیگر، مانند کنسول یا رابط وب، به سرور وارد شوید و پیکربندی سرور SSH و فایلهای کلید میزبان را بررسی کنید. به دنبال هرگونه تغییر یا ناهنجاری باشید که ممکن است باعث ایجاد خطای عدم تطابق اعتبارسنجی کلید میزبان شده باشد. موارد زیر را بررسی کنید:
- فایل پیکربندی سرور SSH که در مسیر `/etc/ssh/sshd_config` قرار دارد، ممکن است محل، فرمت یا الگوریتم کلید میزبان را تغییر داده باشد. باید مقادیر دستورات `HostKey`، `HostKeyAlgorithms` و `HostKeyFormat` را بررسی کنید و مطمئن شوید که با فایلهای کلید میزبان و تنظیمات SSH در کلاینت همخوانی دارند.
- فایلهای کلید میزبان که معمولاً در مسیر `/etc/ssh/` قرار دارند، ممکن است جایگزین، حذف یا خراب شده باشند. دسترسیها، مالکیت و یکپارچگی این فایلها را بررسی کنید و مطمئن شوید که قابل خواندن و معتبر هستند. همچنین باید اثر انگشت این فایلها را بررسی کرده و با آنچه که SSH نمایش میدهد مقایسه کنید.

چگونه خطای “host key verification failed” در SSH را رفع کنیم؟
در ادامه، سه روش ساده برای رفع خطای عدم تطابق کلید میزبان در VPS آورده شده است:
راهحل اول: حذف کلید قدیمی از فایل known_hosts
سادهترین و رایجترین روش برای رفع خطای “host key verification failed” حذف ورودی کلید قدیمی از فایل known_hosts و افزودن کلید جدید است. فایل known_hosts در دایرکتوری خانگی شما، در مسیر /.SSh/known_hosts~ قرار دارد. مراحل زیر را برای حذف ورودی کلید قدیمی از این فایل دنبال کنید:
- ابتدا، ورودی کلید میزبان که باعث ایجاد خطا شده است را شناسایی کنید. هنگام تلاش برای اتصال، SSH شماره خط و اثر انگشت کلید میزبان که با کلید ذخیرهشده مطابقت ندارد را به شما نشان میدهد. بهعنوان مثال، اگر بخواهید به سروری با آدرس IP 192.168.1.100 متصل شوید، ممکن است پیغامی مانند زیر را مشاهده کنید:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:exampleFingerPrint1234567890.
Please contact your system administrator.
Add correct host key in /home/your_user/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/your_user/.ssh/known_hosts:5
remove with:
ssh-keygen -f "/home/your_user/.ssh/known_hosts" -R "192.168.1.100"
- ورودی کلید میزبان را از فایل `known_hosts` حذف کنید. میتوانید از هر ویرایشگر متنی یا ابزار خط فرمان برای ویرایش فایل `known_hosts` استفاده کنید و خط حاوی کلید مشکلدار را پاک کنید. بهعنوان مثال، میتوانید از دستور `sed` برای حذف خط ۳ فایل `known_hosts` به این شکل استفاده کنید:
sed -i '3d' ~/.ssh/known_hosts
بهطور جایگزین، میتوانید از دستور `ssh-keygen` برای حذف ورودی کلید میزبان با مشخص کردن نام میزبان یا آدرس IP سرور استفاده کنید. دستور زیر برای این مرحله بهکار میرود:
ssh-keygen -R <server-ip-or-hostname>
این دستور تمامی ورودیهای کلید میزبان که با نام میزبان یا آدرس IP دادهشده مطابقت دارند را از فایل `known_hosts` حذف خواهد کرد.
- بهدنبال حذف ورودی کلید قدیمی از فایل known_hosts، دوباره به سرور متصل شوید و کلید میزبان جدید را بپذیرید. SSH از شما خواهد خواست که کلید جدید را تأیید کرده و آن را به فایل known_hosts اضافه کنید. ممکن است پیامی مشابه زیر مشاهده کنید:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
RSA key fingerprint is SHA256:exampleNewFingerPrint1234567890.
Are you sure you want to continue connecting (yes/no)?
برای قبول کردن کلید میزبان جدید و ادامه اتصال، “yes” یا اثر انگشت را تایپ کنید. SSH کلید جدید را به فایل `known_hosts` اضافه کرده و دیگر برای همان سرور از شما سؤال نخواهد کرد.
با این حال، باید در استفاده از این راهحل احتیاط کنید، زیرا ممکن است امنیت اتصال SSH شما را به خطر بیندازد. با حذف ورودی کلید قدیمی از فایل `known_hosts`، در واقع به کلید میزبان جدید بدون اینکه صحت آن را تأیید کنید، اعتماد میکنید.
این ممکن است شما را در معرض حمله man-in-the-middle قرار دهد، جایی که یک مهاجم ممکن است کلید میزبان را با کلید خود جایگزین کرده و اتصال SSH شما را تحت کنترل بگیرد. بنابراین، تنها در صورتی از این راهحل استفاده کنید که مطمئن باشید کلید میزبان به دلیل معتبری تغییر کرده و به سرور صحیح متصل میشوید.
راهحل دوم: جایگزینی کلید میزبان سرور
راه دیگر برای رفع خطای تأیید کلید میزبان، جایگزینی کلید میزبان در سرور SSH با یک کلید جدید است. این کار ممکن است در صورت آسیبدیدگی، خرابی یا گمشدن کلید میزبان ضروری باشد. برای جایگزینی کلید میزبان در سرور SSH، مراحل زیر را دنبال کنید:
- تولید کلید جدید: از دستور `ssh-keygen` برای تولید یک کلید میزبان جدید با فرمت و الگوریتم مورد نظر استفاده کنید. بهعنوان مثال، میتوانید یک کلید میزبان ECDSA جدید با ۲۵۶ بیت را با اجرای دستور زیر در سرور تولید کنید:
ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key
با این کار، یک کلید جدید ایجاد خواهد شد که میتوانید آن را برای جایگزینی کلید قدیمی استفاده کنید.
این کار یک فایل کلید میزبان جدید به نام `ssh_host_ecdsa_key` و یک فایل کلید عمومی متناظر به نام `ssh_host_ecdsa_key.pub` در دایرکتوری `/etc/ssh/` ایجاد خواهد کرد. شما میتوانید بسته به ترجیحات خود، فرمت، الگوریتم یا نام فایل متفاوتی انتخاب کنید.
- پشتیبانگیری از کلید میزبان قدیمی در سرور SSH: پیش از جایگزینی کلید میزبان، از فایل کلید میزبان قدیمی و فایل کلید عمومی متناظر نسخه پشتیبان تهیه کنید تا در صورت نیاز به بازگردانی آنها، در دسترس باشند. از دستور cp برای کپی کردن فایلهای کلید میزبان قدیمی به یک مکان دیگر استفاده کنید. برای تهیه نسخه پشتیبان از فایلهای کلید میزبان ECDSA قدیمی، دستورات زیر را در سرور اجرا کنید:
sudo cp /etc/ssh/ssh_host_ecdsa_key /path/to/backup/location/ sudo cp /etc/ssh/ssh_host_ecdsa_key.pub /path/to/backup/location/
- بهروزرسانی پیکربندی سرور SSH برای استفاده از کلید میزبان جدید: پس از تهیه نسخه پشتیبان، فایل پیکربندی سرور SSH را در مسیر `/etc/ssh/sshd_config` ویرایش کنید تا موقعیت، فرمت و الگوریتم کلید میزبان جدید را مشخص کنید. دستور `HostKey` را باز یا اضافه کنید و مقدار آن را به نام فایل کلید میزبان جدید تنظیم کنید. بهعنوان مثال، برای بهروزرسانی پیکربندی سرور SSH جهت استفاده از فایل کلید میزبان ECDSA جدید، این خط را به فایل `/etc/ssh/sshd_config` اضافه کنید:
HostKey /etc/ssh/ssh_host_ecdsa_key
همچنین باید دستورهای `HostKeyAlgorithms` و `HostKeyFormat` را بهروز کنید تا با فرمت و الگوریتم جدید کلید میزبان مطابقت داشته باشند. برای این کار، خطوط زیر را به فایل `/etc/ssh/sshd_config` اضافه کنید:
HostKeyAlgorithms ecdsa-sha2-nistp256,ssh-rsa HostKeyFormat PEM
این تغییرات تضمین میکنند که سرور SSH از کلید میزبان جدید بهدرستی استفاده کند.
- سرور SSH را برای اعمال تغییرات مجدداً راهاندازی کنید: برای بارگذاری کلید میزبان و تنظیمات جدید، از دستور `systemctl` زیر استفاده کنید:
systemctl restart sshd
پس از جایگزینی کلید میزبان در سرور SSH، ضروری است که مشتریانی که به سرور متصل میشوند را از کلید میزبان جدید مطلع کنید. از آنها بخواهید ورودی کلید میزبان قدیمی را از فایل `known_hosts` خود حذف کرده و هنگام اتصال به سرور، کلید میزبان جدید را بپذیرند. بهعلاوه، میتوانید از رکوردهای DNS SSHFP برای انتشار کلید میزبان جدید استفاده کنید که در بخش بعدی به آن خواهیم پرداخت.
راهحل سوم: استفاده از گزینههای کلید SSH برای دور زدن تأیید
یکی دیگر از روشها برای رفع خطای تأیید کلید میزبان، استفاده از گزینههای کلید SSH بهمنظور دور زدن فرآیند تأیید است. این روش سریع و آسان است، اما همچنین بسیار پرخطر و ناامن میباشد.
دو گزینه کلید SSH وجود دارد که میتوانید از آنها برای دور زدن فرآیند تأیید استفاده کنید: `=o UserKnownHostsFile-` و `=o StrictHostKeyChecking-`. این گزینهها میتوانند در فرمان SSH یا در فایل پیکربندی استفاده شوند. در زیر نحوه کار آنها توضیح داده شده است:
- گزینه `=o UserKnownHostsFile-` به شما اجازه میدهد تا فایلی متفاوت، بهجای فایل پیشفرض `known_hosts` برای ذخیره کلیدهای میزبان مشخص کنید. با استفاده از این گزینه، میتوانید یک فایل خالی یا ساختگی را مشخص کنید که هیچ ورودی کلید میزبانی ندارد. این کار از بررسی کلید میزبان در برابر فایل `known_hosts` جلوگیری میکند و هر کلید میزبانی از سرور را قبول میکند. بهعنوان مثال، میتوانید این گزینه را برای مشخص کردن یک فایل خالی به نام `/dev/null` با استفاده از فرمان زیر استفاده کنید:
ssh -o UserKnownHostsFile=/dev/null user@server1
- گزینه `=o StrictHostKeyChecking-` به شما اجازه میدهد تا مشخص کنید SSH چگونه باید با تأیید کلید میزبان برخورد کند. میتوانید از این گزینه با تنظیم مقدار آن به `no` یا `accept-new` استفاده کنید که تأیید سختگیرانه کلید میزبان را غیرفعال میکند و هر کلید میزبانی جدید یا تغییر یافته از سرور را قبول میکند. بهعنوان مثال، میتوانید این گزینه را برای تنظیم مقدار آن به `no` با استفاده از فرمان زیر به کار ببرید:
ssh -o StrictHostKeyChecking=no user@server1
با استفاده از این گزینهها، شما در واقع به سرور بدون هیچگونه تأییدی اعتماد میکنید. بنابراین، فقط باید این گزینهها را بهطور موقت برای حل مشکل استفاده کنید و نه بهصورت دائمی. همچنین، باید این گزینهها را همراه با سایر تدابیر امنیتی، مانند کلیدهای SSH، رمزهای عبور یا گواهینامهها، برای تأیید هویت به سرور به کار ببرید.
سخن پایانی
در این مقاله، یاد گرفتیم که چگونه خطای عدم تطابق کلید میزبان در VPS برطرف کنیم و چگونه از بروز آن در آینده جلوگیری کنیم. با این چهار راهحل ساده، اکنون کنترل کامل بر کلیدهای میزبان SSH دارید. توجه داشته باشید که با تغییر سیستمها و پیکربندیها، کلیدها به تدریج تغییر میکنند، اما با این راهحلها، سازگاری به راحتی امکانپذیر است.