解决了问题之后,再看错误提示,才发现解决的方法应该是特别明确的,还是对SSH不够了解啊

起因

最近又剁手了台服务器,和之前的服务器一样,用Android手机第一次SSH登录时要用JuiceSSH,不能用ConnectBot,不然会报错

1
Key exchange was not finished, connection is closed.The server hostkey was not accepted by the verifier callback.Unknown hostkey type rsa-sha2-512

通常这种情况只要 apt update && apt dist-upgrade -y 一下,就莫名其妙地解决了,我也一直把问题归结为自带的Debian太旧,OpenSSH之类的版本太低这些原因

但这一次用了上面的命令还是没有效果,而没有效果的原因可能是这次预装的Debian就是Buster,所以并不是系统或者软件太旧,而是在系统大版本的时候重置、添加或者修改了一些数据

解决

1、首先能想到的方法自然是Google一下了,把上面的错误提示搜索一下,第一条就是

ConnectBot的Issue 698,但我没看懂在 sshd_config 里添加 HostKey /etc/ssh/ssh_host_ed25519_key 是什么操作,反倒是跳转的另一个Issue 17后,有人提交了一个 Not throwing IllegalArgumentException when key type is rsa-sha2-256 的Commit

看来是ConnectBot并不打算支持 rsa-sha2-512 这个密钥类型啊……

2、那就研究研究 rsa-sha2-512 吧,搜了一下,第一搜索结果彻底让我跑偏了:How to generate “ssh-rsa” key instead of “rsa-sha2-512” ,我开始认为问题所在是生成的密钥有问题,所以之后我花了大量的时间用各种工具生成各种类型的密钥,接着我又搜到了 出于安全方面考虑 OpenSSH宣布放弃对SHA-1认证方案的支持 我开始试着用较新类型的密钥—— Ed25519

3、 Ed25519 之前我也试着用过,但从没成功过,这次也不出所料,换上之后ConnectBot、JuiceSSH都连不上了

4、就在我要放弃的时候(对,还没查清楚SSH的运作方式我就要放弃了),发现/etc/ssh/下有好多成对的密钥,之后才了解到这个用来验证服务器身份的 Host Key ,它对应的是在客户端留下的 known-hosts 文件

之后问题就好解决了:生成丢失的密钥对,重启sshd服务

1
2
ssh-keygen -A -N ''
systemctl sshd restart

最后

把所有服务器都换成了 Ed25519

以后解决问题还是先花点时间看看资料吧,不然会白白浪费了好多时间……