一次关于SSH的踩坑
解决了问题之后,再看错误提示,才发现解决的方法应该是特别明确的,还是对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 | ssh-keygen -A -N '' |
最后
把所有服务器都换成了 Ed25519
以后解决问题还是先花点时间看看资料吧,不然会白白浪费了好多时间……