ssh登录报错Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password

ssh 密码登录报错Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password)

当我启动一个虚拟机,想要像往常一样使用密码登录的时候,

sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@127.0.0.1 -p 10087

注:这里俩个 '-p' ,第一个是密码,第二个是端口号

1763536346530

首先我检查端口是否正确监听

netstat -tlnp | grep 10087
ss -tlnp | grep 10087  

测试联通性

telnet 127.0.0.1 10087

查看sshd是否启用:若为active 则为启动

systemctl status sshd

检查防火墙是否开启

systemctl status firewalld

均检查没问题,于是怀疑是ssh配置问题,并且uncomment俩行设置

vi /etc/ssh/sshd_config

PasswordAuthentication yes  
PermitRootLogin yes               # 如果是PermitRootLogin prohibit-password,表示允许root登录,禁止使用密码登录,要comment这一行

然后重启sshd : systemctl restart sshd

但是问题没有被解决!

于是回头仔细看了一下报错:

Offending ED25519 key in /root/.ssh/known_hosts:2

Password authentication is disabled to avoid man-in-the-middle attacks.

在host上 /root/.ssh/known_hosts里有冲突的密钥,因为主机密钥不可信任,所以password authentication is disabled

于是 我删除了主机的knwon_hosts:

rm -rf /root/.ssh/known_hosts

然后启动虚拟机, 再ssh登录,这次可以了!

但是好久不长,又报错了

又去查看了虚拟机里/etc/sshd/ssh_config的结果

发现之前的设置小时了! 于是手动添加两行到config文件里

echo "PasswordAuthentication yes" >> /etc/ssh/ssh_config
echo "PermitRootLogin yes"  >> /etc/ssh/sshd_config

然后restart ssh服务

systemctl restart sshd

这次ssh 又可以登上了

总结一下吧: 遇到ssh 登不上,或者报错等信息,先检查端口是否监听,这个最重要!

netstat -tlnp | grep :22    #in vm
netstat -tlnp | grep 10087 # in host 

然后vm里检查ssh 配置

grep -E "PasswordAuthentication|PermitRootLogin|PubkeyAuthentication" /etc/ssh/sshd_config
 

如果都不行,再去宿主机检查,谨慎删除,如果有必要,建议只删除端口对应的那行:

cat /root/.ssh/known_hosts
[127.0.0.1]:10087 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAjistGUFk/qqiOkeqjZ4pXpgWDLF1vTFoJL8aW8v6T+

最后插个题外话,在解决问题的时候,有解决方案提到检查 ~/.ssh/authorized_keys 里的内容和 ~/.ssh/known_hosts 的内容,那他们有什么区别呢

先看了一个大佬的帖子,链接放在这里了哈: 使用RSA 密钥对进行 SSH 登录验证https://www.cnblogs.com/qiangxia/p/4211517.html)
讲的是如何生成密钥,并上传,附了加密原理

那么回到我们的主题,ssh的authoritized_keys 和 known_hosts到底有什么区别,这里我找到了大佬的回答: what-is-the-difference-between-authorized-keys-and-known-hosts-file-for-ssh

简述一下答案,

就是~/.ssh/known_hosts文件是存储着已经连接过的服务器,如果写在文件里面,客户端就可以检查服务器是已知服务器,而不是冒充的恶意服务器;
当然,首次连接服务器的时候,客人端会获取并记录服务器的公钥,在每次连接的时候,客户端都会比对已知的的公钥和服务器的公钥,来验证服务器的真实性.
如果您拥有已经连接的服务器的公钥,则可以在~/.ssh/known_hosts手动添加

另外,~/.ssh/known_hosts包含ssh支持的任意类型的公钥: DSA, RSA, ECDSA

那么客户端这边登录server的时候要有验证,是不是在server上也应该有文件对用户进行身份验证呢,
所以~/.ssh/authorized_keys就存着相对应的验证方式.
除了我们正常的密码登录,如果在server端的~/.ssh/authorized_keys文件下存着我们主机的公钥,是不是就可以直接登录了呢?

有时候服务器为了防止被黑,只允许被添加进~/.ssh/authorized_keys开发人员登录,所以如果客户证明他知道私钥,公钥在账户的授权列表中(~/.ssh/authorized_keys服务器端),则登录尝试被接受.

用户的私钥用于生成一个加密的身份验证请求,该请求将被发送到服务器,服务器会尝试使用authorized_keys文件中的公钥对其进行解密。

小结一下:known_hosts 存在客户端, authroized_key放在服务端

那我的情况是

服务器更换了密钥/系统重装
需要先删除旧的密钥记录,然后再更新~/.ssh/known_hosts 文件,添加新的公钥

ssh-keygen -R [hostname_or_IP]                               # delete old key 
ssh-keyscan -H [hostname_or_IP] >> ~/.ssh/known_hosts        #update new key of server 

或者也可以直接像我一样,移除~/.ssh/known_hosts 但是不推荐哦~

附:公钥加密技术

posted @ 2025-11-19 19:21  进击的huang  阅读(0)  评论(0)    收藏  举报