ssh协议及其他一些相关知识

十三呀 2017-08-12
经常用ssh,一直都没弄明白。
今天研究了下终于搞懂了来龙去脉。
登陆远程主机的传统方式用Telnet指令,这是基于TELNET协议完成的,TELNET是TCP/IP协议族中的一员。而我们常用的ping指令,则是基于ICMP协议,ICMP协议建立与IP协议之上。(有空得总结下这些常用的网路协议)。
然而Telnet协议存在的一个问题是其使用明文传输,可以轻松的被截取并拿到传输的数据。因此,SSH诞生了。
因此,SSH首先要解决的问题就是对数据加密,避免传输途中被截取别破解。SSH采用的解决方式是,远程主机收到请求,首先把自己的公钥发给客户端,客户端通过远程主机发来的公钥对数据加密,然后发给远程主机,远程主机再通过秘钥对收到的数据解密。到此,明文传输的问题已经解决了。
然而,这种机制却还存在一个问题:中间人攻击。如果在客户端与远程主机之间存在一个伪装的第三者,截取了客户的请求,并返回自己的公钥,客户端因为无法判断对方的真实性,还是会中套。
而对于第三者攻击的解决方式,就是我们在第一次用SSH登陆一台远程主机时,会得到提示:
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you w...
经常用ssh,一直都没弄明白。
今天研究了下终于搞懂了来龙去脉。
登陆远程主机的传统方式用Telnet指令,这是基于TELNET协议完成的,TELNET是TCP/IP协议族中的一员。而我们常用的ping指令,则是基于ICMP协议,ICMP协议建立与IP协议之上。(有空得总结下这些常用的网路协议)。
然而Telnet协议存在的一个问题是其使用明文传输,可以轻松的被截取并拿到传输的数据。因此,SSH诞生了。
因此,SSH首先要解决的问题就是对数据加密,避免传输途中被截取别破解。SSH采用的解决方式是,远程主机收到请求,首先把自己的公钥发给客户端,客户端通过远程主机发来的公钥对数据加密,然后发给远程主机,远程主机再通过秘钥对收到的数据解密。到此,明文传输的问题已经解决了。
然而,这种机制却还存在一个问题:中间人攻击。如果在客户端与远程主机之间存在一个伪装的第三者,截取了客户的请求,并返回自己的公钥,客户端因为无法判断对方的真实性,还是会中套。
而对于第三者攻击的解决方式,就是我们在第一次用SSH登陆一台远程主机时,会得到提示:
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
如果你选择了yes,则表明你相信你信任所连接的远程主机(好吧,这个解决方式,感觉有点摔锅的嫌疑啊,应为对比HTTPS,通过获取证书来证明自己的合法性,而这里的公钥秘钥谁都可以产生,并没有公众认可的合法性,让用户自己去确定连了正确的远程主机。。)
而你选择了yes,sshd进程也会把远程主机的ihost信息加入known_hosts文件中,这样下次再连接这台机器时,就不会再让你确定“Are you sure you want to continue connecting (yes/no)?”,这就是known_hosts文件的作用。
好吧,我们上面说的方式其实是在说用密码登陆远程主机,而每次登陆都要输密码确实是件麻烦的事,有没有更简单的方式呢?
答案是有的,方法就是不再用用户密码认证,而用一套公钥秘钥来认证。就是我们经常会要用的genkey指令生成key,通过genkey生成public key和private key后,将public key放到远程主机的authorized_hosts文件中。这样远程主机以后再收到authorized_hosts节点的请求,会随机生成一段字符,并发送给该host,该host通过自己的公钥对这些字符加密,再返回给远程主机,远程主机再通过该host的公钥解密,认证通过久okay了。这也就是我们把我们的公钥放到远程主机的作用。
显示全文

查看更多主题的豆瓣日记和相册

十三呀
作者十三呀
3日记 1相册

全部回应 0 条

添加回应

十三呀的热门日记

值得一读

    豆瓣
    我们的精神角落
    免费下载 iOS / Android 版客户端