在计算机网络中,需要登录远程计算机。从历史上看,这是通过 Telnet(始于 20 世纪 60 年代末)和 rlogin(始于 20 世纪 80 年代)实现的。然而,这些早期的程序并不安全。SSH(Secure Shell)是为解决这些缺陷而创建的协议。它在不安全的网络上建立安全连接。
SSH 采用客户端-服务器架构。客户端是指试图连接远程服务器的机器。SSH 对客户机和服务器进行身份验证。它规定了客户端和服务器如何就共享秘密达成一致,以便随后对数据包进行加密。最后,它还提供数据完整性保护。
SSH 有两个版本:SSH-1 和 SSH-2。SSH-2 由 IETF 标准化。SSH 已被广泛采用。现代操作系统都内置了 SSH 客户端。OpenSSH 是一种流行的开源实现方式。也有商业实施方案。
下面将逐步解释 SSH 的三个主要层: 传输层、验证层和连接层。
01 传输层
传输层提供加密、完整性和数据保护,确保客户端和服务器之间的通信安全。
第 1 步 - 建立 TCP 连接
客户端启动与 SSH 服务器的 TCP 连接,通常是在 22 端口。
第 2 步 - 协议版本交换
客户端和服务器交换包含各自支持的 SSH 协议版本的标识字符串。
第 3 步 - 算法协商
客户端和服务器就加密、密钥交换、MAC(消息验证码)和压缩所使用的加密算法达成一致。
第 4 步 - 密钥交换
密钥交换算法(如 Diffie-Hellman)用于安全生成共享秘密。这一过程可确保双方在不直接传输的情况下获得相同的会话密钥。
第 5 步 - 会话密钥推导
会话密钥是从共享秘密和其他交换信息中推导出来的。这些密钥用于加密和解密通信。
第 6 步 - 密码初始化
双方使用导出的会话密钥初始化各自选择的加密和 MAC 算法。
第 7 步 - 数据完整性和加密
传输层为客户端和服务器之间的所有后续通信提供数据完整性检查和加密。
02 验证层
验证层验证客户端的身份,确保只有授权用户才能访问服务器。
第 1 步 - 服务请求
客户端请求 "ssh-userauth "服务。
第 2 步 - 身份验证方法广告
服务器公布可用的身份验证方法(如密码、公钥、键盘交互)。
第 3 步 - 客户端身份验证
客户端尝试使用一种或多种可用方法进行身份验证。常见方法包括:
- 密码验证:客户端向服务器发送密码,由服务器进行验证。
- 公钥验证:客户端证明拥有与先前注册的公钥相对应的私钥。
- 键盘交互式身份验证:服务器向客户端发送提示,客户端回复所需的信息(如 OTP、安全问题)。
第 4 步 - 身份验证成功/失败
如果客户端的凭据有效,服务器将允许访问。否则,客户端可尝试其他认证方法或关闭连接。
03 连接层
连接层将加密和认证通信复用为多个逻辑通道。
第 1 步 - 创建通道
客户端请求为各种类型的通信(如 shell 会话、文件传输、端口转发)打开通道。
第 2 步 - 信道请求
每个通道请求包括所需服务类型和任何附加参数等详细信息。
第 3 步 - 信道数据传输
数据通过已建立的信道传输。每个通道独立运行,允许多个服务在一个 SSH 连接上同时运行。
第 4 步 - 关闭通道
通道可以相互独立关闭,而不会影响整个 SSH 连接。关闭所有通道后,客户端即可终止 SSH 会话。
第 5 步 - 全局请求
连接层还支持全局请求,全局请求会影响整个连接而不是单个通道(例如,重新加密钥会话)。