SSH-The selected user key is not registered

最近在学Linux,昨天顺便第二次白嫖了谷歌云服务器。但是和第一次一样,遇到了不能用ssh登录的问题,只能使用密码登录。虽然不影响使用,但是强迫症患者很想弄清楚到底是怎么回事。
为了解决这个问题,查了蛮多材料,整理下可能的一些情况:

  1. 登录的用户和配置的用户是否统一
    SSH服务器保存的客户端公钥存放在配置文件~/.ssh/authorized_keys中。需要注意的是,服务器端可以有多个用户,每个用户都有一个家目录,但是客户端每次只是登录其中的一个。因此一定要确保自己登录的那个用户是已经配置好authorized_keys文件的那个用户
    反过来讲,如果登录不成功,可能在服务器中自己只把客户端公钥记录在了root用户的authorized_keys文件,而客户端访问的是一个叫“user”的用户。
  2. SSH是否允许密钥认证
    SSHD(SSH的守护进程)的配置文件在/etc/ssh/sshd_config,检查对应参数:RSAAuthentication或PubkeyAuthentication是否设置为yes。
    如果服务端没有允许密钥认证,那再怎么记录公钥当然也是没有的。
  3. SSH是否限制root用户
    如果root用户的公钥记录好了,并且登陆的也是root用户,但是遇到这种提示,可能是没有开启root用户登录。
    SSHD(SSH的守护进程)的配置文件在/etc/ssh/sshd_config,设置PermitRootLogin后面为yes。
  4. SSH是否允许了该用户登录
    配置文件/etc/ssh/sshd_config中有一项是AllowUsers,表示所有可以通过SSH登录的用户,检查要登录的用户名是否在后面。
    BTW,如果需要允许多个用户,一定要使用空格符将其用户名分开,否则将会导致SSH只允许一个叫做“user1,user2”的用户登录,而这个用户应该是不存在的,但是其他的用户又被屏蔽无法登录,所以……(不要问我是怎么知道的)
  5. 文件(夹)权限设置
    SSH对配置文件/文件夹的权限有要求,如果权限不对,就会出现未注册的情况(即使正确的公钥已经添加到authorized_keys文件了)。必须要使authorized_keys文件的权限为600、.ssh文件夹的权限为700。
    chmod 600 authorized_keys
    chmod 700 ~/.ssh
  6. 密钥类型
    SSH在通信中采用公钥加密进行验证,可选的公钥加密算法有几种,例如RSA(默认)、DSA,不要把RSA算法的密钥当成DSA密钥,反之也是。
  7. 端口问题
    默认SSH通信端口是22端口,检查是否被其他程序占用、自己是否更改过(如果是,两端要改成一样的)、等等。
  8. PAM设置
    修改/etc/ssh/sshd_config,将UsePAM设置为yes
    我没有遇到这种情况,网上看到的,顺便记录下。

    https://blog.csdn.net/asddsaws147852/article/details/101316737
    SSH客户端提示 用户密钥未在远程主机上注册

  9. 虚拟机网络设置问题(if applicable)
    如果使用了虚拟机,一定要采用桥接(bridge)模式才能使虚拟机之间相互通信。
    详情百度虚拟机各网络模式的区别。
  10. 防火墙屏蔽问题
  11. 配置更改后没有重启服务,还未生效
    重启SSH守护进程systemctl restart sshd,使配置生效

以上默认服务端已经打开了SSH服务。安装SSH之后它并不会自动启动,所以也可能是连服务器SSH程序还没有启动,使用命令systemctl start sshd将守护进程启动。




其他

最后,SSHD的配置文件中有很多参数,网上也有很多博客对其中一些参数进行解释,但是质量实在是参差不齐,最好还是查看官方文档,把博客当作一种补充。

sshd_config — OpenSSH daemon configuration file
https://man.openbsd.org/sshd_config


systemctl是linux系统服务相关的命令,使用格式为:
systemctl [OPTIONS…] COMMAND [UNIT…]
实际使用时,使用具体的参数替换OPTIONS、COMMAND和UNIT。其中OPTIONS和UNIT可以有多个参数。
systemctl官方文档如下,其中最常用的COMMAND是start、stop、restart、status,分别代表启动、停止、重启服务和查看服务状态。

systemctl(1) — Linux manual page
https://www.man7.org/linux/man-pages/man1/systemctl.1.html