当前位置: 首页 > news >正文

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_configPasswordAuthentication 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 但是不推荐哦~

附:公钥加密技术

http://www.jsqmd.com/news/44888/

相关文章:

  • Bisq交易协议全解析:从多签到MuSig的技术演进
  • 十六岁的断章
  • 浅谈 fhq-treap —— 或是 Splay 的不二选择?
  • vba 处理特定段落前的表观空行中的分页符
  • 人工智能之编程进阶 Python高级:第六章 文件类模块
  • PQ v.Next Alpha阶段发布
  • 国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用
  • 三分稀疏图染色的多项式时间证明
  • 251119
  • 实用指南:分布式架构未来趋势:从云原生到智能边缘的演进之路
  • 人工智能之编程进阶 Python高级:第七章 数据库类模块
  • linux for 跳出循环
  • 用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常?
  • Linux用户管理相关知识
  • AI浪潮下的机遇与挑战:从巨头动态看未来趋势
  • CCF GESP 五级真题考频与知识点速查表
  • 推迟win11更新137年的方法
  • linux for 死循环
  • 注册表禁用/启用Windows系统更新
  • Linux for OneNote
  • linux for in seq
  • 高级程序语言设计第6次
  • 深入解析:Flink 实验性特性把“已预分区”的 DataStream 重新解释为 KeyedStream
  • 用最纯粹的白话,解析 AI Memory
  • 2025苏州代理记账口碑榜:3 家靠谱机构/公司出圈,财税服务选对不踩坑!
  • 完整教程:电脑控制DFPlayer Mini MP3播放音乐
  • 2025-11-19 早报新闻
  • 2025密炼机厂家实力榜:大连华韩领衔 四大品牌凭技术与口碑领跑橡塑机械行业
  • 2025矿物铸件厂家推荐排行榜:头部企业实力领跑,四星厂商凭细分优势站稳脚跟
  • 2025有限元分析/计算/测试服务商口碑榜:长春六耳科技领跑,技术深耕者成行业标杆