SSH 权限拒绝 (publickey) 问题的故障排除

使用 SSH 时遇到“Permission Denied (publickey)”错误了吗?本指南提供了一个全面的解决步骤,以修复这个常见的身份验证错误。了解如何仔细验证 SSH 密钥对,诊断客户端和服务器上不正确的文件权限,并确保您的 `authorized_keys` 文件配置正确。通过实用示例和分步说明,您将重新获得对远程系统的安全访问。

29 浏览量

SSH“权限被拒绝 (publickey)”问题的故障排除

当尝试通过SSH连接到远程服务器时,遇到“权限被拒绝 (publickey)”错误可能会成为一个令人沮丧的障碍。此错误专门指出服务器因无法使用您的公钥进行身份验证而拒绝了您的连接。与基于密码的身份验证不同,公钥加密依赖于一对密钥:一个私钥保存在您的本地计算机上,一个公钥放在服务器上。本指南将引导您了解此错误的常见原因,并提供详细的步骤来诊断和解决这些问题,确保安全无缝的SSH访问。

理解SSH公钥身份验证过程对于有效故障排除至关重要。当您尝试连接时,您的SSH客户端会将您的公钥呈现给服务器。然后,服务器会检查该公钥是否已为您的用户帐户授权。如果是,服务器会使用您的公钥加密一个挑战并将其发送回来。您的客户端拥有相应的私钥,它会解密挑战并将响应发送回服务器。如果响应正确,身份验证将成功。“权限被拒绝 (publickey)”错误意味着此交换在某个环节失败了。

“权限被拒绝 (publickey)”的常见原因

“权限被拒绝 (publickey)”错误可能源于几个配置问题。识别根本原因通常需要系统地检查以下组件:

  • 文件权限不正确: 出于安全原因,SSH对文件和目录权限非常敏感。本地~/.ssh目录、私钥文件,或服务器端的~/.ssh目录和authorized_keys文件权限不正确都可能阻止身份验证。
  • authorized_keys条目丢失或不正确: 服务器的authorized_keys文件必须包含您尝试登录的用户的正确公钥。如果密钥丢失、格式错误或与错误的用户关联,身份验证将失败。
  • 密钥对关联不正确: 您的SSH客户端可能提供了错误的私钥,或者服务器的authorized_keys文件中可能未列出相应的公钥。
  • SSH Agent问题: 如果您正在使用SSH Agent,它可能没有正确加载您的私钥,或者配置不正确。
  • 服务器端SSH配置: 尽管对于此特定错误来说不太常见,但服务器的SSH守护进程配置(sshd_config)可能对公钥身份验证有限制。

分步故障排除指南

让我们深入探讨诊断和修复这些问题的实际步骤。

1. 验证本地私钥和权限

首先检查您的本地SSH配置。确保您的私钥可访问且权限正确。

检查私钥是否存在

您的私钥通常位于~/.ssh/id_rsa(或id_ed25519id_dsa等)。

验证本地文件权限

~/.ssh目录和您的私钥文件应具有严格的权限,以防止未经授权的访问。

  • ~/.ssh目录: 应为700 (drwx------)。
  • 私钥文件(例如 id_rsa): 应为600 (-rw-------)。

使用chmod命令设置正确的权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

提示:如果您使用的是其他密钥名称,请将id_rsa替换为您的实际私钥文件名。

2. 验证服务器端authorized_keys配置

这通常是最常见的原因。服务器必须为您尝试身份验证的用户正确列出您的公钥。

访问服务器(如果可能)

如果您仍然可以通过其他方式访问服务器(例如,密码身份验证、另一个用户帐户或控制台),请登录以检查authorized_keys文件。

检查authorized_keys文件位置

authorized_keys文件通常位于您尝试登录的用户的家目录下的~/.ssh/authorized_keys

验证服务器端文件权限

与客户端类似,服务器端的权限也至关重要:

  • 服务器上的~/.ssh目录: 应为700 (drwx------)。
  • 服务器上的authorized_keys文件: 应为600 (-rw-------)。

确保在服务器上正确设置了这些权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
验证authorized_keys内容

使用文本编辑器(例如 nanovim)打开~/.ssh/authorized_keys文件。每个公钥都应占一行。确保您期望使用的公钥存在且格式正确。它应该以ssh-rsassh-ed25519或类似的开头,后跟长串字符,以及可选的注释。

