记一次ssh踩过的坑

前言

      最近买一个树莓派,由于没有HDMI转VGA的线,没有显示屏,只能用ssh操作,开始几天倒没什么,可能总是直接拔电源关机的缘故,损坏了文件系统,重装系统后就再也连不上ssh了。

过程

      试了网上的很多方法都没有解决,直到看到一篇文章说cat /var/log/auth.log可以查看登录日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
Aug  5 18:53:59 raspberrypi sshd[2171]: fatal: No supported key exchange algorithms [preauth]
Aug 5 18:54:03 raspberrypi sshd[2176]: error: key_load_public: invalid format
Aug 5 18:54:03 raspberrypi sshd[2176]: error: Could not load host key: /etc/ssh/ssh_host_rsa_key
Aug 5 18:54:03 raspberrypi sshd[2176]: error: key_load_public: invalid format
Aug 5 18:54:03 raspberrypi sshd[2176]: error: Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Aug 5 18:54:03 raspberrypi sshd[2176]: error: key_load_public: invalid format
Aug 5 18:54:03 raspberrypi sshd[2176]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Aug 5 18:54:03 raspberrypi sshd[2176]: fatal: No supported key exchange algorithms [preauth]
Aug 5 18:54:07 raspberrypi sshd[2184]: error: key_load_public: invalid format
Aug 5 18:54:07 raspberrypi sshd[2184]: error: Could not load host key: /etc/ssh/ssh_host_rsa_key
Aug 5 18:54:07 raspberrypi sshd[2184]: error: key_load_public: invalid format
Aug 5 18:54:07 raspberrypi sshd[2184]: error: Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Aug 5 18:54:07 raspberrypi sshd[2184]: error: key_load_public: invalid format

难道是key出了问题,那就直接重新生成密钥吧。

1
2
sudo rm /etc/ssh/ssh_host*
sudo dpkg-reconfigure openssh-server

2018.8.9添加:

      由于树莓重新装过系统,但是我的客户端~/.ssh/known_hosts中还是保存着服务端原来的公钥,如日志中所示

1
error: key_load_public: invalid format

导致不能加载公钥,至于为什么服务端重新生成密钥之后,服务就重新发开公钥了,还不是很清楚。

      ssh连接流程:ssh连接有两种方式,一种是密钥连接,需要服务端保存有你在客户端生成的公钥,第二种方式是密码连接,我现在用的就是密码连接,连接时客户端向服务端发出连接请求,服务端会把服务端自己的公钥发给客户端,也就是我们在连接时弹出的安全警告(如下图),点击接收并保存之后,客户端就会把服务端的公钥就会存到~/.ssh/known_hosts文件中,下次就不会发出警告请求了,接下来客户端会用这个接收到的公钥把输入的密码加密发送给服务端,服务端用私钥解密,以达到登录时加密传输。(此处公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。会存在中间人攻击,这也就是为什么会默认(可关闭)弹出警告的原因)
image

总结

  1. 日志是个好东西。
念念不忘,必有回响。