SSH原理与实践(二)
主页
- 个人微信公众号:密码应用技术实战
- 个人博客园首页:https://www.cnblogs.com/informatics/
引言
在上一篇文章【ssh原理与实践(一)】中我们详细介绍了SSH两种常用的认证方式,在认证流程中,我们简单提到了建立安全通道的流程,安全通道的建立是客户端和服务端通信安全的基础,本文我们将主要介绍安全通道建立的流程。
本文内容组织结构如下:
- SSH安全通道简介
- SSH1安全通道的建立
- SSH2安全通道的建立
SSH安全通道简介
SSH协议提供了一种在不可信网络建立安全通信的方式,保证了SSH客户端和服务端在通信过程中数据的安全性。SSH建立安全通信的过程,其实就是客户端和服务端协商会话密钥的过程, 后文我们简称为密钥协商。
SSH协议目前主要有SSHv1和SSHv2两个版本,这两个版本在密钥协商流程上存在着较大的差异。在介绍具体协议之前,我们首先介绍下密钥协商过程中用到的几个关键密钥:
| 名称 | 生命周期 | 创建者 | 密钥类型 | 用途 |
|---|---|---|---|---|
| User Key | 永久 | 用户/客户端 | 非对称 | 客户端身份标识 |
| Host Key | 永久 | 管理员/服务端 | 非对称 | 服务端身份标识 |
| Server Key | 临时(定时更新) | 服务端 | 非对称 | 加密会话密钥(仅用于SSH1) |
| Session Key | 临时(会话) | 客户端和服务端 | 对称 | 保密通信 |
说明:
- User Key:客户端SSH公钥,由用户生成,代表SSH
客户端身份,用于客户端身份认证,存储在~/.ssh/id_rsa。 - Host Key:服务端SSH公钥,由管理员生成,代表
服务端身份,用于服务端身份认证,存储在/etc/ssh/ssh_host_rsa。 - Server Key:仅在SSH1中使用,定时更新(一般为一个小时),主要用于保证通信消息的
前向安全, 存储在内存。 - Session Key:会话密钥与会话绑定,只在客户端和服务端本次会话中有效,用于加密通信数据。在SSH1中会话密钥为
一个对称密钥,在SSH2中为一组密钥,逻辑功能上与SSH1会话密钥一致,但是提供了更高的安全性。存储在内存。
上述密钥在SSH中存储和应用示意图:

- User Key、Host Key、Server Key用于密钥协商
- Session Key用于加密通信
SSH1安全通道的建立
SSH1密钥协商流程如下:

- 客户端Client访问服务端Server,触发密钥协商
- 客户端和服务端对SSH协议版本进行协商,并进行兼容性检查,如果不兼容,则密钥协商失败。
- 服务端生成Server Key和随机数,这里的Server Key用于
保证前向安全,随机数用于防止重放攻击。 - 服务端将Host Key公钥、Server Key公钥以及随机数发送给客户端,同时基于上述数据本地生成
会话ID(会话ID用于标识本次会话,在【ssh原理与实践(一)】的公钥认证流程中有应用) - 客户端
本地生成会话ID和会话密钥(在SSH1密钥协商中,会话密钥由客户端生成,并发送给服务端) - 客户端对
会话密钥加密,并发送给服务端。(这里的加密用到了服务端的Server Key,由于Server Key为临时密钥,每次协商会变化,因此即使服务端Host Key被窃取,也无法恢复历史会话密钥,解密通信数据) - 服务端首先使用Server Key私钥解密密文,然后使用Host Key私钥进一步解密,得到
会话密钥 - 服务端发送确认消息,并使用会话密钥加密;客户端进行解密验证
- 密钥协商成功后,后续通信使用会话密钥进行
加密通信。
SSH2安全通道的建立
由于SSH2在安全性、扩展性以及架构上具有更大的优势,目前服务器已广泛支持SSH2版本,这里我们重点介绍下SSH2的密钥协商流程:

