SSH 介绍、基本使用及原理
最近买了一台阿里云学生机,自带的「连接工具」真的难用,所以就有了在「本地终端」连接「远程服务器」的需求,也就是 SSH
什么是 SSH ?
先搬 Wikipedia:
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现 SSH客户端服务器之间的连接
讲的挺清楚,就是 帮助两个「端」安全连接和通信的协议。这里用「端」这个字是因为 SSH可以是两台计算机通信,并不一定非得是「客户端」与「服务器」。
SSH 的基本使用
本文只讲 Shell 环境下 SSH的使用,适用于 Linux、Ubuntu、Mac 这些内置 SSH 和 Shell 的操作系统。Windows 使用可以移步这篇文章: Windows下借助 Putty 使用 SSH
常用的三种方法:
SSH 主要用于远程登录。假定你要以用户名 user,登录远程主机 host,只要一条简单命令就可以了。$ ssh user@host如果本地用户名与远程用户名一致,登录时可以省略用户名。$ ssh hostSSH 的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用 p 参数,可以修改这个端口。$ ssh -p 2222 user@host上面这条命令表示,SSH 直接连接远程主机的2222端口。
SSH 的功能
SSH协议主要实现三个功能:
「用户」和「服务器」的合法性验证。确保数据发送到正确的客户机和服务器上。加密数据。保证数据的安全和私密。保护数据的完整性。利用Hash函数验证信息完整性。SSH 原理
SSH之所以能安全通信,是结合了 公钥 和 私钥 两个加密方法。先介绍一下这俩种加密方法。
ps:有的 SSH 使用的是 DH 算法,后续有时间再补上。私钥算法
私钥加密算法,又称 对称加密算法,因为这种算法「解密密钥」和「加密密钥」是相同的。也正因为同一「密钥」既用于加密又用于解密,即任意一方只要得到「密钥」都可以使用该密钥解密数据,所以这个密钥是不能公开的。只有通信双方知道,才能保证私密通信。这也就是私钥的缺点: 一旦有一方背叛或泄露,整个加密就失效了。反之,它的优点就是: 如果可以确保「私钥」不被泄露,那么利用它通信就是非常高效的。因为计算量比「公钥」小。
1976年以前的加密方式多为这种 对称加密算法。因为没有其它更好的方式。
公钥算法
公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是「公钥」,另一个是「私钥」。所有人都可以生成自己的「公钥」和「私钥」。
以「张三」为例:「张三」有两种钥匙:
一把私有的钥匙称为私钥,仅「张三」自己才拥有。一把公开的钥匙称为公钥,可公开发行配送,谁想和「张三」通信谁就可以拥有。假如「李四」想和「张三」发信息,那么「李四」只要拿到「张三」公开的公钥,用公钥进行加密,那么这个信息只有「张三」才能解读出来,因为只有「张三」有私钥。这就保证了「李四」信息的保密性。那如何保证「张三」发给「李四」的信息保密呢?这是后续session-key的事情,继续往下看行了。需要注意的是:
「公钥」和「私钥」是成对出现的,两者是对应的,一个「公钥」对应一个「私钥」。两者本身并没有规定谁是「公钥」或「私钥」,只是我们一般把公开叫做「公钥」,自己私藏起来的叫做「私钥」。只有「公钥」可以解开「私钥」加密的信息。只有「私钥」可以解开「公钥」加密的信息。「公钥」不能解开自己加密的信息,「私钥」也不能解开自己加密的信息。如果你对 如何实现这种「公钥」和「私钥」的相互加密和解密感兴趣,可以看非对称加密是如何实现的?SSH 的实现过程
接通阶段。客户端唤醒服务器,服务器回应,并把自己的「公钥」发给客户端,代表可以建立连接。密码交换阶段。客户端随机生成一个session-key用服务器的「公钥」加密 然后发给服务器,后续两者通信都是用这个session-key加密通信。这里我们可以看出,只有再建立连接的时候,才使用「公钥算法」。后续通信都是使用同一个密码进行「加密和解密」,也就是「对称加密算法」。这是因为「公钥算法」计算量太大,这也是为什么建立连接的时候常常需要几秒钟。检验阶段。客户机和服务器 互相检验身份。结束阶段。身份验证成功后,就可以进行正常通信,通信使用session-key对称加密。##SSH 的安全性谈到 SSH 的安全,就躲不开「中间人攻击」。上述通信中,如果客户端发给服务端的请求被「中间人」拦截,「中间人」把自己的「公钥」发给用户,用户很难辨别,这就导致session-key暴露。相应的用户密码也就暴露了。
如何避免「中间人攻击」?
「公钥登录」可以避免中间人攻击,同时也可以实现免密码登录。所谓「公钥登录」,过程就是:
用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。因为 SHH 主要用于登录自己的服务器,所以往自己服务器上储存一个「公钥」,这种方式是可行的。这种方法要求用户必须提供自己的公钥。如果你没有「公钥」,可以直接用本地shell环境 执行下面命令生成一个:
$ ssh-keygen
运行上面的命令以后,系统会出现一系列提示,可以一路回车。运行结束以后,在~/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
这时再输入下面的命令,将公钥传送到远程主机host上面,这一步要验证密码:
$ ssh-copy-id user@host
之后,登录远程主机就不需要输入密码了,如下图:
题外话
互联网的时代,加密的需求一直都在,与自己主机连接的时候需要加密,访问别人的网站 也就是与别人的服务器建立连接,这个过程也要加密,也就是https协议(http不保证加密)。
但是别人的服务器 不可能存放所有用户的「公钥」,也不是所有用户都有「公钥」。所以这个时候想避免「中间人攻击」就需要第三方机构来帮忙,也就是我们说的CA机构。对https避免「中间人攻击」感兴趣的,可以看下这篇文章数字证书、公钥、私钥的关系。
点击留言~
举报/反馈

小梁带你看世界

97获赞 41粉丝
学习互联网思维,多维度看待世界。
关注
0
0
收藏
分享