当使用 SSH 远程连接时,出现 Permission denied (publickey) 错误通常是由于 公钥认证 失败导致的。这意味着 SSH 服务器未能验证客户端的公钥,可能是由于以下几种常见原因:

解决方法:

1. 检查 SSH 公钥配置

  1. 确认客户端的公钥是否已添加到服务器的 ~/.ssh/authorized_keys 文件中
    • 你需要确保客户端的公钥已经被添加到服务器的 ~/.ssh/authorized_keys 文件中。
    • 在客户端生成的公钥(通常是 id_rsa.pub 或 id_ecdsa.pub)应该复制到服务器上的 ~/.ssh/authorized_keys 文件中。
    在客户端生成公钥和私钥(如果没有的话)ssh-keygen -t rsa -b 2048 # 默认会在 ~/.ssh 目录下生成 id_rsa 和 id_rsa.pub 将公钥复制到服务器
    • 可以使用 ssh-copy-id 工具将公钥传送到服务器上:ssh-copy-id user@hostname
    • 或者手动将公钥添加到服务器的 ~/.ssh/authorized_keys 文件中:cat ~/.ssh/id_rsa.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
  2. 确认 authorized_keys 文件和 ~/.ssh 目录的权限设置
    • SSH 对于这些文件和目录有权限要求,确保 ~/.ssh 目录权限为 700authorized_keys 文件权限为 600,否则可能会导致权限错误。
    chmod 700 ~/.ssh # 设置目录权限 chmod 600 ~/.ssh/authorized_keys # 设置文件权限

2. 检查 SSH 服务配置(服务器端)

  1. 确保 SSH 配置文件中允许公钥认证
    • 检查服务器端的 SSH 配置文件 /etc/ssh/sshd_config,确认以下配置项是启用的:PubkeyAuthentication yes # 启用公钥认证 AuthorizedKeysFile .ssh/authorized_keys # 公钥文件的路径
  2. 重启 SSH 服务
    • 修改配置文件后,需要重启 SSH 服务使其生效:sudo systemctl restart sshd

3. 检查客户端的密钥文件

  1. 确认使用正确的密钥文件
    • 如果你使用了多个 SSH 密钥文件(例如不同的密钥对用于不同的服务器),确保在连接时指定了正确的密钥。
    • 可以通过 -i 参数指定密钥文件:ssh -i ~/.ssh/id_rsa user@hostname
  2. 确认客户端的私钥文件权限
    • SSH 客户端要求私钥文件的权限必须是 600,否则会拒绝使用该私钥文件进行连接。
    chmod 600 ~/.ssh/id_rsa # 设置私钥文件权限

4. 检查密钥格式是否正确

  1. 确保密钥格式正确
    • 公钥和私钥应该是正确的格式,尤其是 authorized_keys 文件中的公钥,应该没有被修改或损坏。
    • 在某些情况下,复制或移动公钥时可能会发生格式错误,建议重新生成并复制密钥。

5. 禁用密码认证(可选)

  • 有时服务器可能配置了只允许公钥认证,但同时禁用了密码认证。可以通过编辑 sshd_config 文件中的以下行来启用密码认证:PasswordAuthentication yes # 允许使用密码登录(可选,非必需)
  • 启用密码认证后,重新启动 SSH 服务:sudo systemctl restart sshd

6. 调试 SSH 连接

  1. 使用 -v 启动调试模式
    • 启动 SSH 连接时使用 -v(verbose)参数来查看详细的调试信息,这有助于找出具体的错误原因:ssh -v user@hostname
    • 通过调试信息,你可以看到是否是公钥匹配失败,或者其他权限问题导致的认证失败。

7. 检查 SELinux 或防火墙(如果适用)

  1. 确认 SELinux 配置是否阻止了 SSH
    • 在某些 Linux 系统中,SELinux 的配置可能会阻止 SSH 使用正确的密钥进行认证。可以暂时禁用 SELinux 进行排查,或者查看 SELinux 日志。
    sudo setenforce 0 # 临时禁用 SELinux(请谨慎使用)
  2. 检查防火墙配置
    • 确保防火墙允许 SSH 连接,检查端口是否被屏蔽(通常是 22 端口):sudo ufw allow ssh

总结

当 SSH 连接时出现 Permission denied (publickey) 错误时,通常是因为公钥认证未能成功。常见的解决方案包括:

  • 确保客户端的公钥已正确添加到服务器的 ~/.ssh/authorized_keys 文件中。
  • 检查并设置正确的文件权限 (~/.ssh 目录权限为 700authorized_keys 文件权限为 600)。
  • 确认服务器的 SSH 配置允许公钥认证。
  • 确保客户端使用正确的私钥文件,并且文件权限正确。
  • 调试连接时使用 -v 选项查看详细的错误信息。

通过这些方法,你通常可以解决 SSH 公钥认证失败的问题。