原创@前端司南
众里寻他千百度,蓦然回首,答案就在眼皮子底下……
正如标题所述,我遇到的问题是服务器拒绝了我的ssh免密登录,具体情况是我之前已经配置好了ssh免密登录,但是最近突发 PC ssh 登录云服务器报错,接连好些天都没找到原因。
ssh 免密码登录本身不是一个复杂的问题,百度 / google 上面随便都找得到教程。关键点在于:
- 基于 RSA 密钥对保障通信的安全。
- 将公钥传递到目标服务器的
~/.ssh/authorized_keys
中。
我自己的一台个人服务器原本也配置好了 authorized_keys,免密登录一直用得挺好,在PC本地,remote CI/CD 中一直跑得通。
然而,最近我不知道在服务器上调整了什么,或者是我的 PC 发生了什么升级,不记得了,反正现象就是在 git bash 使用 ssh 免密登录上不去了,一直提示 Permission denied (publickey) 之类的报错信息,但是在 xshell 或者 CI/CD 中都是正常的。
$ ssh txcentos
username@xxx.xx.xx.xx: Permission denied (publickey).
网上自然有各种类似问题,解决方案诸如修改 .ssh 目录权限,修改 sshd_config 配置等,或者是说你的密钥不对(然而重新生成了也一样,emm…)。
- 调整了权限,发现不是权限的问题
chmod 700 ~/.ssh
chmod 600 .ssh/authorized_keys
- 调整了 sshd_config 的几个关键配置,发现也不是这个问题。
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication no
// 调整之后重启服务
systemctl restart sshd.service
// 或者
service sshd restart
其实我心里很清楚,我的问题可能不是这些情况,即使从报错信息上看还是差不多的。我抱着试试的态度,改了一遍又一遍,还是不太行,要么是提示 denied,要么是 ssh 登录时让我输入密码(这还怎么免密),有点崩溃。
最终决定从 ssh 命令上 debug 看看报错信息(这是我之前忽略的,应该从这里开始查的),
$ ssh txcentos -v
找到了这么一个关键信息。
debug1: send_pubkey_test: no mutual signature algorithm
debug1: No more authentication methods to try.
顺着no mutual signature algorithm
这个信息查到了一些资料,由于 OpenSSH 从 8.8 版本由于安全原因开始弃用了 rsa 加密的密钥,需要在 .ssh 的 config 配置中加入这么一行:
PubkeyAcceptedKeyTypes +ssh-rsa
经测试真的管用,免密登录成功!
$ ssh xxx
Last login: Tue Sep 6 xx:xx:47 2022 from xxx.xx.xxx.xxx
附上参考的博客链接 https://blog.csdn.net/q274488181/article/details/121673370
同时我也检查了 PC 的 openssh 版本,确实是高于 8.8 版本的。
$ ssh -V
OpenSSH_9.0p1, OpenSSL 1.1.1o 3 May 2022
接着我还是去查阅 openssh 8.8 的发行日志核实了一下,确实有关于 security 的 incompatible changes,具体与 RSA/SHA-256/512 和 RSA/SHA1 有关。
详细资料可以参考 https://www.openssh.com/txt/release-8.8
总结下来就是,本次遇到问题时,我盲目自信认为可以凭自己之前的一些经验,找之前用过的一些方法去修改测试,浪费了很多时间,同时也打击了自己的信心。正确的做法是,对于一些命令行接口,可以优先确认是否能找到 debug 或者日志信息,优先从这些信息入手查问题,就比如这次的 ssh 命令,实际上是提供了 -v 选项,也就是 verbose,能看到比较详细的日志,往往会有事半功倍之效
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/235210.html