Linux SSH连接交互过程是怎样的?

赞赏 2016-07-12

​SSH 服务在进行数据传输前,会先进行密钥交换和协商确认。完成后再对后续数据进行加密传输,以提高安全性。本文先对 SSH 服务所采用的非对称加密技术进行简要介绍,然后对 SSH 连接过程中的相关交互,及关联文件进行说明。


SSH 服务建立连接时的相关交互过程,如下SSH 服务连接交互示意图 所示:

连接过程中的相关交互步骤,详细说明如下。

  • 服务端准备阶段
  • 非对称加密协商
  • 后续数据交互过程


服务端准备阶段

服务端在每次启动 SSH 服务时,都会自动检查 /etc/ssh/ 目录下相关密钥文件的有效性。如果相关文件检查发现异常,则会导致服务启动失败,并抛出相应错误信息。 如果文件相关不存在,则会自动重新创建。

默认创建的相关文件及用途说明如下:

ll /etc/ssh/
-rw-------. 1 root root 125811 Aug 13  2015 moduli → 用于 DH-GEX 算法
-rw-r--r--. 1 root root   2047 Aug 13  2015 ssh_config → SSH 客户端配置文件
-rw-------. 1 root root   3879 Aug 13  2015 sshd_config → SSH 服务配置文件
-rw-------. 1 root root    672 May 20 14:22 ssh_host_dsa_key → DSA 算法私钥
-rw-r--r--. 1 root root    590 May 20 14:22 ssh_host_dsa_key.pub        → DSA 算法公钥
-rw-------. 1 root root    963 May 20 14:22 ssh_host_key → SSH V1 版RSA 算法私钥
-rw-r--r--. 1 root root    627 May 20 14:22 ssh_host_key.pub → SSH V1 版 RSA 算法公钥
-rw-------. 1 root root   1675 May 20 14:22 ssh_host_rsa_key → SSH V2 版 RSA 算法私钥
-rw-r--r--. 1 root root    382 May 20 14:22 ssh_host_rsa_key.pub        → SSH V2 版 RSA 算法公钥


非对称加密协商

服务端 SSH 服务正常运行后,客户端连接时,进行如下交互:

1:客户端向服务端发送连接请求。

客户端通过 SSH 工具连接服务端。相关信息通过明文发送

2:服务端返回公钥信息:

根据客户端所使用的服务协议版本及算法设置,返回相应公钥信息。比如,默认情况下,客户端通过 SSH V2 版协议,基于 RSA 算法建立连接,则服务端将 ssh_host_rsa_key.pub 文件中的内容返回客户端。相关信息通过明文发送。

3:客户端对服务端公钥信息进行比对和确认:

客户端接收到服务端公钥信息后,会进行如下比对,并让用户对相关信息进行确认。

如果是首次连接服务端,客户端会收到类似如下信息,让用户确认公钥指纹的有效性:

The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc.
Are you sure you want to continue connecting (yes/no)?

如果用户输入 no ,则连接中断并报错(Host key verification failed)。

如果用户输入 yes,则会将相应的公钥信息,保存到当前用户家目录下 .ssh 目录内的 known_hosts 文件中。 比如:

cat ~/.ssh/known_hosts

IP 明文显示:
192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3sdlboGEgY9buZpkPuygPw0NxAvmxYd0mc3fo2MgP+JqgFC9/9ZXOgDXKJrjE2HKBieJZSPKGncIh+zLxTvmykeJQBXv7i1GiUjW+H3VY69Ge3AdGfCd+XF+Cvi1e+j18zhHnjSzvIBoNpT5cBWWNbw7mNHCwTb0sHAVUkWR4Ck/LM5/rQ09A+m6BLfZJL8CRNGxKTbyINi6o812S+Cy64WqDs1nTpIXp2Bkcpjclb36bFSs9Z/tWNuJl7A//7HNtxMgFGBnE07Ykvvy8s06DUmkyFy8GcXGBpnfdg9utLodfQLFQnKflCQZ110BpQaCWlWPjU9dc4w3XLJ/XQOP4w==

