普通网友 2025-12-19 00:05 采纳率: 98.5%
浏览 4
已采纳

阿里云SSH连接报Permission denied (publickey)如何解决?

问题:使用SSH密钥登录阿里云ECS实例时,提示“Permission denied (publickey)”,无法正常连接。常见原因包括:密钥对未正确绑定实例、本地私钥文件权限过宽(如非600)、config配置错误、或sshd_config配置限制了密钥认证。此外,部分用户误将公钥内容手动写入`~/.ssh/authorized_keys`但格式不当,也会导致认证失败。如何排查并解决此类SSH公钥认证拒绝问题?
  • 写回答

1条回答 默认 最新

  • 白街山人 2025-12-19 00:05
    关注

    SSH公钥认证拒绝问题的系统性排查与解决方案

    1. 问题现象与初步定位

    当使用SSH密钥登录阿里云ECS实例时,出现“Permission denied (publickey)”错误,表示SSH服务端拒绝了客户端提供的公钥认证。该问题通常发生在以下场景:

    • 新创建的ECS实例未正确绑定密钥对
    • 本地私钥文件权限设置不当(如644而非600)
    • SSH配置文件(~/.ssh/config)中主机配置错误
    • 服务器端/etc/ssh/sshd_config禁用了公钥认证
    • 手动修改~/.ssh/authorized_keys时格式错误或权限不匹配

    此类问题虽常见,但涉及多个层次,需从网络、权限、配置和日志等维度综合分析。

    2. 常见原因分类与优先级排序

    序号可能原因发生频率排查难度
    1密钥对未绑定到ECS实例
    2私钥文件权限非600
    3sshd_config中PubkeyAuthentication被关闭
    4authorized_keys文件权限或格式错误
    5SSH config别名配置错误
    6SELinux或AppArmor安全策略限制
    7SSH守护进程未重启导致配置未生效
    8用户主目录权限过宽(如777)
    9公钥未正确导入authorized_keys
    10SSH客户端调试信息不足

    3. 排查流程图:结构化诊断路径

    graph TD
        A[SSH连接失败: Permission denied (publickey)] --> B{是否已绑定密钥对?}
        B -->|否| C[在阿里云控制台绑定密钥对]
        B -->|是| D{本地私钥权限是否为600?}
        D -->|否| E[chmod 600 ~/.ssh/id_rsa]
        D -->|是| F{~/.ssh/config配置正确?}
        F -->|否| G[修正Host、IdentityFile、User等字段]
        F -->|是| H{sshd_config允许公钥认证?}
        H -->|否| I[设置PubkeyAuthentication yes]
        H -->|是| J{authorized_keys是否存在且格式正确?}
        J -->|否| K[使用ssh-copy-id或手动追加公钥]
        J -->|是| L{文件及目录权限是否合规?}
        L -->|否| M[修复权限: 700 ~/.ssh, 600 authorized_keys]
        L -->|是| N[检查SELinux/AppArmor日志]
        N --> O[启用详细日志: ssh -vvv user@host]
    

    4. 深入排查步骤详解

    1. 确认密钥对绑定状态:登录阿里云控制台,进入ECS实例详情页,查看“密钥对”标签是否显示已绑定目标密钥。若未绑定,可通过“更换密钥对”功能重新关联。
    2. 验证私钥权限:执行 ls -l ~/.ssh/id_rsa,确保输出权限为 -rw-------。若非此值,运行 chmod 600 ~/.ssh/id_rsa
    3. 检查SSH客户端配置:编辑 ~/.ssh/config,确保包含如下内容:
      Host my-ecs
          HostName 123.456.789.012
          User root
          IdentityFile ~/.ssh/id_rsa
          Port 22
      
    4. 登录服务器检查sshd_config:通过VNC或密码登录后,检查 /etc/ssh/sshd_config 中以下参数:
      PubkeyAuthentication yes
      AuthorizedKeysFile .ssh/authorized_keys
      PasswordAuthentication no
      
      修改后需执行 systemctl restart sshd
    5. 验证authorized_keys内容:确保公钥以完整一行形式存在,无换行或多余字符。可使用 ssh-keygen -y -f ~/.ssh/id_rsa 输出公钥比对。
    6. 修复文件系统权限:执行以下命令:
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
      chown -R $USER:$USER ~/.ssh
      
    7. 启用SSH详细日志:使用 ssh -vvv user@host 观察认证过程,重点关注“Offering public key”和“Server accepts key”等日志片段。
    8. 检查安全模块干扰:运行 ausearch -m avc -ts recent(SELinux)或查看dmesg输出,判断是否有访问拒绝记录。
    9. 测试密钥有效性:在服务端使用 ssh-keygen -lf ~/.ssh/authorized_keys 验证公钥指纹是否匹配。
    10. 考虑SSH代理问题:若使用ssh-agent,确认密钥已添加:ssh-add -l 查看列表,必要时 ssh-add ~/.ssh/id_rsa
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月20日
  • 创建了问题 12月19日