主页
- 个人微信公众号:密码应用技术实战
- 个人博客园首页: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中不同方向
使用的会话密钥不同
,因此密钥协商一共