SSH 原理

SSH 是连接 Linux 服务器中最常用的协议和工具,无论是自己本地开的虚拟机还是远端的云服务器。前段时间在配置 Hadoop 以及 Spark 集群的过程中用到了 SSH免密登录,虽然经常用 SSH 但用到的都是最基本的密码登录,这次就趁着这个机会,好好地了解了一下 SSH 的免密登录原理

生成 SSH-key

只需执行下面这条命令,然后一路回车(这样没有设置额外的密码,是比较常用的方式)

1
ssh-keygen -t rsa

然后进入下面的目录,就可以看到有两个文件 id_rsaid_rsa.pub,其中后者是公钥。

1
cd ~/.ssh

配置免密登录

免密登录的配置很简单,如果A机器需要免密登录B机器,在A机器上执行

1
ssh-copy-id <username of B>@<ip of B>

ssh-copy-id是一个简化的命令,它其实是一个脚本,做的事情就是将A的公钥传到B机器上,并添加到B机器的~/.ssh/authorized_keys文件中,这样B机器就有了A机器的公钥。

关于ssh-copy-id命令,Linux中是可以直接使用的,macOS在10.12中默认加入了这条命令,在10.11以及之前的版本中需要通过brew安装。

这时候在A机器上执行SSH连接B机器的命令就会免输密码

1
ssh <username of B>@<ip of B>

免密登陆的原理

B机器的authorized_keys文件中保存了A机器的公钥,A机器便实现了SSH免密码登录B机器,这背后的原理是什么?

  • 当A机器发起连接B机器的请求
  • B机器收到A的信息后,在authorized_keys中查找,发现有A的公钥
  • B用A的公钥加密一个随机字符串,将加密后的结果发给A
  • A用自己的私钥解密后,拿到原始未加密的字符串
  • A把解密后的结果发给B
  • B验证A解密后的结果是否和自己初始选的那个随机字符串是否一致,验证通过允许连接