当使用 SSH 远程连接时,出现 Permission denied (publickey)
错误通常是由于 公钥认证 失败导致的。这意味着 SSH 服务器未能验证客户端的公钥,可能是由于以下几种常见原因:
解决方法:
1. 检查 SSH 公钥配置
- 确认客户端的公钥是否已添加到服务器的
~/.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"
- 你需要确保客户端的公钥已经被添加到服务器的
- 确认
authorized_keys
文件和~/.ssh
目录的权限设置- SSH 对于这些文件和目录有权限要求,确保
~/.ssh
目录权限为700
,authorized_keys
文件权限为600
,否则可能会导致权限错误。
chmod 700 ~/.ssh # 设置目录权限 chmod 600 ~/.ssh/authorized_keys # 设置文件权限
- SSH 对于这些文件和目录有权限要求,确保
2. 检查 SSH 服务配置(服务器端)
- 确保 SSH 配置文件中允许公钥认证
- 检查服务器端的 SSH 配置文件
/etc/ssh/sshd_config
,确认以下配置项是启用的:PubkeyAuthentication yes # 启用公钥认证 AuthorizedKeysFile .ssh/authorized_keys # 公钥文件的路径
- 检查服务器端的 SSH 配置文件
- 重启 SSH 服务
- 修改配置文件后,需要重启 SSH 服务使其生效:
sudo systemctl restart sshd
- 修改配置文件后,需要重启 SSH 服务使其生效:
3. 检查客户端的密钥文件
- 确认使用正确的密钥文件
- 如果你使用了多个 SSH 密钥文件(例如不同的密钥对用于不同的服务器),确保在连接时指定了正确的密钥。
- 可以通过
-i
参数指定密钥文件:ssh -i ~/.ssh/id_rsa user@hostname
- 确认客户端的私钥文件权限
- SSH 客户端要求私钥文件的权限必须是
600
,否则会拒绝使用该私钥文件进行连接。
chmod 600 ~/.ssh/id_rsa # 设置私钥文件权限
- SSH 客户端要求私钥文件的权限必须是
4. 检查密钥格式是否正确
- 确保密钥格式正确
- 公钥和私钥应该是正确的格式,尤其是
authorized_keys
文件中的公钥,应该没有被修改或损坏。 - 在某些情况下,复制或移动公钥时可能会发生格式错误,建议重新生成并复制密钥。
- 公钥和私钥应该是正确的格式,尤其是
5. 禁用密码认证(可选)
- 有时服务器可能配置了只允许公钥认证,但同时禁用了密码认证。可以通过编辑
sshd_config
文件中的以下行来启用密码认证:PasswordAuthentication yes # 允许使用密码登录(可选,非必需)
- 启用密码认证后,重新启动 SSH 服务:
sudo systemctl restart sshd
6. 调试 SSH 连接
- 使用
-v
启动调试模式- 启动 SSH 连接时使用
-v
(verbose)参数来查看详细的调试信息,这有助于找出具体的错误原因:ssh -v user@hostname
- 通过调试信息,你可以看到是否是公钥匹配失败,或者其他权限问题导致的认证失败。
- 启动 SSH 连接时使用
7. 检查 SELinux 或防火墙(如果适用)
- 确认 SELinux 配置是否阻止了 SSH
- 在某些 Linux 系统中,SELinux 的配置可能会阻止 SSH 使用正确的密钥进行认证。可以暂时禁用 SELinux 进行排查,或者查看 SELinux 日志。
sudo setenforce 0 # 临时禁用 SELinux(请谨慎使用)
- 检查防火墙配置
- 确保防火墙允许 SSH 连接,检查端口是否被屏蔽(通常是 22 端口):
sudo ufw allow ssh
- 确保防火墙允许 SSH 连接,检查端口是否被屏蔽(通常是 22 端口):
总结
当 SSH 连接时出现 Permission denied (publickey)
错误时,通常是因为公钥认证未能成功。常见的解决方案包括:
- 确保客户端的公钥已正确添加到服务器的
~/.ssh/authorized_keys
文件中。 - 检查并设置正确的文件权限 (
~/.ssh
目录权限为700
,authorized_keys
文件权限为600
)。 - 确认服务器的 SSH 配置允许公钥认证。
- 确保客户端使用正确的私钥文件,并且文件权限正确。
- 调试连接时使用
-v
选项查看详细的错误信息。
通过这些方法,你通常可以解决 SSH 公钥认证失败的问题。
发表回复