ssh免密登录在实际工作中有重要的作用,甚至有的应用部署也必须要免密登录远程主机,例如hadoop环境搭建。
免密登录,需要先在本机生成公钥,然后将公钥拷贝到远程主机,拷贝的过程,既可以手动(在远程主机根目录下创建.ssh目录,然后将公钥存入该目录下authorized_keys文件中即可),也可以直接命令操作ssh-copy-id,这个操作做完了,即可免密登录远程主机。
仔细回想这个过程,先在本机生成公钥,然后将公钥复制到远程主机,接着就可以免密登录远程主机,这个过程似乎与我们想想的不太一样,我们可能希望远程主机免密登录本机。这就好比我要去朋友家,我先将我们家的钥匙放在朋友家,结果我就可以随便进入朋友家里。正常来说,我家钥匙在朋友家里,应该是朋友随便进入我家。通过实验我们来看是什么样的。
这里假定我们需要在node01上远程登录node02机器,这样的话,默认ssh登录,需要输入node02上root用户的密码。如下图所示:
node02上本身是没有.ssh目录的。
一、生成类型rsa免密的公钥。
#ssh-keygen -t rsa -P ""
遇到提示,一路回车即可。
查看刚刚生成的公钥id_rsa.pub
二、将公钥通过命令ssh-copy-id放入node02机器上。
#ssh-copy-id root@node02
执行这一步操作,需要输入node02上root用户登录的密码。
执行成功之后,我们在node02上查看/root/.ssh目录已经生成,并且多了一个名为authorized_keys的文件,里面保存的正是node01上ssh-keygen生成的id_rsa.pub的内容。
三、远程登录node02,无需密码,直接登录成功,如图所示。
另外:免密登录本机也是可以的,默认是需要密码的,只需要将id_rsa.pub拷贝一份保存为authorized_keys。接着ssh登录本机,直接登录成功。
ssh免密登录的过程我们已经清楚了,现在来说说是怎么回事,为什么和我们想象的不一样。
ssh-keygen的过程,其实不光生成了id_rsa.pub,同时还生成了id_rsa这个文件,这个文件就是私钥,保存在本机的。ssh远程登录的过程,先是客户端请求远程主机,远程主机根据authorized_keys中本机公钥的内容加密一个请求,返回给客户端,客户端然后利用私钥对这个请求解密,再发送给远程主机,远程主机收到了准确的应答,即认为是该客户端是可信的,因此允许登录。该过程可以通过如下图所示更直观。
远程主机上的authorized_keys文件中可以保存多个公钥。多个公钥直接追加在末尾。
了解ssh免密登录的过程,再回过头来,我们发现其实这种方式和远程主机的密码没有任何关系,我们无需知道密码,或者密码随便更改,我们只要保证远程主机有我们的公钥,而我们本地有这么一对公钥和私钥就可以了。