Linux 密钥登陆原理

公私钥简介

公钥和私钥都属于非对称加密算法的一个实现,这个加密算法的信息交换过程是:

  1. 持有公钥的一方(甲)在收到持有私钥的一方(乙)的请求时,甲会在自己的公钥列表中查找是否有乙的公钥,如果有则使用一个随机字串使用公钥加密并发送给乙。
  2. 乙收到加密的字串使用自己的私钥进行解密,并将解密后的字串发送给甲。
  3. 甲接收到乙发送来的字串与自己的字串进行对比,如过通过则验证通过,否则验证失败。

非对称加密算法不能使用相同的密钥进行解密,也就是说公钥加密的只能使用私钥进行解密。

ssh的两种登陆方式介绍

  • 口令验证
  • 密钥验证登陆

ssh公钥 登陆服务器 ssh公钥登录原理_ssh公钥 登陆服务器

ssh免密登陆

  1. 在需要免密登陆的主机(主机A)下生成公钥和私钥
1 # ssh-keygen -t rsa     ##-t rsa可以省略,默认就是生成rsa类型的密钥

**说明:**命令执行后会有提示,输入三次回车即可,执行完成后会在当前用户的.ssh目录下生成两个文件:id_rsa、id_rsa.pub文件,前者时私钥文件,后者是公钥文件(拷贝到其他主机只需要拷贝这个文件的内容)

  1. 将公钥复制到被登陆的主机上的 ~/.ssh/authorized_keys 文件中
    拷贝公钥有两种方法,其原理都相同:
    方式一:使用 ssh-copy-id 直接拷贝
    使用 ssh-copy-id 进行拷贝公钥非常方便,只需要指定目标主机和目标主机的用户即可。
1 # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.187.142

执行这条命令后会自动将登录主机的公钥文件内容追加至目标主机中指定用户(root).ssh目录下的authorized_keys文件中。这个过程是全自动的,非常方便。

方法二:自己创建文件进行拷贝

  1. 在登录主机(客户机)上创建authorized_keys文件并将公钥追加到该文件。

先cd到登录机使用的用户下的 .ssh 目录,方便操作

1 # cat id_rsa.pub >> authorized_keys
2 # chmod 600 authorized_keys     ##修改文件权限为600,该文件有规定如果属组其他人出现可写则文件就不会生效
  1. 在被登录机的指定用户家目录下创建 .ssh 目录(这里在root用户下创建,因为要使用密钥登陆到root用户)
# mkdir .ssh
# chmod 700 .ssh     ##将目录权限改为700该目录的权限必须是700才有效
  1. 将登录机创建的authorized_keys文件拷贝到被登录机,使用scp
1 # scp authorized_keys root@192.168.187.142:/root/.ssh/
2 authorized_keys                                  100%  402   576.4KB/s   00:00
  1. 登录
    使用主机A乙root用户身份登陆到主机B
1 # ssh root@192.168.187.142
2 Last login: Wed Feb 13 15:24:30 2019 from 192.168.187.137

首次登录将弹出保存信息,输入yes即可,此时已经实现了免密的密钥登陆。

无法免密登陆问题

有的时候传送密钥后怎么调试都不行,比如修改chmod 600 id_rsa ,还有 chmod 700 ~/.ssh ,当然这两个是必须的,普通用户没有~/.ssh 需要手动创建就必须修改为700的权限。

配置文件

/etc/ssh/sshd_config

还有配置文件添加开启

RSAAuthentication yes
PubkeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys
然后重启systemctl restart sshd

如果仍然不行,且使用ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.2有如下提示

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@192.168.10.2'"
and check to make sure that only the key(s) you wanted were added.

则需要指定密钥路径

ssh -i ~/.ssh/id_rsa root@192.168.10.2

同理scp时也需要指定

scp -i ~/.ssh/id_rsa root@192.168.10.2:/xxx