SSH 的原理和实践
最近自己在学习使用SSH,现将自己理解的SSH原理和实践SSH的操作写成一篇博客,以供日后查看。
一、SSH是什么?为什么会出现SSH?
SSH英文全称是Secure Shell,即安全外壳。首先SSH是一个网络协议,用来在远程登录等远程操作管理中进行安全的数据传输的协议。我们早期使用的远程管理协议,包括ftp、telnet等都是使用明文在网络上传输数据,这样是很危险的,使用一些抓包工具就能截获这些数据。同时还可能会受到“中间人”攻击,中间人可以模仿服务器,接受客户端发来的数据,经过“中间人”的处理后再模拟客户端将数据发给真正的服务器。所有为了解决这个安全问题,提出了SSH协议,SSH协议本质上就是发送加密后的数据,提高安全性。SSH需要解决明文数据不安全和中间人攻击的问题。
SSH是一个协议,有很多实现,由于SSH不开源,我们一般使用OpenSSH。SSH也有几个版本,一般是SSH1和SSH2。
二、SSH的原理和具体过程
为了理解SSH,我们先要了解加密。加密一般分为对称加密和非对称加密。顾名思义,对称加密是指加密和解密所使用的方法是一样的;非对称加密中加密和解密的方法不一致。在非对称加密中,存在两组密钥,一个是公钥,一个是私钥。公钥用于加密,私钥用于解密。一般来说公钥是对外公布的,只有拥有私钥的用户才能获取真正的数据。
下面根据一个具体的SSH连接分析SSH的原理。
一般地,SSH用于客户端远程登录到远程主机。常见的SSH过程是服务端生成一对公钥和私钥,当客户端请求服务端时,服务端返回公钥给客户端,客户端之后使用公钥加密数据,然后传送给服务端,服务端使用自己的私钥解密数据,从而得到真正的数据,这样就算中间数据被截获,别人也不能破解数据。但是这个过程存在一个问题,如何保证客户端得到的公钥是真的服务端发送过来的?有可能是中间人发送的伪装的公钥,这样就会导致,中间人能够截获到用他的公钥加密的数据,从而能够破解。用于SSH的公钥和密钥都是由自己生成,并没有一个CA验证,只能通过客户端自己确认。为了解决这个问题,提出了两种解决方案:
1. 基于口令的验证
第一次使用SSH连接远程主机时,会提示你如下信息:

可以看到远程主机给我们提供了fingerprint,即服务端的公钥指纹,一般是生成公钥的MD5码,可能会放在某个网站上进行公示,表明这个某某主机的fingerprint,从而客户端据此确定连接的是不是目标远程主机,如果是则输入yes,然后在输入密码,之后这个远程主机就会加入到客户端的 .ssh/known_host 文件中。下次连接时,客户端就会跳过验证host阶段,只要要你输入密码,即可连接到远程主机上。
2. 基于公钥的验证
基于公钥的验证是指客户端将客户端的公钥文件发送到服务端的 .ssh/authorized_keys 文件中。之后客户端请求服务端,客户端会发送一个随机字符给服务端,服务端使用authorized_keys 即 客户端的公钥加密后,发送给客户端,客户端使用自己的私钥解密,再比较之前发送的字符串和解密后的字符串是否一致,如果一致,代表与之连接的服务端是真的服务端。之后连接就不需要输入密码,就可以和服务端建立连接了。

三、SSH实践
实现免密登录,即使用公钥验证。
首先服务端已经安装了ssh服务或者使用github等其他的现成服务。
1. 首先在客户端生成密钥,包含公钥和私钥
ssh-keygen –r rsa
-r 后面制定的是加密方式,我们使用的是rsa。执行完后会生成两个文件:.id_rsa 和 .id_rsa.pub
2. 将客户端的公钥 .id_rsa.pub 添加到服务端的 .ssh/authorized_keys 文件中
3. 之后重启服务端的ssh服务,既可以使用免密登录服务端或其他使用ssh的服务
ssh xxx@0.0.0.0
SSH 的原理和实践的更多相关文章
- 【Todo】ssh的原理和实践
有空的时候补充,可以参考 http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruanyifeng.com/ ...
- 2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践
2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主 ...
- 2018-2019-2 20165312《网络攻防技术》Exp2 后门原理与实践
2018-2019-2 20165312<网络攻防技术>Exp2 后门原理与实践 课上知识点梳理总结 1.后门的概述 后门是指不经过正常认证流程而访问系统的通道 两个关键词:未认证.隐通道 ...
- 2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践 后门的基本概念及基础问题回答 常用后门工具 netcat Win获得Linux Shell Linux获得Win Sh ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Atitit.软件兼容性原理与实践 v5 qa2.docx
Atitit.软件兼容性原理与实践 v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
随机推荐
- [Python3] 014 集合的内置方法
目录 1. Python3 中如何查看 set() 的内置方法 2. 少废话,上例子 (1) add() (2) 又见清理大师 clear() (3) 又见拷贝君 copy() (4) 找茬君 dif ...
- JAVA总结--java数据类型
一.String 1.String定义是指向堆内存中的引用:String的赋值本身是引用对象的切换,切换前后的对象依然存在:源码为:private final char value[]: 2.对多个S ...
- MD5加密 和 自定义加密解密
public class EncryptString { /// <summary> /// MD5加密 /// </summary> /// <param name=& ...
- [2019杭电多校第七场][hdu6651]Final Exam
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...
- SpringBootTest单元测试及日志
springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich. 由于是一系列文章,所以后面的文章可能会使用到前面文章的项 ...
- HBase的访问方式
这里只介绍三种最常用的方式 1.HBase shell HBase的命令行工具是最简单的接口,主要用于HBase管理 首先启动HBase 帮助 hbase(main):001:0> help 查 ...
- 线程屏障CyclicBarrier实现原理
生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...
- CentOS下性能监测工具 dstat
原文链接:http://www.bkjia.com/Linuxjc/935113.html 参考链接:https://linux.cn/article-3215-1.html,http://lhfli ...
- linux 服务器与客户端异常断开连接问题
服务器与客户端连接,客户端异常断掉之后服务器端口仍然被占用, 到最后是不是服务器端达到最大连接数就没法连接了?领导让我测试这种情况,我用自己的电脑当TCP Client,虚拟机当服务器,连接之后能正常 ...
- vue动态生成表单
vue动态生成表单 一.下拉框 <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...