首先需要确认自己是使用默认的id_rsa私钥,还是通过~/.ssh/config
文件的IdentityFile参数来使用指定的rsa私钥进行公钥认证的。如果是通过默认的rsa密钥进行公钥认证,则可以跳过第一步,否则请看完。
1. 查看SSH客户端的~/.ssh/config
文件,确认常用参数是否以如下格式编辑:
Host <Alias1> <Alias2> ...
HostName <IP_Address_or_HostName>
User <UserName>
Port <Port>
IdentityFile <~/.ssh/private_key>
注意:在SSH公钥验证过程中,使用的是
~/.ssh/config
文件中定义的Host
参数(Alias),而不是HostName
参数(IP_Address_or_HostName)。因此如果用配置文件中不存在的Alias进行SSH连接,就会导致SSH服务器无法进行公钥验证,从而要求你输入用户登录密码进行验证。
2. 检查密钥文件权限
-
SSH服务器
使用ll -a ~/.ssh
命令查看目录及文件权限状态,确保~/.ssh
目录权限必须是700(rwx------),~/.ssh/authorized_keys
文件权限必须是600(rw-------)。chmod 700 ~/.ssh #或chmod u=rwx,g=,o= chmod 600 ~/.ssh/authorized_keys #或chmod u=rw,g=,o=
提示:如果你是使用
ssh-copy-id
命令在SSH服务器上添加的公钥,则可以省略此步骤,因为因为ssh-copy-id
命令会自动设置正确的文件权限。 -
SSH客户端
使用ll -a ~/.ssh
命令查看目录及文件权限状态,确保/.ssh
目录权限必须是700(rwx------),~/.ssh/config
文件权限必须是600(rw-------)。(https://man.openbsd.org/ssh_config#FILES)chmod 700 ~/.ssh #或chmod u=rwx,g=,o= chmod 600 ~/.ssh/config #或chmod u=rw,g=,o=
提示:
/etc/ssh/sshd_config
SSH服务器配置文件文件保持初始时的默认配置即可,因为默认配置已经考虑了安全性(公钥认证默认注释状态,即开启状态)和稳定方面的问题,无需过多修改。
3. SSH连接时使用-vvv
选项来增加SSH客户端的详细调试输出
- 未指定私钥的:
ssh -vvv UserName@IP_Address_or_HostName
- 指定了私钥的:
ssh -vvv UserName@Alias
-
若出现类似以下的调试信息,则表明指定的私钥未生效,只使用了默认私钥进行认证,建议检查客户端
~/.ssh/config
配置文件:debug1: Will attempt key: /c/Users/xxx/.ssh/id_ecdsa debug1: Will attempt key: /c/Users/xxx/.ssh/id_ecdsa_sk debug1: Will attempt key: /c/Users/xxx/.ssh/id_ed25519 debug1: Will attempt key: /c/Users/xxx/.ssh/id_ed25519_sk debug1: Will attempt key: /c/Users/xxx/.ssh/id_xmss debug1: Will attempt key: /c/Users/xxx/.ssh/id_dsa
-
若出现类似以下的调试信息,则表明
~/.ssh/authorized_keys
文件权限设置有问题,建议按照第二步重新检查权限设置:Authentication refused: bad ownership or modes for file ~/.ssh/authorized_keys
提示:可通过
ssh -i ~/.ssh/private_key UserName@Alias
命令指定使用特定的密钥文件进行本次身份验证。 -
若出现类似以下的调试信息,则表明服务器上没有找到匹配的公钥,这可能是因为它没有被你正确的添加到
~/.ssh/authorized_keys
文件中,建议检查两端的公钥是否一致:debug: we did not send a packet, disable method debug: authmethod_lookup password