SSH
是连接 Linux 服务器中最常用的协议和工具,无论是自己本地开的虚拟机还是远端的云服务器。前段时间在配置 Hadoop 以及 Spark 集群的过程中用到了 SSH免密登录
,虽然经常用 SSH 但用到的都是最基本的密码登录,这次就趁着这个机会,好好地了解了一下 SSH 的免密登录原理
生成 SSH-key
只需执行下面这条命令,然后一路回车(这样没有设置额外的密码,是比较常用的方式)
1 | ssh-keygen -t rsa |
然后进入下面的目录,就可以看到有两个文件 id_rsa
和 id_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解密后的结果是否和自己初始选的那个随机字符串是否一致,验证通过允许连接