- 客户端和服务端对SSH协议版本进行协商,并进行兼容性检查,如果不兼容,则密钥协商失败。
- 客户端和服务端对
加密套件进行协商,对后续使用的签名算法、加密算法、MAC算法进行共识。该步骤中客户端和服务端会分别发送临时随机数Cookie(Cookie用于生成会话ID) - 客户端本地生成
EC密钥对,并将公钥(DH密钥协商参数)发送给服务端 - 服务端本地生成EC密钥对,并基于客户端DH参数生成
DH共享密钥(运行DH算法得到,略),最后基于DH共享密钥生成一组会话密钥,该组会话密钥又分为3组:- 对称加密算法的初始向量IV
- 对称算法的密钥
- MAC算法密钥
由于SSH2中不同方向使用的会话密钥不同,因此密钥协商一共6个输出参数。
我们借助wireshark对SSH2密钥协商流程进行分析:
概览图

从上图我们可以看到,服务端和客户端正在进行SSHv2密钥协商:
- 首先客户端访问服务端,触发密钥协商
- 客户端和服务端通过
Protocol消息进行版本协商,客户端支持的版本号为SSH-2.0_OpenSSH_9.0,服务端支持的版本号为SSH-2.0_OpenSSH_8.0,并且从后续流程上看,这两个实现版本是兼容的。 - 客户端和服务端通过
Key Exchange Init消息进行加密套件协商 - 客户端和服务端通过
Elliptic Curve Diffie-Hellman Key Exchange Init和Elliptic Curve Diffie-Hellman Key Exchange Reply进行了会话密钥协商和生成。 - 客户端和服务端通过
New Keys发送确认消息并验证,声明后续进行加密通信。 - 客户端和服务端进行加密通信,消息类型
Encrypted packet
客户端Key Exchange Init
由于Key Exchange Init成对出现,我们这里仅对Client: Key Exchange Init进行介绍,该消息主要用于加密套件协商。

从上图我们可以看到:
- 随机数Cookie,这里的Cookie主要辅助生成
会话ID。(注:服务端也会生成随机数Cookie) - 支持的加密套件,从客户端发送的加密套件列表中,我们可以看到不仅包含不同方向的
加密算法和MAC算法, 同时还包含压缩算法等。
客户端Elliptic Curve Diffie-Hellman Key Exchange Init

从上图我们可以了解到:
- DH密钥协商使用的密码算法,客户端生成的DH参数基于
curve25519椭圆曲线算法 - 客户端DH参数, 在本次交互中,客户端主要发送了自己的DH参数, 图中显示为
Q_C
服务端 Elliptic Curve Diffie-Hellman Key Exchange Reply
当服务端收到客户端的DH参数时,会本地生成自己的DH参数,并基于双方的DH参数,运行DH算法生成DH共享密钥; 最后基于DH共享密钥和协商的MAC算法,生成一组会话密钥。

