رفع خطای Permission denied (publickey) در SSH؛ راهنمای کامل و قدمبهقدم (۲۰۲۶)
برای اتصال به سرور، دستور ssh رو میزنی و به جای ورود، این پیام جلوت میاد:
user@203.0.113.10: Permission denied (publickey).
یا شاید هم این شکلش:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
نگران نباش. این یکی از رایج ترین ارورهای SSH هست و تقریبا همه ی ما یه بار باهاش روبه رو شدیم. خبر خوب اینه که معمولا راه حلش سادست و کافیه ببینی مشکل از کدوم بخش ماجرا هست. توی این مقاله قدم به قدم میریم جلو تا مشکلت حل بشه.
جواب کوتاه: چک لیست سریع رفع Permission denied (publickey)
اگه عجله داری، اول این موارد رو به ترتیب چک کن:
- نام کاربری درسته؟ (مثلا
root،ubuntu،debianیاalmalinuxبسته به سرور) - کلید خصوصی درست رو به SSH معرفی کردی؟ (با گزینهی
-i) - کلید عمومی (public key) روی سرور توی
~/.ssh/authorized_keysهست؟ - سطح دسترسی (permission) پوشهی
.sshو فایلها درسته؟ (۷۰۰ و ۶۰۰) - تنظیمات
sshd_configورود با کلید رو اجازه میده؟ - لاگ سرور و خروجی
ssh -vچی میگه؟
اگه با اینها حل نشد، ادامه ی مقاله رو بخون؛ هر مورد رو جداگانه توضیح میدیم.
ارور Permission denied (publickey) یعنی چی؟
توی SSH دو روش اصلی ورود وجود داره: رمز عبور و کلید (Key). وقتی سرور فقط ورود با کلید رو قبول میکنه (که از نظر امنیتی هم بهتره) و کلیدی که تو میفرستی رو نشناسه، همین پیام رو میبینی.
ساده تر بگیم: انگار یه قفل و کلید داریم. قفل (کلید عمومی) روی سرور نصب شده و کلید (کلید خصوصی) پیش توئه. این ارور یعنی یا کلید اشتباهه، یا قفل درست نصب نشده، یا سرور اجازه نمیده با اون کلید وارد بشی.
یه نکته ی مهم: این ارور به معنی خراب بودن سرور نیست. سرور سالمه و داره درست کار میکنه؛ فقط تو رو بهعنوان کاربر مجاز نمیشناسه.
قدم اول: بفهم دقیقا مشکل کجاست (ssh -v)
به جای حدس زدن، بذار خود SSH بهت بگه چه خبره. دستور رو با حالت verbose بزن:
ssh -v user@203.0.113.10
اگه اطلاعات بیشتری میخوای، -vv یا -vvv هم بزن. توی خروجی این بخشها رو دنبال کن:
Offering public key: ...یعنی SSH داره یه کلید رو به سرور پیشنهاد میده. اگه اصلا این خط نیست، یعنی کلیدی پیدا نکرده.Authentications that can continue: publickeyیعنی سرور فقط ورود با کلید رو قبول میکنه.no such identityیعنی مسیر فایل کلیدی که دادی اشتباهه.Too many authentication failuresیعنی SSH کلیدهای زیادی رو امتحان کرده و سرور قطع کرده.
این خروجی نصف کار تشخیص رو انجام میده. حالا بریم سراغ علت ها.
علت ۱: نام کاربری اشتباهه
خیلی وقت ها مشکل همینه. هر سروری یه کاربر پیش فرض داره و اگه با اسم دیگه ای وارد بشی، ارور میگیری. چند نمونه ی رایج:
- Ubuntu: کاربر
ubuntuیاroot - Debian: کاربر
debianیاroot - AlmaLinux و Rocky: کاربر
almalinuxیاroot - Amazon Linux: کاربر
ec2-user
بسته به سرویس دهندت، ممکنه فقط root فعال باشه یا کاربر دیگه ای بهت داده شده باشه. اسم کاربر رو از پنل یا ایمیل تحویل سرور چک کن.
علت ۲: کلید خصوصی درست رو معرفی نکردی
اگه چند تا کلید داری یا کلید توی مسیر پیش فرض نیست، باید صریحا بگی از کدوم استفاده کنه:
ssh -i ~/.ssh/id_ed25519 user@203.0.113.10
برای اینکه هر بار این رو ننویسی، میتونی توی فایل ~/.ssh/config یه تنظیم بذاری:
Host myserver
HostName 203.0.113.10
User ubuntu
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
بعدش فقط مینویسی ssh myserver و تمام.
یه چیز دیگه: مطمئن شو کلید خصوصی رو معرفی کردی، نه فایل .pub. فایل .pub همون کلید عمومیه و برای ورود به درد نمیخوره.
علت ۳: کلید عمومی روی سرور نصب نشده
این هم خیلی رایجه. باید محتوای کلید عمومیت (فایلی که با .pub تموم میشه) توی فایل زیر روی سرور باشه:
~/.ssh/authorized_keys
اگه هنوز کلید نساختی، اینطوری یه کلید مدرن و امن (Ed25519) بساز:
ssh-keygen -t ed25519 -C "your_email@example.com"
بعد با دستور زیر کلید عمومی رو به سرور بفرست (البته این کار وقتی جواب میده که هنوز یه راه ورود، مثلا رمز عبور، داشته باشی):
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.10
اگه ورود با رمز بستست، باید از کنسول (Console/VNC) پنل سرویس دهنده وارد بشی و کلید رو دستی توی authorized_keys بذاری. هر کلید باید توی یه خط کامل باشه و با ssh-ed25519 یا ssh-rsa شروع بشه. اگه کلید رو کپی کردی و وسطش اینتر خورده، کار نمیکنه.
نکته برای کسایی که VPS میگیرن: بعضی پنلها کلید SSH رو فقط موقع ساخت سرور روش نصب میکنن. اگه بعداً کلید رو توی پنل عوض کنی، ممکنه روی سرورهای قبلی اعمال نشه و باید دستی اضافهش کنی.
علت ۴: سطح دسترسی فایلها اشتباهه (permission)
SSH خیلی روی امنیت حساسه. اگه پوشه ی .ssh یا فایل های داخلش دسترسی بازتری از حد لازم داشته باشن، سرور کلید رو نادیده میگیره و فقط میگه Permission denied (publickey).
روی سرور این دستورها رو بزن (بهجای user اسم کاربر خودت):
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R user:user ~/.ssh
یه مورد دیگه: خود پوشه ی home هم نباید برای گروه یا بقیه قابل نوشتن باشه. اگه این طوره:
chmod go-w ~
روی کامپیوتر خودت هم کلید خصوصی باید فقط برای خودت قابل خواندن باشه:
chmod 600 ~/.ssh/id_ed25519
اگه این رو رعایت نکرده باشی، خودت هم ارور UNPROTECTED PRIVATE KEY FILE رو میبینی.
علت ۵: تنظیمات sshd_config
تنظیمات SSH سرور توی فایل /etc/ssh/sshd_config هست. برای ورود با کلید، اینها باید درست باشن:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
برای دیدن تنظیمات فعال سرور:
sudo sshd -T | grep -Ei 'pubkeyauthentication|passwordauthentication|permitrootlogin|authorizedkeysfile'
یه چیز مهم درباره ی PermitRootLogin: اگه روی no باشه، با کاربر root نمیتونی وارد بشی، حتی با کلید درست. اگه روی prohibit-password باشه، root فقط با کلید وارد میشه نه رمز.
بعد از هر تغییر، اول تنظیمات رو تست کن و بعد سرویس رو ری استارت کن:
sudo sshd -t sudo systemctl restart ssh # Ubuntu و Debian sudo systemctl restart sshd # AlmaLinux و Rocky
هشدار: قبل از ری استارت، یه نشست SSH دیگه رو باز نگه دار؛ اگه تنظیم اشتباه باشه، از سرور بیرون نمی افتی.
علت ۶: مشکل نوع یا نسخهی کلید
نسخه های جدید OpenSSH سخت گیرترن. بعضی کلیدها و الگوریتم های قدیمی (مثل DSA یا امضاهای SHA-1 با ssh-rsa) یا غیرفعال شدن یا پیشفرض نیستن. اگه کلیدت قدیمیه یا سرور و کلاینت خیلی قدیمین، ممکنه این ارور بیاد.
راه حل ساده و بلندمدت: یه کلید Ed25519 بساز و استفاده کن:
ssh-keygen -t ed25519
اگه به هر دلیلی باید RSA بسازی، حداقل ۳۰۷۲ بیت بزن:
ssh-keygen -t rsa -b 4096
علت ۷: خطای Too many authentication failures
اگه چند تا کلید توی ssh-agent داری، SSH همه رو یکی یکی امتحان میکنه و ممکنه قبل از رسیدن به کلید درست، سرور ارتباط رو قطع کنه (بهخاطر MaxAuthTries). راهش اینه که فقط کلید مشخصی رو بفرسته:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@203.0.113.10
یا همون IdentitiesOnly yes رو توی فایل config بذار.
علت ۸: SELinux (مخصوص AlmaLinux، Rocky و CentOS)
روی سیستم عامل های خانوادهی RHEL، حتی اگه permission درست باشه، SELinux ممکنه جلوی خوندن authorized_keys رو بگیره (معمولا بعد از اینکه فایل رو از جای دیگه کپی کردی). این دستور برچسب ها رو درست میکنه:
restorecon -Rv ~/.ssh
علت ۹: ارور Permission denied (publickey) در GitHub و GitLab
بخش بزرگی از کسایی که این ارور رو سرچ میکنن موقع git clone یا git push بهش میخورن:
git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.
این یعنی GitHub کلید SSH تو رو نمیشناسه. مراحل رفع:
- کلید بساز (اگه نداری):
ssh-keygen -t ed25519 -C "your_email@example.com" - محتوای کلید عمومی رو ببین:
cat ~/.ssh/id_ed25519.pub - توی GitHub برو به Settings ← SSH and GPG keys ← New SSH key و کلید رو اضافه کن.
- کلید رو به
ssh-agentبده:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519
- اتصال رو تست کن:
ssh -T git@github.com
اگه پیام خوش آمدگویی دیدی، همهچی درسته. برای GitLab هم همین روند رو داری، فقط آدرس git@gitlab.com میشه.
علت ۱۰: مشکل در ویندوز (PuTTY و PowerShell)
اگه با PuTTY وصل میشی، کلیدهای OpenSSH مستقیم کار نمیکنن. باید فایل کلید رو با PuTTYgen به فرمت .ppk تبدیل کنی و توی بخش Connection ← SSH ← Auth ← Credentials معرفی کنی. فراموش نکن اسم کاربر رو هم توی Connection ← Data وارد کنی.
اگه از PowerShell یا Windows Terminal استفاده میکنی، دستور ssh مثل لینوکس کار میکنه و همون روش های بالا درسته.
وقتی کلا از سرور بیرون موندی چی کار کنیم؟
اگه هیچ راه ورودی نداری (رمز بستست و کلید هم کار نمیکنه)، نترس. راه های معمول:
- کنسول وب یا VNC پنل سرویس دهنده: مستقل از SSH وصل میشه و میتونی کلید رو درست کنی.
- حالت Rescue: بیشتر سرویس دهنده ها اجازه میدن سرور رو با یه سیستم موقت بوت کنی و فایل ها رو درست کنی.
- درخواست به پشتیبانی: اگه هیچ کدوم کار نکرد، پشتیبانی میتونه کمک کنه.
اگه موقتا ورود با رمز رو روشن کردی تا کارت راه بیفته، بعد از رفع مشکل حتما دوباره غیرفعالش کن (PasswordAuthentication no)؛ چون ورود با رمز روی اینترنت هدف حمله ی بروت فورس میشه.
لاگ سرور رو چک کن: قابل اعتمادترین راه تشخیص
اگه به سرور دسترسی داری (مثلا از کنسول)، لاگ دقیق ترین جواب رو میده:
sudo tail -f /var/log/auth.log # Ubuntu و Debian sudo tail -f /var/log/secure # AlmaLinux و Rocky sudo journalctl -u ssh -f # با systemd (روی RHEL: -u sshd)
بعد توی یه ترمینال دیگه دوباره وصل شو و پیام سرور رو ببین. پیام هایی مثل این معنی دقیقی دارن:
Authentication refused: bad ownership or modes for directoryیعنی مشکل permission یا مالک (علت ۴).Failed publickey for userیعنی کلید با اونهایی که روی سرور هست نمیخونه.User xxx not allowedیعنی کاربر تویAllowUsersمجاز نشده یا قفل شده.
چطور دیگه این ارور رو نبینیم؟
- یه کلید Ed25519 بساز و برای هر دستگاهت کلید جدا داشته باش.
- فایل
~/.ssh/configدرست کن تا اسم کاربر و کلید هر سرور مشخص باشه. - بعد از اضافه کردن کلید جدید، قبل از بستن نشست فعلی تست کن که وارد میشی.
- ورود با رمز رو بعد از راه اندازی کلید خاموش کن و ورود مستقیم
rootرو هم ببند. - از کلید خصوصیت بکاپ امن بگیر و هیچ وقت اون رو برای کسی نفرست.
سوالهای پرتکرار
Permission denied (publickey) یعنی چی؟
یعنی سرور فقط ورود با کلید رو قبول میکنه و کلیدی که فرستادی رو نشناخته یا نپذیرفته.
چرا با رمز عبور نمیتونم وارد بشم و فقط publickey میگه؟
چون ورود با رمز روی سرور غیرفعاله (PasswordAuthentication no). باید با کلید وارد بشی یا از کنسول سرویس دهنده کمک بگیری.
ارور Permission denied (publickey) در Ubuntu چطور رفع میشه؟
نام کاربر، معرفی کلید خصوصی، وجود کلید عمومی توی authorized_keys و سطح دسترسی پوشه ی .ssh رو چک کن. بعدش با ssh -v و لاگ /var/log/auth.log علت دقیق رو پیدا کن.
فرق کلید عمومی و خصوصی چیه؟
کلید عمومی (.pub) رو میشه روی هر سروری گذاشت. کلید خصوصی فقط پیش خودته و نباید به کسی داده بشه.
ssh-copy-id کار نمیکنه، چی کار کنم؟
اگه ورود با رمز بستست، ssh-copy-id هم کار نمیکنه. از کنسول سرویس دهنده وارد شو و کلید عمومی رو دستی توی authorized_keys اضافه کن.
ارور publickey توی git push رو چطور حل کنم؟
کلید SSH رو به حساب GitHub یا GitLab اضافه کن، با ssh-add به agent بده و با ssh -T git@github.com تست کن.
ریستارت کردن سرور مشکل رو حل میکنه؟
معمولا نه. این ارور مربوط به احراز هویت و تنظیمات کلیده، نه خراب بودن سرویس.
جمع بندی
ارور Permission denied (publickey) ترسناک به نظر میرسه، ولی تقریبا همیشه از یکی از این چند علت میاد: نام کاربری اشتباه، کلید معرفینشده، کلید عمومی نصبنشده، permission غلط یا تنظیمات sshd. با ssh -v و لاگ سرور هم خیلی سریع میتونی علت رو پیدا کنی.