SSH定义
- SSH全称为Secure Shell,中文意思为安全外壳协议
- SSH是一种协议标准,专门为远程登录和其他网络服务提供安全性保证的一种协议。
SSH的历史溯回
SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。
为什么要使用SSH
首先我们要了解一个问题,我们为什么需要使用SSH协议?SSH协议到底能为我们提供什么好处呢?
传统的网络服务程序,如ftp、pop和telnet等传输方式,实际上都存在着极大的安全隐患。因为他们在网络上都是用明文传输口令和数据。这些口令和数据很容易就会被人截获。造成难以估计的损失。
这个时候,我们就需要使用SSH,通过SSH我们可以把所有传输的数据进行加密,这样就不会被人盗取数据了。SSH还有一个好处就是传输的数据是经过压缩的,因此可以加快传输的速度。
可以说,SSH为我们提供了一个既安全又快捷的“通道”。
SSH的工作原理
说完了SSH的优点。那么接下来问题来了。我们怎么样对数据进行加密来保障安全性呢?加密的方式一共有两种:
- 对称加密(也称为秘钥加密)
- 非对称加密(也称为公钥加密)
那么我们接下来来详细介绍一下这两种加密方式:
对称加密
指加密和解密的时候使用同一套秘钥。
- 优点:对称加密的加密强度高,很难破解。
- 缺点:对称加密的密钥一旦被窃取,那么整个系统的安全性就彻底被摧毁了。
因此,为了解决这个问题,非对称加密产生了。非对称加密有两个密钥:“公钥”和“私钥”
非对称加密
两个密钥:“公钥”和“私钥”
- 特性:公钥加密后的密文,只能用私钥解密。公钥和私钥分离,机会解不开。
- 在Client和Server各有一个密钥,这样即使在Client端发送解密被盗取公钥时,Sever端还有一个独自的私钥才能解密。这样就保证了数据的安全性。
非对称加密流程
-
Client向Server发送登录请求,Server把自己的公钥发送给Cilent
-
Client使用这个公钥,对密码进行加密。
-
Client将加密的密码发送给Server端。
-
远程Server用自己的私钥进行解密登录密码,然后验证其合法性
-
验证结果若合法,对Client作出相应的相应。
注意:私钥是Server独有的,这样就保证了即使Cilent的登录信息被盗取,也没有用私钥进行解密,这样就保证了数据的安全性。
问题:这样就一定能保证安全了吗?
我们来想一个问题,如果Client端发送登录请求的时候被拦截,拦截者发送了自己的公钥给Client端,Client端用恶意的公钥进行加密,加密之后拦截者再用自己的私钥进行解密,这样Client端的信息还是会被窃取,这种方式就称为中间人攻击
SSH如何解决中间人攻击问题
基于口令的认证
为了解决中间人攻击问题,就要对Server的公钥进行认证,判断是否为中间人。可是SSH的公钥和私钥都是自己自动生成的,没办法公正,所以我们只能通过Client端自己对公钥进行确认。
通常在我们第一次登陆的时候,系统会让我们进行认证:
The authenticity of host 'ssh-server.example.com (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)?
上面的信息说的是:无法确认主机ssh-server.example.com(12.18.429.21)的真实性,不过知道它的公钥指纹,是否继续连接?
当我们输入yes
之后,会出现以下提示:
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
表明host已被确认,并被追加到文件known_hosts
中,接下来输入密码就可以了。
基于公钥认证
上述基于口令认证的过程中,每次登陆都需要输入密码,很麻烦。因此SSH提供了一种免去输入密码过程的登录方式:公钥登录。
基于公钥认证流程:
- Client将自己的公钥存放在Server上,追加在authorized_keys中。
- Server端接收到Client的连接请求后,会在authorized_keys中匹配是否有Client之前存放的公钥pubKey,匹配到了之后生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R),然后将加密后信息发送给Client。
- Client端通过私钥进行解密得到随机数R,然后对随机数R和本次对话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
- Server端也会对R和SessionKey利用同样摘要算法生成Digest2
- Server端最后会比较Digest1和Digest2是否相同,完成认证过程。
我们在基于公钥认证的流程的步骤1中提到,Client要自己手动讲公钥存放在Server上。
需要用户手动将自己的公钥copy上。如下图是GitHub上配置SSH。

SSH实践
SSH的安装
本机安装实践是在基础win10+Ubuntu 上进行的
SSH分为客户端openssh-client和服务器openssh-server,输入一下命令确认电脑上是否安装了客户端和服务器
~$ dpkg -l | grep ssh

如上图所示,Ubuntu默认安装了客户端和服务器,这样就不用我们再安装了。
如果想要远程登录别的机器要安装客户端,要开放本机的SSH服务要安装服务器。
如果你的电脑上没有客户端和服务器,以下指令可以安装客户端和服务器:
~$ sudo apt-get install openssh-client
~$ sudo apt-get install openssh-server

启动服务器的SSH服务
我们安装准备都完成了之后,我们要来确认一下ssh-server是否已经启动了
~$ ps -e | grep ssh

有上图所示表明服务器已经启动了。如果你输入指令之后什么都没显示,那么输入下面的指令:
~$ sudo /etc/init.d/ssh start
~$ ps -e | grep ssh

这样就顺利启动了。
停止和重启SSH服务的指令如下:
~$ sudo /etc/init.d/ssh stop #server停止SSH服务
~$ sudo /etc/init.d/ssh restart #server重启SSH服务
此篇SSH学习谨向简书博主TopGun_Viper写的https://www.jianshu.com/p/33461b619d53图解SSH原理的学习笔记和总结。有兴趣的同学可以移步。
网友评论