从上图中我们可以分析得到:
- 服务端使用了
curve25519生成了自己的DH参数(该算法与客户端使用的一致) - 服务端返回了自己的身份公钥Host Key,同时我们也可以了解到服务端Host Key密钥类型为
RSA密钥。(注:在ssh原理与实践(一)一文中,我们介绍到服务端Host Key在客户端首次访问服务器时需要人工认证。) - 服务端DH参数(与客户端类似,不再赘述)
- 服务端数字签名,该
签名值通过使用服务端Host Key私钥对历史消息以及客户端和服务端的身份公钥等信息的哈希值签名得到。用于对服务端进行身份验证。 - 服务端发送了New Keys`确认消息,声明后续进行加密通信。(后续客户端会发送相同的消息,不再赘述)
结论
本文主要介绍了SSH密钥协商的流,并对SSH1和SSH2不同版本密钥协商的详细流程和关键参数进行了介绍。SSH2与SSH1相比,提供了更加安全的密码算法,具有更强的安全性。
同时我们也可以看到,SSH密钥协商流程与我们TLS原理与实践系列提到的TLS握手流程 (TLS密钥协商),虽然细节上差别较大,但是整体流程上是一致的。实际上SSH也有基于TLS进行实现的,但由于TLS涉及到复杂的PKI数字证书分发的复杂流程,在SSH具体应用中较笨重,未普及。
参考资料
- The Secure Shell (SSH) Protocol Architecture
- The Secure Shell (SSH) Transport Layer Protocol
- The Secure Shell (SSH) Authentication Protocol
- SSH-1: https://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch03_04.htm
- SSH-2: https://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch03_05.htm#ch03-10732.html
SSH原理与实践(二)的更多相关文章
- WebSocket原理与实践(二)---WebSocket协议
WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...
- [从Paxos到ZooKeeper][分布式一致性原理与实践]<二>一致性协议[Paxos算法]
Overview 在<一>有介绍到,一个分布式系统的架构设计,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是产生了一系列的一致性协议. 为解决分布式一致性问题,在长期的探索过程中 ...
- RPC原理与实践(二)----Thrift分层模型
这一节我们从一下几个方面来讲一下Thrift的分层架构,按照官方的定义这是Thrift的网络栈,其中网络栈中分为一下几个部分,(由栈顶到栈底)server,processor,protocol,tra ...
- SSH 的原理和实践
最近自己在学习使用SSH,现将自己理解的SSH原理和实践SSH的操作写成一篇博客,以供日后查看. 一.SSH是什么?为什么会出现SSH? SSH英文全称是Secure Shell,即安全外壳.首先SS ...
- SSH原理与运用(二):远程操作与端口转发
SSH原理与运用(二):远程操作与端口转发 作者:阮一峰 (Image credit: Tony Narlock) 七.远程操作 SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作. 上一 ...
- SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)
SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解
深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...
- SSH原理讲解与实践
一.简介 SSH全名Secure Socket Shell,安全外壳传输协议.专为远程登录会话和其他网络服务提供安全性的协议 二.加密算法 要了解SSH的原理,就要先知道目前主流的俩种加密算法 2.1 ...
- [转帖]SSH原理与运用(二):远程操作与端口转发
SSH原理与运用(二):远程操作与端口转发 http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html 接着前一次的文章,继续介绍S ...
随机推荐
- 关于git的几点疑问
git rename后查看之前的记录 对于某个文件进行rename之后,使用show log命令查看之前的修改记录都会丢失,通过命令行方式进行mv之后,在tortoisegit中查看记录还是丢失的 g ...
- TienChin-课程管理-课程搜索
后端 新建 CourseVO.java: /** * CourseVO类是一个课程的值对象,用于存储课程的相关信息. * 它包含了课程的名称.类型.适用对象.最低价格和最高价格等属性. */ publ ...
- TienChin 开篇-运行 RuoYiVue
开篇 目的: 让大家随心所欲的 DIY 若依的脚手架 不会涉及到太多基础知识 踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑) 下载 RuoYiVue Gitee: https://git ...
- 携程Java三面面经,已拿 offer!!
分享一位读者投稿的携程校招 Java 岗位的面经. 下面是正文. 个人背景:双非本,机械专业转码. 携程在正式面试之前,会有一个性格测试(40分钟).性格测试之后,大概过一周进行笔试.笔试之后,会邮件 ...
- Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能 Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark中,Milvu ...
- 【九】强化学习之TD3算法四轴飞行器仿真---PaddlePaddlle【PARL】框架
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- 东吴名贤传<二>薛综传
古典记载 吴录曰:其先齐孟尝君封於薛.秦灭六国,而失其祀,子孙分散.汉祖定天下,过齐,求孟尝后,得其孙陵.国二人,欲复其封.陵.国兄弟相推,莫適受,乃去之竹邑,因家焉,故遂氏薛.自国至综,世典州郡, ...
- PLSQL Developer汉语设置
PLSQLQ Developer是由Oracle公司推出的数据库开发工具,具有很好的移植性和适应性.但是当我们安装完成Oracle11g PLSQL Developer工具后发现状态栏的显示是英文,对 ...
- 4、Web前端学习规划:JavaScript - 学习规划系列文章
JavaScript作为Web前端里的第3重要的语言,笔者认为该重点进行学习.因为JavaScript衍生出来的框架和类库有不少,而且很强大.所以JavaScript的学习要抓好重点,在基本的语法及应 ...
- Python - 将RTF文件转为Word 、PDF、HTML格式
RTF也称富文本格式,是一种具有良好兼容性的文档格式,可以在不同的操作系统和应用程序之间进行交换和共享.有时出于不同项目的需求,我们可能需要将RTF文件转为其他格式.本文将介如何通过简单的Python ...