首页 > 其他分享 >SSH协商过程-简版

SSH协商过程-简版

时间:2022-12-10 17:25:23浏览次数:35  
标签:name 协商 简版 list server length client algorithms SSH

1. 二进制协议格式

每个数据包为以下格式

uint32      packet_length
bytepadding_length
byte[n1]    payload; n1 = packet_length - padding_length - 1
byte[n2]    randompadding; n2 = padding_length
byte[m]     mac (Message Authentication Code - MAC); m = mac_length

packet_length: 以字节为单位的数据包长度,不包括 'mac' 或 'packet_length' 域自身。

padding_length: 'random padding' 的长度(字节)。

random padding: 任意长度的填充,使(packet_length || padding_length || payload || random padding)的总长度是加密分组长度或 8 中较大者的倍数。最少必须有 4 字节的填充。填充应包含随机字节。填充的最大长度为 255 字节。

mac: 消息验证码。如果已经协商了消息验证,该域包含 MAC。初始时,MAC 算法必须是"none"。

2. 协议过程

1) 协议版本交换

当 TCP 连接建立后,首先,双方都会发送一个标识字符,用于商定使用的SSH版本信息。该标识字串格式如下:

SSH-protoversion-softwareversion SP comments CR LF

protoversion: 协议版本

softwareversion: 软件版本

SP: 空格

comments: 可选字符串

CR: 回车

LF: 换行

如使用同一主机上的OpenSSH工具,客户端会发送:

 

服务器端会发送:

 

2) 算法协商

第二步,互相发送Key Exchange Init数据包,进行算法协商;数据包内容格式如下:

byte        SSH_MSG_KEXINIT
byte[16]    cookie (random bytes)
name-list   kex_algorithms
name-list   server_host_key_algorithms
name-list   encryption_algorithms_client_to_server
name-list   encryption_algorithms_server_to_client
name-list   mac_algorithms_client_to_server
name-list   mac_algorithms_server_to_client
name-list   compression_algorithms_client_to_server
name-list   compression_algorithms_server_to_client
name-list   languages_client_to_server
name-list   languages_server_to_client
boolean     first_kex_packet_follows
uint32      0(为将来扩展预留)

cookie: 一个由发送方生成的随机值。它的作用是使任何一方都不可能对密钥和会话标识符拥有完全决定权。

kex_algorithms: 密钥交换算法。

server_host_key_algorithms: 受支持的为服务器主机密钥服务的算法的名称列表,按优先级排序。

encryption_algorithms: 可接受的对称加密算法(也称为加密器)的名称列表,按优先级排序。

mac_algorithms: 可接受的 MAC 算法的名称列表,按优先级排序。

compression_algorithms: 可接受的压缩算法的名称列表,按优先级排序。

languages: 语言标志的名称列表,按优先级排序。

first_kex_packet_follows: 表明是否有一个猜测的密钥交换数据包跟随。

如以 OpenSSH 为例,客户端和服务器都会发送:

 

3) Diffie-Hellman 密钥交换

首先,客户端发送:

byteSSH_MSG_KEXDH_INIT
mpint   e

服务器响应如下:

byteSSH_MSG_KEXDH_REPLY
stringK_S,服务器公钥和证书
mpint   f
strings,对 H 的签名

密钥交换在双方各发送一个 SSH_MSG_NEWKEYS 消息后结束

byteSSH_MSG_NEWKEYS

以 OpenSSH 为例

客户端发送:

 

服务端响应:

 

客户端发送 New Keys:

 

服务端发送 New Keys:

 

之后,数据都以加密方式传输。

4) 总体过程

 

转载自:https://blog.csdn.net/weixin_34416754/article/details/92480601

Server端发送的DH Key Exchange Reply信息中,包含了签名后的H值,H是诸多信息的摘要,包含信息见下表:

 Client端收到Server端发来的Reply报文后,会进行以下操作;

标签:name,协商,简版,list,server,length,client,algorithms,SSH
From: https://www.cnblogs.com/dier-gaohe/p/16971894.html

相关文章

  • 记录一次debug网络延迟问题--解决使用SSH工具连接远程主机,命令行卡顿问题
        如题,最近在学习k8s,于是买了两个比较便宜的云服务器搭建k8s集群,然后使用的过程中连接服务器发现敲命令的时候总是一卡一卡的,不能忍受,开始以为是服务器到家里网......
  • MAC之Git的SSH配置
    一,查询是否有.ssh目录cd~/.ssh(进入.ssh目录)无法进入,则表明没有生成SSH二,生成SSH1,设置用户名和邮箱$gitconfig--globaluser.name"YourName"$gitconfig--glo......
  • 使用 SSH 连接 Git 服务器
    关于SSHSSH(SecureShell)是一种安全的远程登录协议,可以让你通过安全的加密连接进行远程登录。目前,Mac、Windows10、Linux系统均有内置OpenSSH客户端。如果你想通......
  • 树莓派SSH连接问题
    1.使用默认账号和密码连不上提示Permissiondenied错误。修改默认用户名密码sudorename-user用新的用户名密码登录 2.在使用SSH远程连接时会出现乱码 sudovi/......
  • HCL虚拟环境搭建并且支持ssh远程访问
    1.连接设备新建设备和host主机,连线,host主机选择本地网卡(不选host-only网卡)2.启动设备,打开终端,按ctrl+c3.执行命令<H3C>system-view[H3C]intg0/0[H3C-GigabitEthe......
  • Ubuntu——基于cpolar配置内网穿透,外网随时随地实现SSH访问主机!
    发现了一个超好的免费内网穿透工具!!可以实现外网SSH访问主机,极大地提升工作效率,并解除工作空间的限制!1.安装cpolarUbuntu用户安装Cpolar内网穿透安装完成后,需要进行认......
  • 附带ssh的alpine镜像
    附带ssh的alpine镜像#指定创建的基础镜像FROMalpine:3#作者描述信息MAINTAINERalpine_sshd_service#替换阿里源,安装openssh,并修改配置文件和生成key,并且同步时......
  • 华为路由器配置telnet与ssh远程登录
     2022.12.8--1.12分享华为路由器配置telnet与ssh远程登录1、interfaceGigabitEthernet0/0/0ipaddress192.168.1.1255.255.255.02、stelnetserverenable3......
  • 什么叫SSH?原理详解。
    SSH(SecureShell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的......
  • jenkins(三) jenkins 通过ssh 发布到远程的服务器
    1.windows发布远程通过ssh发布,但是windows又不支持ssh,所以需要下载第三方插件  地址:http://www.freesshd.com/?ctt=downloada,下载这两个exe,第一个用来将该服......