示例 authorized_keys条目:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD... your_public_key_string user@hostname

重要提示:不要将您的私钥添加到authorized_keys。此处只能包含公钥。

3. 确保添加了正确的公钥

可能复制了错误的公钥,或者服务器上的公钥与您的本地私钥不匹配。

检索本地公钥

您的公钥是您私钥的对应项。您可以使用ssh-keygen命令查看它:

cat ~/.ssh/id_rsa.pub

此命令将输出您的公钥。请仔细比较此输出与服务器~/.ssh/authorized_keys文件中的条目。即使是单个拼写错误或遗漏的字符也会导致身份验证失败。

提示:如果您有服务器的密码访问权限,可以使用ssh-copy-id快速添加您的公钥。

ssh-copy-id user@your_server_ip

此命令会自动将您的默认公钥(~/.ssh/id_rsa.pub)追加到远程服务器上的~/.ssh/authorized_keys文件中,并设置正确的权限。

4. 指定正确的私钥(如果不是默认的)

如果您使用的是非默认私钥(例如 ~/.ssh/my_other_key),则需要告诉SSH客户端使用哪个密钥。

使用-i标志

您可以使用-i选项指定身份文件(私钥):

ssh -i ~/.ssh/my_other_key user@your_server_ip
配置~/.ssh/config

为了方便起见,您可以配置SSH客户端为特定主机始终使用特定密钥:

在本地计算机上创建或编辑~/.ssh/config文件,并添加类似以下的条目:

Host your_server_alias
  HostName your_server_ip_or_domain
  User your_username
  IdentityFile ~/.ssh/my_other_key

然后,您只需使用以下命令连接:

ssh your_server_alias

5. 检查SSH Agent状态

如果您依赖SSH Agent来管理密钥,请确保它正在运行并且已加载了您的密钥。

检查Agent是否正在运行
echo "$SSH_AUTH_SOCK"

如果此命令输出一个路径,则Agent可能正在运行。如果为空,您可能需要启动一个。

将密钥添加到Agent

如果您的密钥未加载,请添加它:

ssh-add ~/.ssh/id_rsa

如果提示输入密码短语,请输入。您可以使用ssh-add -l命令验证已添加的密钥。

6. 使用详细模式进行调试

SSH具有详细模式(-v-vv-vvv用于增加详细程度),可以提供有关身份验证过程失败位置的宝贵线索。

ssh -vvv user@your_server_ip

检查输出中与密钥身份验证、提供密钥和服务器响应相关的消息。这通常会直接指向问题所在。

示例详细输出片段,指示公钥身份验证失败:

debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/user/.ssh/id_rsa
debug1: read PEM private key file /home/user/.ssh/id_rsa
debug1: failed to use sshkey: /home/user/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: password

此输出可能表明客户端尝试使用id_rsa但失败了,然后继续尝试其他方法。

7. 服务器端sshd_config审查(高级)

尽管对于publickey特定的错误来说不太常见(通常会出现其他错误),但值得注意的是服务器的SSH守护进程配置文件(/etc/ssh/sshd_config)。请确保PubkeyAuthentication yes未被注释掉并且设置为yes。进行任何更改后,必须重新加载或重启SSH服务(例如,sudo systemctl reload sshdsudo systemctl restart sshd)。

总结和最佳实践

对SSH“权限被拒绝 (publickey)”错误的故障排除涉及对客户端和服务器配置的系统性检查。最常见的原因与~/.sshauthorized_keys文件的文件权限不正确,以及服务器上的公钥与客户端上的私钥不匹配有关。

关键要点:

  • 权限至关重要: 始终确保客户端和服务器上的~/.ssh700,私钥/authorized_keys600
  • 公钥准确性: 仔细检查服务器的authorized_keys文件中是否存在正确的公钥。
  • 使用ssh-copy-id 如果可能,这是设置公钥身份验证最安全、最简单的方法。
  • 详细模式: 利用ssh -vvv获取详细的诊断输出。

通过遵循这些步骤,您应该能够诊断和解决大多数“权限被拒绝 (publickey)”问题,恢复对服务器的安全远程访问。