请注意:本文编写于 2021-10-22,其中某些信息可能已经失去时效性。
Secure Shell(安全外壳协议,简称 SSH)是一种加密的网络传输协议,可以再不安全的网络中为网络服务提供安全的传输环境。 ——维基百科
通过维基百科的说明可以看出 SSH 实际上指的是一种加密的网络传输协议,而我们经常用来登录远程主机的 ssh 命令实际上是某个软件对 SSH 这种协议的包装实现,其中最常见的开源实现方案是 OpenSSH(OpenBSD Secure Shell)。
SSH 目前还是比较可靠的,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。SSH 的另一项优点是其传输的数据可以是经过压缩的,所以可以加快传输速度。
SSH 当下有两个版本,分别是 SSHv1 和 SSHv2,v2 是主流版本,v1 版本存在中间人攻击的安全风险。
SSH 协议规定的通讯流程可以分解成几个主要阶段:
DH 算法可以在一个不安全的信道上建立安全连接,从而解决不安全信道上信息安全交互的问题。
假设 A 与 B 要在不安全信道上使用 DH 算法安全地交换信息,大致流程如下:
注 1:流程中的数理知识这里不做普及,因为博主本身也不是很懂; 注 2:这里给出的仅仅是一个粗略的原理解释,并非最佳实现过程;
算法成立的原因:再此方法中公开数据有 p,g,Y_{A},Y_{B},若想要通过公开数据计算 K,则需要求取 Y_{A} = g^{a} mod p \mid Y_{B} = g^{b} mod p 中的 a 或 b,求解此类问题一般使用穷举法,时间复杂度为 O(p),只要 p 足够大就能够保证此方法目前可以达到计算机安全的要求。
博主技术有限,没筛选出这一流程的 TCP 包,因此参考 第三篇参考文章 给出 diffie-hellman-group-exchange-sha256 的大致实现流程:
H 的计算方法:H = hash(VC \parallel VS \parallel IC \parallel IS \parallel KS \parallel YC \parallel YS \parallel K)
类型 | 名称 | 意义 |
---|---|---|
string | VC | 客户端的初始报文 |
string | VS | 服务端的初始报文 |
string | IC | 客户端 SSH_MSG_KEX_INIY 的有效载荷 |
string | IS | 服务端 SSH_MSG_KEX_INIT 的有效载荷 |
string | KS | 服务端主机密钥(host key 一般是 RSA 公钥) |
string | YC | Y-客户端 |
string | YS | Y-服务端 |
string | K | 通过 DH 产生的共享密钥 |
以上内容按顺序进行拼接,不夹杂或尾随多余字符,拼接后的字符串进行 sha256 计算出结果就是 H 即 session_id。只有会话第一次密钥交换生成的 H 是 session_id,后面再进行密钥交换时,session_id 不会改变。
后续通信一般是采用 AES 算法进行加密,密钥计算方法:hash(K \parallel H \parallel W \parallel session-id),其中 W 代指单个大写的 ASCII 字母,不同的加密秘钥使用不同的字符来计算。
字母 | 类型 |
---|---|
A | 客户端到服务端的初始 IV |
B | 服务端到客户端的初始 IV |
C | 客户端到服务端的加密秘钥 |
D | 服务端到客户端的加密秘钥 |
E | 客户端到服务端的完整性秘钥 |
F | 服务端到客户端的完整性秘钥 |
经过计算得到字符串 RE,如果我们想要的秘钥长度比 RE 长,则在 RE 后面继续加上一个值:hash(K \parallel H \parallel RE) 成为一个加长的 RE。如果还不够,则继续使用同样方法进行累加。
注 1:关于秘钥计算公式中 H 和 session-id 同时出现博主表示存疑,但是没找到更多资料所以暂时先这么写了,如果具体实现和给出内容有出入的话希望您能不吝赐教,第一时间联系博主进行修改。
我对 SSH 协商过程的理解:
我的疑惑是: 看很多资料在解释Linux下两台主机ssh通信协商时会提到DH(diffie-hellman),我知道DH是密钥交换算法,可以使通信双方安全地产生一个公共密钥(对称密钥)。但是通过上述> 上述协商过程,A 和 B 不是已经可以利用 RSA 算法产生的公钥和私钥进行加密通信了吗,那为什么还需要 DH 算法呢? 难道上述过程之后还要用 DH 算法再生成一个公共密钥? ——知乎问题:SSH为什么要用到DH(Diffie-Hellman Exchange)?
首先要指出的是问题提出者所理解的 SSH 协商过程是错误的。
至于为什么不直接用 RSA 算法进行加密通信其实和 HTTS 差不多一个道理:RSA 算法是非对称加密算法,消耗资源多,运行效率低,不适合用于长连接下的数据交换加密。
如果想看此问题下的更多展开内容推荐 点击此链接查看第六篇参考文章 给出的回答。
常见的客户端认证方式有两种
~/.ssh/authorized_keys
中,注意需要 SSH 服务端拥有此文件的访问权限。OpenSSH 是在 1999年 10月第一次在 OpenBSD 2.6 里出现,当初的项目是取代由 SSH Communications Security 所提供的 SSH 软件。 ——维基百科
程序主要包括了几个部分:
常用选项:
选项 | 含义 | 作用 |
---|---|---|
-t | type | 指定要生成的密钥类型 |
-C | comment | 提供一个注释 |
-b | bits | 指定要生成的密钥长度(单位:bit) |
-f | filename | 指定生成的密钥文件名 |
ssh-agent 是 OpenSSH 开发的用户提供 ssh 代理的工具,它可以为其他需要使用 ssh key 的程序提供代理。
ssh-add 是用来配合 ssh-agent 的,使用此工具可以向 ssh-agent 中添加私钥。
可以用过 ssh-add -l
查看已经添加的私钥列表。