一般情况下,我们用ssh远程登录到服务器时,要输入用户名和密码。这对经常维护系统的人来说,很麻烦。怎样才能不用密码直接登录到远程的linux/unix服务器呢?ssh公钥认证可以解决这个问题。

公钥认证,是使用一对加密字符串,一个称为公钥(public key), 任何人都可以看到其内容,用于加密;另一个称为密钥(private key),只有拥有者才能看到,用于解密。 通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难。
2020-11-25 20-56-39.png
ssh/sftp/scp的公私钥免密模式原理时序图可以说非常详细了

  1. 由客户端负责生成公私钥,其中公钥放在服务端,私钥放在客户端。
  2. 当客户端发起请求的时候,服务端寻找对应的客户端的公钥,并产生一个随机数进行加密,再传回客户端,目的是为了验证客户端的合法性。
  3. 当客户端收到了服务端的加密文本后,就会使用私钥去解密,再发送给服务端。
  4. 服务端 sshd 程序收到了客户端的应答后,通过检查解密文本是否就是自己生成的随机数就可以得知客户端是否合法。同时,服务端还会对一些目录权限和权属进行检查。

在使用公钥认证之前,先检查一下服务器的ssh配置文件/etc/ssh/sshd_config

RSAAuthentication yes        # 启用 RSA 认证,默认为yes
PubkeyAuthentication yes     # 启用公钥认证,默认为yes
PasswordAuthentication no   #关闭密码登陆

如果配置没有问题,那么你就可以进行下一步了。
下面我们举个例子,比如有两台机器,客户机A与服务器B,想用ssh公钥认证方式从A机器用client用户登录到B机器的server用户,方法如下:

  1. 客户端:生成公私钥

    ssh-keygen -t rsa

    其中屏幕显示的提示均可以一路回车默认。此时,就会在 $HOME/.ssh 目录下生成 id_rsa、id_rsa.pub 文件。其中 id_rsa 就是私钥文件,id_rsa.pub 就是公钥文件。

  2. 客户端:发送公钥文件给服务端,并且安装
    将客户端 $HOME/.ssh文件夹下的id_rsa.pub公钥文件发送到服务端的 $HOME/.ssh 路径下:

    scp $HOME/.ssh/id_rsa.pub wangying@192.168.214.128:/home/wangying/.ssh
  3. 服务端:安装公钥文件
    得到了公钥文件,随即进行安装:

    cat id_rsa.pub >> authorized_keys

    这里是将客户端发过来的公钥文件追加到 authorized_keys 文件中。这里需要注意的是,如果服务端没有 .ssh 文件夹,你可以新建一个。

  4. 客户端:尝试登录,自动添加服务端信息
    在客户端尝试登录,随即会自动在 $HOME/.ssh/known_hosts文件中添加服务端信息:

    ssh wangying@192.168.214.128

    这里,我已经配置成功了,客户端已经可以免密登录上去了:)

  5. 配置失败:检查下列事项
    如果你配置完后,发现并不能成功 ssh/sftp/scp 上去,则需要检查下列事项:

两个主机的 .ssh 目录的属主、属组为当前用户与用户组
chown Administrator /home/Administrator
chown Administrator /home/Administrator/.ssh/authorized_keys
chown Administrator /home/Administrator/.ssh/id_rsa
chown Administrator /home/Administrator/.ssh/id_rsa.pub
chown Administrator /home/Administrator/.ssh/known_hosts
chown Administrator -v /home/Administrator/.ssh/*

chown Administrator -R -v /home/Administrator

发现所有用户的HOME目录应该是700权限,否则会引起很多问题

最终,执行chmod 700 /home/Administrator后解决

两个主机的 .ssh 目录的权限应该是 700
chmod 700 -v .ssh

两个主机的 .ssh 目录下的 id_rsa.pub 的权限应该是 644
chmod 644 -v .ssh/id_rsa.pub
//公钥导入到服务端后可以删除,也可以备份方便下次导入

服务端的 .ssh 目录下的 authorized_keys 的权限应该是 644
chmod 644 -v .ssh/authorized_keys

客户端的 .ssh 目录下的 id_rsa 的权限应该是 600
chmod 600 -v .ssh/id_rsa

服务端的用户 $HOME 目录的权限应该是 755;理论上说,只要组和其他用户没有 w 权限即可

目录权限:
r    4
w    2
x    1
修改权限:chmod 700 .ssh
修改组别:chgrp wangying .ssh
修改属主:chown wangying /home/wangying