在了解ssh的时候产生了概念混淆,发现ssh登录和ssh免密登录是两码事。
可以从目的和过程对比这两个概念:
1.目的
1.1 SSH登录
简单来说就是:建立客户端和服务器之间安全的远程连接,登录远程服务器,以访问文件系统 。
1.2 SSH免密登录
免密登录远程服务器,即在客户端和服务器之间建立免密的ssh连接,重点在于免密。
2.实现过程
2.1 SSH登录
1.用户发送登录请求到服务器,服务器返回自己的公钥给客户端;
2.客户端使用服务器的公钥对用户名和密码进行加密,并发送给服务器;
3.服务器使用自己的私钥解密收到的数据,并验证用户名和密码是否正确。
4.如果验证成功,服务器允许客户端连接。
注意:这个过程是需要用户名和密码的,只是使用ssh免于密码明文暴露在网络环境中(因为使用了服务器的公钥加密,也就只有服务器的私钥才能解密)。
2.2 SSH免密登录
预备工作:
1.在免密登录之前,用户需要先在本地计算机上生成一对密钥(公钥和私钥)。
2.用户将本地计算机上的公钥上传到目标服务器,添加到服务器的~/.ssh/authorized_keys文件中。
登录过程:
1.当用户尝试使用SSH连接服务器时,客户端会发送登录请求给服务器,并在请求中携带本地计算机的公钥。
2. 服务器在authorized_keys文件中查找匹配的公钥(在预备工作中上传到服务器的本地公钥),如果找到匹配的公钥,服务器会生成一段随机数据,并使用该公钥对数据进行加密。
3. 服务器将加密后的数据发送回客户端。
4. 客户端使用本地计算机上的私钥解密收到的数据。
5. 如果解密成功,客户端将解密后的数据发送回服务器进行验证。
6. 如果服务器验证成功,则服务器允许客户端免密登录。
注意:这个过程并不需要密码,只需要提前在服务器上传客户端的公钥。
另外,只有客户端私钥成功解密服务器发送来的随机数之后才能登录到服务器,因为这样那些只有公钥没有私钥的伪客户端就无法登录服务器啦。
SSH登录存在的问题
回顾SSH登录过程,用户向目标服务器发送登录请求时,目标服务器会返回一个公钥,用户使用该公钥加密自己的密码后上传给目标服务器。
但是假设用户向目标服务器发送登录请求时,有人截获了登录请求,伪装成目标服务器把自己的公钥发送给用户,用户就会用假的公钥加密自己的数据,密码就会被伪装者获取。
关键是因为,用户无法判断服务器发来的公钥是否是安全的,即是否真的是目标服务器发送来的。因为SSH的公钥是没有CA公证的。这里可以去了解一下SSL。