在解决问题中学习SSH原理

一颗蔬菜 2019-07-01 PM 335℃ 0条

Lasted updated 2019/7/2 16:37

几个月前搭建了Ubuntu集群,过了一段时间再重新启动集群时,出现了一些因ssh引发的问题。其实一直以来,对ssh的原理不是完全的理解,正好借此机会了解ssh原理。

问题描述

每次启动和关闭集群时都不需要不断地输入密码。

ssh登陆需不断输入密码.png

这种情况与ssh密钥有关,可是我在搭建集群时就已经生成可ssh密钥,why???

解决办法

对于这个问题,网上有一些记录:

1.ssh文件权限问题

相关解决办法.png

2.当前机器的id_rsa.pub没有追加到authorized_keys文件中

当排除了上一种可能后,剩下的就应该是这种情况了,可是在搭建集群的时候,我已经追加过了。why???

到底有没有追加,查看两个文件的内容对比就明了了。

经查看,果然id_rsa.pub的内容没有追加到authorized_keys文件中。追加过id_rsa.pub后的authorized_keys文件:

查看authorized_keys.png

此处有一个疑问:

上图中id_rsa.pub公钥的内容是以我的QQ邮箱地址结尾的,一般不都是用户名@主机名吗?所以公钥文件格式究竟是什么?
经过了一番查询,了解到:

SSH公钥格式为所有字段以单个空格符分隔,各字段依次为选项、密钥类型(keytype)、base64编码后的密钥、注释。第一个字段是可选的,表示该条目(行)是否以数字开头,选项字段不会以数字开头。最后一个字段注释,如果在生成密钥时没有给定注释,默认注释为密钥的创建者(一般就是 username@hostname 这种格式),注释仅仅是提供给用户查看密钥时作为一个辨识标记,在 SSH 使用中没有任何作用。

已经了解了每个字段的内容,至于SSH为什么将QQ邮箱地址作为注释,这个问题深究下去意义不大,可能是有瑕疵吧。

SSH登陆原理

~/.ssh文件目录结构:

ssh文件目录结构.png

  • id_rsa.pub:公钥
  • id_rsa:私钥
  • authorized_keys:远程文件,用户的公钥保存在此文件中
  • known_hosts:保存着登录过的远程主机的公钥

为了搞清楚ssh登陆的整个流程,我删除了整个.ssh目录,并重新进行密码登陆和免密登陆:

rm -r ~/.ssh

ssh密码登陆:

ssh localhost

上述命令执行完以后,系统会生成~/.ssh/known_hosts文件。该文件保存着远程主机的公钥。当远程主机收到本地的登陆请求后,将自己的公钥发送到本地,本地输入登陆密码后,该密码会通过远程主机的公钥加密后再发送给远程主机,远程主机使用自己的私钥解密该密码,若密码正确,就同意登陆。

密码登陆.png

现在我们来解读一下上图中的一些信息:

The authenticity of host 'localhost(127.0.0.1)' can't be established.
主机"本地主机(127.0.0.1)"的真实性无法确定。
ECDSA key fingerprint is SHA256:qilNSQT/7n6HDoWqpWO95YP4MX.....
Are you sure you want to continue connecting(yes/no)?
ECDSA 密钥指纹是SHA256:qilNSQT/7n6HDoWqpWO95YP4MX.....
你确定要继续链接吗?    

当我们输入yes后:

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
警告: 已知主机列表中永久添加了"localhost"(ECDSA)。

这表示,该主机的公钥已经添加到本地的known_hosts文件中。接着,我们输入密码即可登陆到localhost

在日常开发中,我们需要免密登陆以提高生产力,若每次通过<u>密码登陆</u>,会影响编程效率。因此,我们需要免密登陆,即<u>公钥登陆</u>。

ssh的登陆分为口令(密码)登陆和公钥(免密)登陆,更多详细内容可前往阮一峰老师的网络日志

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上[用户在登陆前将id_rsa_pub公钥追加到authorized_keys远程文件上]。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后再发回来。远程主机用事先储存在authorized_keys中的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

设置免密登陆:

本地生成私钥和公钥

ssh-keygen -t rsa  

该命令执行完成后,.ssh目录下生成id_rsa私钥并提示输入免密登陆模式下的登陆密码,我们继续回车表示无密码登陆。然后提示生成id_rsa.pub公钥以及公钥指纹。

生成公钥和私钥.png

接着我们需要将生成的id_rsa.pub公钥(本地的公钥),追加到authorized_keys远程文件中。查看.ssh目录,其中没有authorized_keys文件。因此,我们自行创建该文件:

cat id_rsa.pub > authorized_keys  # ubuntu
ssh-copy-id 192.168.50.33 # centos

接着,我们就可以进行远程免密登陆:

ssh localhost

免密登陆成功.png

免密登陆成功。

或许读完上文,你对SSH的两种登陆方式还不太理解,接下来我将补充两张时序图来说明这两种登陆方式,图片来源于果冻想的博客
SSH密码登陆时序图.png
SSH免密登陆时序图.png

结束语

实践是检验真理的唯一标准。

标签: 大数据

非特殊说明,本博所有文章均为博主原创。

上一篇 禁用IPV6后的情况记录
下一篇 awk