在应用中我们经常会登陆其他的主机,每次都需要输入用户名和密码。另外在Hadoop的使用中也会使用ssh命令去连接其它的主机。我们可以设置SSH免密码登陆来实现其他主机登录该主机是不用输入密码。
现在我们有两台测试的Linux的虚拟机,我们称之为主机1和主机2。ip分别为192.168.1.101和192.168.1.102,我们这次的目的是用主机主机1的grid用户无密码连接主机2的grid用户
1. 在主机1生成密钥
先解释一下,三个提示信息
Enter file in which to save the key (/home/admin/.ssh/id_rsa)文件保存的位置,默认为当前"用户身份"的主文件夹下的.ssh文件夹下的id_rsa
Enter passphrase (empty for no passphrase) 输入连接密码,默认为空
Enter same passphrase again 再次输入密码,默认为空
我们在主机1中创建一个密钥,由于所有设置都是用的默认的,因此直接三个回车
[grid@linuxidc ~]$ ssh-keygen -t rsa我们可以查看一下当前用户主目录下的.ssh文件夹
[grid@linuxidc ~]$ cd ~/.ssh [grid@linuxidc .ssh]$ pwd /home/grid/.ssh [grid@linuxidc .ssh]$ ll total 12 -rw-------. 1 grid grid 1675 Jul 22 13:38 id_rsa -rw-r--r--. 1 grid grid 393 Jul 22 13:38 id_rsa.pub -rw-r--r--. 1 grid grid 402 Jul 22 12:35 known_hosts可以发现下面有两个文件:id_rsa和id_rsa.pub其中id_rsa.pub是公钥,id_pub是私钥
2. 将主机1公钥分发到主机2下
我们可以直接使用ssh-copy-id 主机名命令将公钥拷贝到对方的主机下,例如:
[grid@linuxidc ~]$ ssh-copy-id tiny02 grid@tiny02's password: Now try logging into the machine, with "ssh 'tiny02'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.实际上ssh-copy-id 命令就是将当前主机id_rsa.pub中的内容,追加到目标主机上的~/.ssh/authorized_keys文件上,如果该文件不存在,则创建
3. 登录到主机2
我们现在就可以登录主机2了
测试成功
4.关于SSH连接中流程问题(以下内容纯属于一本正经的胡说八道)
前面说到SSH是将公钥发给别的主机,然后别的主机用公钥加密,然后发送回来的吗?所以不应该是将公钥发送给其他主机上,然后其他主机来连接这台主机吗?为什么在这里变为了讲公钥发送给其他主机,然后去连接其它主机,不应该是被连接吗?其实我也不知道,看了SSH协议交互过程这篇博客,我做出了一下猜测:
当我们没有设置SSH免密码的时候,我们需要输入密码才能进行远程连接。所以他的连接过程可能是这样子:
客户端向服务器发出了连接请求
服务器向客户端发出了公钥
客户端将用户名、密码、自己的公钥等信息通过服务器提供的公钥加密发送回了服务器
服务器对认证信息进行比对,认证正确后通过认证
服务器向客户端返回认证通过的响应,并且此后由于双方都有对方的公钥因此所有的通讯都进行加密传输。
客户端将要执行的命令加密后传给服务器
服务器解密并应执行命令
服务器将执行的命令的结果返回给客户端
而免密码登陆的时候连接过程呢?由于此时服务器已经有了客户端的公钥,可能是这样子的
客户端向服务器发出了连接请求
服务器向客户端发出了公钥
客户端将publickey认证所需的信息发送给了服务器
服务器对认证信息进行比对,认证正确后通过认证
服务器向客户端返回认证通过的响应,并且此后由于双方都有对方的公钥因此所有的通讯都进行加密传输。
客户端将要执行的命令加密后传给服务器
服务器解密并应执行命令
服务器将执行的命令的结果返回给客户端
发现其实二者是一样的只不过就是认证方式不同,一个是password认证,一个是publickey认证,而当服务器将客户端的公钥配到authorized_keys就表示已经同意了对方的免密码连接。需要注意一个问题,password认证所用的密钥和publickey认证所用的密钥是不同的。password认证所用的密钥在/etc/ssh下,而publickey认证所用的密钥在~/.ssh下,因此publickey认证所用的公钥在传输过程中是加密的。
而我们换一种情况考虑,就是假设是公钥给谁就是允许谁免密码连接的情况,会有以下几个问题:
如果公钥是谁获得谁就可以免密码连接。那么由于公钥是公开的,因此服务器相当于谁都可以登录的。