SSH(secure shell,安全外壳)协议由传输层协议、用户认证协议和连接协议组成,3个协议的关系如图1所示。SSH协议基于TCP(transmission control protocol,传输控制协议),处于TCP和高层应用之间。
图1 SSH协议的基本原理图
① 传输层协议。包括协商和数据处理两大功能,定义了算法协商、密钥计算方法以及数据封装处理等内容,流程如图2所示。客户端与服务器的22号端口建立连接,随后进行版本协商、算法协商并进行D-H交换以获取会话密钥。在双方通告使用新密钥后,就可以利用SSH协议建立的虚拟安全通道进行通信了。
图2 传输层协商和数据处理流程图
② 用户认证协议。用于服务器认证客户端身份。SSH协议支持4种用户身份认证方法,即publickey、password、hostbased和none,它们分别代表公钥认证、口令认证、基于主机的认证以及不使用认证。使用公钥认证方法的协议流程如图3所示。图中客户端将认证方法及公钥(或证书)通过SSH_MSG_USERAUTH_REQUEST消息发送给服务器;服务器若同意使用这种方法,则返回SSH_MSG_USERAUTH_PK_OK;客户端随后继续用SSH_MSG_USERAUTH_REQUEST消息向服务器发送证书及对应的签名,以便服务器进行身份认证;认证通过,则返回SSH_MSG_USERAUTH_SUCCESS。使用口令认证方法时,客户端向服务器发送口令。使用基于主机的认证方法时,使用客户端主机证书(公钥/私钥)进行身份认证,而不是用户的证书(公钥/私钥),这意味着由客户端主机代理用户完成身份认证过程。
图3 使用公钥认证的流程图
③ 连接协议。将传输层协议构建的虚拟安全通道(称为隧道)分解为多个逻辑通道,以便高层应用共享SSH协议提供的安全服务。
1995年,芬兰赫尔辛基大学网络遭受了口令嗅探攻击,这促使芬兰学者T.于勒(Tatu Ylonen)首次设计并实现了SSH,该版称为SSH1,于1995年7月公布。在公布后的短短一段时间内,它就风靡全球。1995年年底,有50个国家的2万多用户使用这款免费产品。在推出这个版本时,T.于勒还是芬兰赫尔辛基大学的研究人员,之后他创立了SSH 通信安全公司(SSH communications security,SCS),公司主页http://www.ssh.com,提供企业级的SSH安全方案和产品。随着知名的Sun微系统公司使用其产品,SSH协议在各大企业中的应用日趋广泛。SSH1以草案的形式提交给因特网工程任务组(Internet Engineering Task Force,IETF),而随着SSH1的广泛应用,其局限性和安全缺陷也在不断暴露。修正这些安全缺陷并不简单,于是T.于勒决定重写SSH协议,并于1996年提交SSH2。作为响应,IETF成立了SecSh(Secure Shell)工作组,该组于1997年2月提交了有关SSH2的第一份草案。
1998年,SCS发布SSH2产品SSH Secure Shell。虽然这是一个更安全的产品,但大多数用户仍然使用SSH1。原因有二:一是该版本去掉了SSH1所拥有的一些实用特性和配置选项;二是该版本是付费产品。为了摆脱上述困境,SCS放松了版权要求,允许非盈利目的的个人用户免费使用该商品,同时对Linux、NetBSD、FreeBSD以及OpenBSD等操作系统开放。与此同时,由OpenBSD项目推出的OpenSSH问世,这是一款全免费的软件包。由此,SSH2逐渐取代SSH1。2005年,SSH通信公司又推出了SSH G3,该版的体系结构与SSH2兼容,但引入了一些优化和扩展,主要用以提高SSH协议的通信效率。1998年以后,有关SSH2的安全缺陷陆续被发现。直到2006年1月,SSH2正式成为IETF标准,体现于RFC4250~4256这7个文档中,这个版本为SSH2.0。RFC4253指出,之前的所有版本应被标识为1.99,因此,截至2018年所说的SSH2是指SSH2.0。
随着密码技术的不断发展,SSH协议标准也在发展更新。截至2017年5月,最新的文档是RFC8160(2017年4月公布),给出了SSH协议的一个新操作码,指示终端输入输出使用UTF-8(万国码)字符编码方式。相比其他安全协议,SSH2的标准文档更新并不算多,但2014年8月,美国国家标准技术局公布了使用SSH协议的一个指南,由此可见SSH协议在业界的地位。