IP 做了加密处理:
|1|3efXAZ4sNHcUcHamBy4gDriblc8=|8idBhLq9aLl2sfh4KswMsk4sPFI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwS4DE3hok8RCkxYlTxsexNrNa62e05UGSkoP7ie26DDWjG1Aoc74cCsE4is9p7lEfFUYYlAzeYhPqE/yGf5YxRZUOU2IeFI4cEqo8YZr7edVYpgAq2f2J0zMwk1syenD12lmUPkYA4mMB6it3jxXR5k+H0HZh9YA7mRXkiTjlkAMWirBcnUvtKYRv9LRIr3ikUiPy2gfZO291Ae9zuTsWwEtHQxIpiBgk3vwF2gCUFlX9y//IsMjdQq5prk7x3BjXhUorqgJO1gt1VHW8Xxx9Oe50YF1hi9DuE6VXwyh4xfHTmauRQybwsYafdA3HxrA2od6x9l19D9EH7xHAjDa5w==

如果服务端因重装系统等因素导致公钥指纹出现变化,则会直接导致连接失败(报错Host key verification failed),则需要删除已保存的条目后再重新连接。

如果之前已经成功连接,而且公钥指纹对比一致,则会继续下一步操作。 

4:客户端生成临时密钥对:

服务端公钥校验及确认后,客户端会生成一对临时密钥用于客户端加密。该密钥对不会存储到文件,而是记录在内存中。每次连接都会重新生成临时密钥对。

5:客户端发送公钥信息:

客户端向服务端,发送前述生成的临时密钥对中的公钥信息。相关信息通过明文发送。

至此,服务端及客户端都拥有对方的公钥和自身的私钥,所以称为非对称加密。

 

后续数据交互过程

后续登录校验及正常的数据传输,都会通过双向加密方式进行。相关交互说明如下:

  • 如果服务端需要发送数据给客户端:
  • 服务端使用所持有的客户端公钥,对需要传输的数据进行加密,再发送给客户端。
  • 客户端收到信息后,使用所持有的自身私钥解密后获取数据。
  • 反之,如果客户端需要发送数据给服务端,也是类似的流程:
  • 客户端使用所持有的服务端公钥,对需要传输的数据进行加密,再发送给服务端。
  • 服务端收到信息后,使用所持有的自身私钥解密后获取数据。

 


更多信息

公钥指纹
由于公钥一般较长(采用RSA算法时长达 1024 位)。所以,为了简便起见,通过对其MD5计算,生成一个128位的字符串用于信息对比。此称为公钥指纹。

  • Secure Shell:Wikipedia 上关于 SSH 的介绍和讨论。
  • OpenSSH Manual Pages:OpenSSH 官方使用手册。
  • RSA:Wikipedia 上关于 RSA 算法的介绍。
  • DSA:Wikipedia 上关于 DSA 算法的介绍。


登陆后阅读全文
阅读 1708 赞赏 0 有用 5 没用 0 收藏 0 分享

注意事项

本文相关配置及说明已在 CentOS 6.5 64 位操作系统中进行过测试。其它类型及版本操作系统配置可能有所差异,具体情况请参阅相应操作系统官方文档

   



0 条留言

linux分享的头像

linux分享

每个软件都有确定的用途

相关文章

Linux SSH 基于密钥交换的自动登录原理是怎样的?

安全组设置允许SSH登录到 Linux 实例

SSH 服务启动时出现如下错误:main process exited, code=exited

SSH 登录时出现如下错误:Permission denied, please try again

启动SSH服务时出错:Bad configuration options,怎么解决?

Linux下SSH如何配置更安全? (改端口 禁root 限IP)

Linux 通过端口转发来访问内网服务

Linux 如何启动或禁止用户或 IP 通过 SSH 登录?

SSH 登录时出现如下错误:login: Module is unknown

SSH 登录时出现如下错误:pam_listfile(sshd:auth): Refused user root for

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

我是如何执行 "rm -rf ~" 的

正态分布为什么常见?(财富的分布却不符合正态分布)

Linux下窗口管理器 xmonad 的使用教程

用披萨做比喻来解释 IaaS,PaaS,SaaS 的区别

如何制作CSR(证书私钥和证书请求文件)文件?

php RedisException with message read error on connection

Windows环境下ping丢包或不通时链路测试工具推荐

Linux下ping丢包或不通时链路测试工具推荐

链路测试结果分析说明及常见链路异常场景和测试报告

SSH 登录时出现如下错误:login: Module is unknown

手机扫一扫
分享文章