SSH 如何工作

Secure Shell (SSH) is a cryprographic network protocol for operating network services securely over and unsecured network.
– from wiki

SSH,或称 Secure Shell,是一个远程管理协议可以通过因特网允许用户控制和修改远程服务器。这个服务创建是别用来替换未加密的 Telnet,并且用密码技术确保与远程服务器通过加密的方式交流。它提供了一种机制,用于验证远程用户,将从客户端输入的内容传输到主机,以及将输出的内容返回给客户端。

配置

SSH 登录:

  1. 通过 ssh-keygen 生成秘钥对
  2. 通过 ssh-copy-id 或者手动将生成的公钥添加到远程服务器 ~/.ssh/authorized_keys
  3. 1
    ssh user@hostname

工作过程

在整个过程中客户端与服务器端会经历下面几个阶段

  • 建立连接阶段
  • 版本号协商阶段
  • 算法协商阶段
  • 密钥协商阶段
  • 认证阶段
  • 会话请求阶段
  • 会话交互阶段

建立连接

客户端向服务端发起 TCP 连接进行三次握手

版本号协商


客户端与服务端建立连接后,互发自己的 SSH 版本号,选取两者中较低的版本号进行之后的通讯

算法协商


客户端、服务端分别列出支持的算法并协商出算法生成会话密钥

密钥协商

此时会根据上一步算法协商出来的算法来动态加密解密数据,并生成会话密钥

可以配置在 config 里配置 KexAlgorithms,配置的将追加到 KexAlgorithms 列表里而不是替换。

认证阶段

对于密钥方式

  1. 客户端发起一个认证请求,将本地公钥等使用算法协商阶段生成的会话密钥加密后发给服务端
  2. 服务端使用会话密钥解密后,根据客户端传的公钥去 authorized_keys 找对应公钥,若未找到自动断开,反之会随机生成 256 位字符串,称为“质询”,并使用对应公钥对其加密,再次使用会话密钥将数据加密(双重加密,公钥加密、会话密钥加密)并发送给客户端
  3. 客户端首先使用会话密钥解密,再使用公钥解密得到质询使用会话密钥加密后发送给服务端
  4. 服务器端根据会话密钥解密后与之前生成的质询判断,不相同则断开连接

会话请求阶段

  1. 认证通过后,客户端向服务器发送会话请求
  2. 服务器处理客户端的请求,请求被成功处理后,服务器会向客户端回应 SSH_SMSG_SUCCESS,SSH 进入交互会话阶段;否则失败。

会话交互阶段

会话请求阶段

  1. 认证通过后服务器等待客户端请求

会话交互阶段

  1. 客户端执行的命令加密后传给服务器
  2. 服务器接收到报文解密后执行命令,并将结果加密返回给客户端
  3. 客户端将结果解密后显示

  • ssh-add -l 可以查看当前 session 中开启 forward agent 中密钥信息
  • ssh -T github.com 测试