SSH学习笔记
目录
对于ssh,之前的认知大概只是停留在简单使用的层面,然而近期涉及到了一些较为深入的使用场景就很懵逼。因此,本文尝试理解有关ssh一些原理层面的东东~
关于SSH的常用指令以及原理相关,首先推荐看阮一峰大佬的博客,ssh上篇 ssh下篇 ssh入门教程,本文的定位是学习笔记,所以会记录一些看到各种学习资料之后的个人感想与总结。
关于ssh的密码加密方案
仔细思考了一下,假设我们有一个场景是A想要远程登录B的电脑,那么具体方案的衍变可能是这样的……(ps: 需要具有一些前置知识,建议先看数字签名与证书)
- A直接通过网络向B发送登录密码,B确认后允许登录。
- 这种方案的弊端很明显,一旦中途密码被拦截,那么任何人都可以远程登录B的电脑,很不安全
- A先向B发送登录请求,B收到之后向A发送公钥,A通过公钥将密码加密,再发送回B,经B的私钥解密并确认后,允许登录。
- 这种方案有了一定的保密性,通过公钥和私钥直接的配对,将密码在传输的过程中进行了加密,这样即便加密的密码被拦截,没有私钥也无法破解密码内容。
- 但是仍然有风险,因为我们无法对公钥的正确性进行闭环判断,一旦有人拦截了登录请求,那么发送过来的可能并不是B的公钥,所以密码仍然有可能泄露!!
- A向B发送登录请求,B收到之后向A发送公钥,A收到公钥之后,通过计算md5的值进行比对(因为公钥的实际内容可能很复杂,但是计算md5之后可以得到简单并唯一的字符表示,也就是
RSA key fingerprint
),确定公钥正确后,将加密的密码送回B,并之后后续流程- 通过约定好的公钥md5的值,我们可以实现公钥发送端的闭环,一旦A收到的公钥md5值不匹配,说明对方不是B,那么就可以避免密码泄露。
哈哈哈是不是逻辑还算合理?
总之,目前的ssh远程登录的方案就是用的第三种,我们通常在进行远程连接时,第一次链接会出现一些提示,内容如下:
|
|
这就是在提示我们,对面的公钥的md5值是 98:2e:xxx:58:4d
,是否值得信任?我们输入yes之后,对方的host就会被写入 ~/.ssh/known_hosts 文件中,下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
关于ssh的公钥免密登录
对于ssh每次连接都要敲密码这件事,如果次数频繁了还是蛮心累的,而这么简单的需求又怎么可能没有呢,对应的就是公钥免密登录!
上面的密码登录流程是,远程端B要把他的公钥发送给本地端A,那么我们为什么不能反过来呢?将A的公钥发送给B,然后每次登录时,B通过公钥加密一串随机的内容,经过A的私钥解密之后再发送回B,只要内容一致就可以允许登录了,这样保密性好且不需要重复输入密码。
对应地,在一些公有项目的且只有内网连接的情况下,通过公钥连接也是比较方便的方案,我们只需要将公钥上传到远程端,然后就可以通过ssh访问了!