1、概念
图2 SSH主机密钥管理认证方案示意图
SSH的英文全称为Secur Network Working Group所 和其他安全网络服务。如需 Security Corporation的网 | e Shell,是IETF(Internet En 制定的一族协议,其目的是要在 要SSH的详细信息请参考www.ssh 站)和www.openssh.org(开放 | gineering Task Force)的 非安全网络上提供安全的远程登录 .com(SSH Communications 源码的OpenSSH组织的网站)。 |
2、基本框架 |
SSH协议框架中最主要 SSH协议框架中还为许多高 用如下图1来表示: | 的部分是三个协议:传输层协议 层的网络安全应用协议提供扩展 | 、用户认证协议和连接协议。同时 的支持。它们之间的层次关系可以 |
图1 SSH协议的层次结构示意图
在SSH的协议框架中, 数据机密性,信息完整性 则为服务器提供客户端的 隧道复用成若干个逻辑通道 立于SSH基本体系之外,并 | 传输层协议(The Transport La 等的支持;用户认证协议(The 身份鉴别;连接协议(The Conn ,提供给更高层的应用协议使用 依靠这个基本框架,通过连接协 | yer Protocol)提供服务器认证, User Authentication Protocol) ection Protocol) 将加密的信息 ;各种高层应用协议可以相对地独 议使用SSH的安全机制。 |
3、主机密钥机制 |
对于SSH这样以提供安全通讯为目标 由于SSH协议是面向互联网网络中主机之 机制。也就是说,SSH协议要求每一个使 ,服务方通过对客户方主机密钥的认证之 钥,针对不同的密钥算法而拥有不同的密 的密钥。关于DSS算法,请参考[FIPS-186 | 的协议,其中必不可少的就是一套完备的密钥机制。 间的互访与信息交换,所以主机密钥成为基本的密钥 用本协议的主机都必须至少有一个自己的主机密钥对 后,才能允许其连接请求。一个主机可以使用多个密 钥,但是至少有一种是必备的,即通过DSS算法产生 ]。 |
SSH协议关于主机密钥认证的管理方案有两种,如下图2所示: |
每一个主机都必须有自己的主机密钥 和私有密钥。在实际应用过程中怎样使用 示,SSH协议框架中提出了两种方案。 | ,密钥可以有多对,每一对主机密钥对包括公开密钥 这些密钥,并依赖它们来实现安全特性呢?如上图所 |
在第一种方案中,主机 用该主机的公开密钥来加密 认证,确定客户机的可靠身 主机B和主机C,此时,A成 候根据主机名来查找相应的 全地存储自己的私有密钥就 | 将自己的公用密钥分发给相关的 数据,主机则使用自己的私有密 份。在图2(a)中可以看到,用 为客户机,它必须事先配置主机 公开密钥。对于被访问主机(也 可以了。 | 客户机,客户机在访问主机时则使 钥来解密数据,从而实现主机密钥 户从主机A上发起操作,去访问, B和主机C的公开密钥,在访问的时 就是服务器端)来说则只要保证安 |
在第二种方案中,存在一个密钥认证 钥提交给认证中心,而任何作为客户机的 在这种模式下,客户机在访问服务器主机 能够正确地连接到目的主机上。 | 中心,所有系统中提供服务的主机都将自己的公开密 主机则只要保存一份认证中心的公开密钥就可以了。 之前,还必须向密钥认证中心请求认证,认证之后才 |
很显然,第一种方式比 变更都必须在客户机上有所 对认证中心的要求很高,在 大麻烦,有谁能够什么都能 采用中心认证的方案是必要 | 较容易实现,但是客户机关于密 体现;第二种方式比较完美地解 互联网络上要实现这样的集中认 说了算呢?但是从长远的发展来 的。 | 钥的维护却是个麻烦事,因为每次 决管理维护问题,然而这样的模式 证,单单是权威机构的确定就是个 看,在企业应用和商业应用领域, |
另外,SSH协议框架中 访问免认证是指,在某客户 个公开密钥的拷贝,这样在 。 | 还允许对主机密钥的一个折中处 机第一次访问主机时,主机不检 以后的访问中则必须使用该密钥 | 理,那就是首次访问免认证。首次 查主机密钥,而向该客户都发放一 ,否则会被认为非法而拒绝其访问 |
4、字符集和数据类型 |
SSH协议为了很好地支 处理。首先,SSH协议规定 些信息将被协议本身直接处 常情况下的统一字符集为IS 息本地化的应用,协议规定 大多数用来显示给用户的信 程序及其操作系统环境,因 来自由掌握。 | 持全世界范围的扩展应用,在字 ,其内部算法标识、协议名字等 理,而且不会用来作为用户的显 O 10646标准下的UTF-8格式,详 了必须使用一个专门的域来记录 息,使用什么样的字符集主要取 而对此SSH协议框架中没有作硬 | 符集和信息本地化方面作了灵活的 必须采用US-ASCII字符集,因为这 示信息。其次,SSH协议指定了通 细请参考RFC-2279。另外,对于信 语言标记(Language Tag)。对于 决于用户的终端系统,也就是终端 性规定,而由具体实现协议的程序 |
除了在字符、编码方面的灵活操作外 种方便实用的种类,包括字节类型、布尔 型、字符串类型、多精度整数类型以及名 | ,SSH协议框架中还对数据类型作了规定,提供了七 类型、无符号的32位整数类型、无符号的64位整数类 字表类型。下面分别解释说明之: |
(1)字节类型(byte) |
一个字节(byte)代表一个任意的8 据就用一个字节数组来表示,写成byte[n | 字位值(octet)[RFC-1700]。有时候固定长度的数 ]的形式,其中n是数组中的字节数量。 |
(2)布尔类型(boolean) |
一个布尔值(boolean 表示“真”(TRUE)。所有 尔值存储0和1意外的数值。 | )占用一个字节的存储空间。数 非零的数值必须被解释成“真” | 值0表示“假”(FALSE),数值1 ,但在实际应用程序中是不能给布 |
(3)无符号的32位整数类型(unit32) |
一个32字位的无符号整 位在前,低位在后)。例如 际存储时就是03 CD F3 B9 | 型数值,由按照降序存储的四个 ,有一个数值为63828921,它的 ,具体存储结构的地址分配如图 | 字节构成(降序即网络字节序,高 十六进制表示为0x03CDF3B9,在实 3。 |
图3 无符号32位整数类型的典型存储格式
(4)无符号的64位整数类型(unit64) |
一个64字位的无符号整型数值,由按 整数类似,可以比照图3。 | 照降序存储的八个字节构成,其具体存储结构与32位 |
(5)字符串类型(string) |
字符串类型就是任意长 符(null)和8位字符。字 是随后有多少个字节),un 不需要用空字符来表示结束 | 度的二进制序列。字符串中可以 符串的前四个字节是一个unit32 it32之后的零个或者多个字节的 。 | 包含任意的二进制数据,包括空字 数值,表示该字符串的长度(也就 数据就是字符串的值。字符串类型 |
字符串也被用来存储文 示的文本信息则使用ISO-10 (null)。 | 本数据。这种情况下,内部名字 646 UTF-8编码。一般情况字符 | 使用US-ASCII字符,可能对用户显 串中不应当存储表示结束的空字符 |
在图4中举例说明字符串“My ABC”的存储结构: |
图4 字符串类型的典型存储格式
从图4中可以很明显地看出,字符串 字节数),即使没有任何字符的字符串也 存储方式类似。 | 类型所占用的长度为4个字节加上实际的字符个数( 要占用四个字节。这种结构与Pascal语言中的字符串 |
(6)多精度整数类型(mpint) |
多精度的整数类型实际 分每个字节8位,高位在前 果恰巧一个正数的最高位是 ,额外的前导字节如果数值 一个长度为零的字符串(st 的。其存储格式通过图5的 | 上是一个字符串,其数据部分采 ,低位在后。如果是负数,其数 1时,它的数据部分必须加一个 为0或者255时就不能被包括在整 ring)。多精度整数在具体运算 若干示例来说明: | 用二进制补码格式的整数,数据部 据部分的第一字节最高位为1。如 字节0x00作为前导。需要注意的是 数数值内。数值0则必须被存储成 时还是要遵循正常的整数运算法则 |
图5 多精度整数类型的典型存储格式
(7)名字表类型(name-list) |
名字表(name-list)是一个由一系 储方式上与字符串一样,名字表前四个字 目,类似于字符串类型),其后跟随着由 个名字则必须具有非零长度,而且不能包 上下文关系可以对名字表中的名字产生额 的算法标识,或者都是语言标记等。名字 的上下文关系。与字符串类型一样,无论 符作为结束。如下图6: | 列以逗号分隔的名字组成的字符串(string)。在存 节是一个unit32型整数以表示其长度(随后的字节数 逗号分隔开的一系列名字,可以是0个或者多个。一 含逗号,因为逗号是名字之间的分隔符。在使用时, 外的限制,比如,一个名字表中的名字都必须是有效 表中名字是否与顺序相关,也要取决于该名字表所在 是单个的名字,还是整个名字表,都不需要使用空字 |
图6 名字表的典型存储格式
SSH协议框架中拥有对 | 这些数据类型的支持,将对协议 | 、算法的处理带来极大的便利。 |
5、命名规则及消息编码 |
SSH协议在使用到特定 法和其他协议时都利用名字 定。无论是SSH协议框架中 算法或者协议,都必须遵循 | 的哈希算法,加密算法,完整性 来区分,所以SSH协议框架中很 所必备的算法或者协议,还是今 一个统一的命名规则。 | 算法,压缩算法,以及密钥交换算 重要的一个部分就是命名规则的限 后具体应用实现SSH协议时增加的 |
SSH协议框架对命名规则有一个基本 、可打印US-ASCII字符串;名字必须是大 | 原则:所有算法标识符必须是不超过64个字符的非空 小写敏感的。 |
具体的算法命名有两种格式: |
(1)不包含@符号的名 sha-1”,“hmac-sha1”, ,这种格式的名字是不能使 | 字都是为IETF标准(RFC文档) “zlib”(注意:引号不是名字 用的。当然IETF的所有注册的名 | 保留的。比如,“3des-cbc”,“ 的一部分)。在没有事先注册之前 字中也不能包含@符号或者逗号。 |
(2)任何人都可以使用“name@doma mycipher-cbc@ssh.com”。在@符号之前 @符号和逗号之外的US-ASCII字符。在@符 (参考[RFC-1034]),个人域名和组织域 负责的。 | inname”的格式命名自定义的算法,比如“ 部分的具体格式没有限定,不过这部分中必须使用除 号之后的部分则必须是一个完全合法的Internet域名 名均可。至于局部名字空间的管理则是由各个域自行 |
SSH协议框架中另一个主要的标准化规则就是消息编码,基本规定在表1中详述: |