Secure Shell

安全外壳协议（Secure Shell Protocol，简称SSH）是一种加密的网络传输协议，可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。

SSH最常见的用途是远程登录系统，人们通常利用SSH来传输命令行界面和远程执行命令。虽然SSH最初在类Unix系统中普及，但随着微软在Windows 10内部版本1809和Windows Server 2019及后续版本中原生集成OpenSSH，Windows现已全面支持SSH的客户端与服务端功能。2015年，微软宣布将在未来的操作系统中提供原生SSH协议支持，Windows 10 1803版本已提供OpenSSH工具。

在设计上，SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rlogin、rsh、rexec等协议采用明文传输，使用不可靠的密码，容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境（例如互联网）中信息加密完整可靠。

不过，SSH也被指出有被嗅探甚至解密的漏洞。早在2011年，中国的互联网审查机构已经有能力针对SSH连线的刺探及干扰。而后爱德华·斯诺登泄露的文件也指出，美国国家安全局有时能够把SSH协议传输的信息解密出来，从而读出SSH会话的传输内容。2017年7月6日，非营利组织维基解密确认美国中央情报局已经开发出能够在Windows或Linux操作系统中窃取SSH会话的工具。

## 概述

SSH以非对称加密实现身份验证。身份验证有多种途径，例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接，随后使用密码认证进行登录；另一种方法是人工生成一对公钥和私钥，通过生成的密钥进行认证，这样就可以在不输入密码的情况下登录。任何人都可以自行生成密钥。公钥需要放在待访问的电脑之中，而对应的私钥需要由用户自行保管。认证过程基于生成出来的私钥，但整个认证过程中私钥本身不会传输到网络中。

SSH协议有两个主要版本，分别是SSH-1和SSH-2。无论是哪个版本，核实未知密钥来源都是重要的事情，因为SSH只验证提供用户是否拥有与公钥相匹配的私钥，只要接受公钥而且密钥匹配服务器就会授予许可。这样的话，一旦接受了恶意攻击者的公钥，那么系统也会把攻击者视为合法用户。

## 密钥管理

在类Unix系统中，已许可登录的公钥通常保存在用户/home目录的~/.ssh/authorized_keys文件中，该文件只由SSH使用。当远程机器持有公钥，而本地持有对应私钥时，登录过程不再需要手动输入密码。另外为了额外的安全性，私钥本身也能用密码保护。

私钥会保存在固定位置，也可以通过命令行参数指定（例如ssh命令的“-i”选项）。ssh-keygen是生成密钥的工具之一。

SSH也支持基于密码的身份验证，此时密钥是自动生成的。若客户端和服务端从未进行过身份验证，SSH未记录服务器端所使用的密钥，那么攻击者可以模仿服务器端请求并获取密码，即中间人攻击。但是密码认证可以禁用，而且SSH客户端在发现新密钥或未知服务器时会向用户发出警告。

## 应用

SSH的经典用途是登入到远程电脑中执行命令。除此之外，SSH也支持隧道协议、端口映射和X11连接。借助SFTP或SCP协议，SSH还可以传输文件。

SSH使用客户端-服务器模型，标准端口为22。服务器端需要开启SSH守护进程以便接受远端的连接，而用户需要使用SSH客户端与其建立连接。

大多数现代操作系统（包括macOS、大部分Linux、OpenBSD、FreeBSD、Solaris等系统）都提供了SSH，包括Windows系统也提供SSH程序（在Windows 10 1809版本之后）。在软件层次，许多关于SSH的专有软件、免费软件和开源软件被研发出来，如：

- 文件管理软件（同步、复制、删除等）。如：PuTTY和Windows下的WinSCP、类Unix系统下的Konqueror等。
- SSH客户端。

从云计算的角度上讲，SSH能够阻止一些因直接暴露在互联网而产生的安全问题，在解决连接问题上发挥了重要作用。SSH隧道可以在互联网、防火墙和虚拟机之间提供一个安全的通道。

## 历史

### 1.x版本

芬兰赫尔辛基理工大学的塔图·于勒宁发现自己学校存在嗅探密码的网络攻击，便于1995年编写了一套保护信息传输的程序，并称其为“secure shell”，简称SSH，设计目标是取代先前的rlogin、Telnet、FTP和rsh等安全性不足的协议。1995年7月，于勒宁以免费软件的形式将其发布。程序很快流行起来，截至1995年底，SSH的用户数已经达到两万，遍布五十个国家。

1995年12月，于勒宁创立了SSH通信安全公司来继续开发和销售SSH。SSH的早期版本用到了很多自由软件，例如GNU libgmp，但后来由SSH公司发布的版本逐渐变成了专有软件。

截至2000年，已经有两百万用户使用SSH。

### OpenSSH和OSSH

1999年，开发者们希望使用自由版本的SSH，于是重新使用较旧的1.2.12版本，这也是最后一个采用开放源代码许可的版本。随后瑞典程序员Björn Grönvall基于这个版本开发了OSSH。不久之后，OpenBSD的开发者又在Grönvall版本的基础上进行了大量修改，形成了OpenSSH，并于OpenBSD 2.6一起发行。从该版本开始，OpenSSH又逐渐移植到了其他操作系统上面。

截至2005年，OpenSSH是唯一一种最流行的SSH实现，而且成为了大量操作系统的默认组件，而OSSH已经过时。OpenSSH仍在维护，而且已经支持SSH-2协议。从7.6版开始，OpenSSH不再支持SSH-1协议。

### 2.x版本

2006年，SSH-2协议成为了新的标准。与SSH-1相比，SSH-2进行了一系列功能改进并增强了安全性，例如基于迪菲-赫尔曼密钥交换的加密和基于讯息鉴别码的完整性检查。SSH-2还支持通过单个SSH连接任意数量的shell会话。SSH-2协议与SSH-1不兼容，由于更加流行，一些实现（例如lsh和Dropbear）只支持SSH-2协议。

### 1.99版

RFC 4253规定支持2.0及以前版本SSH的SSH服务器应将其原始版本标为“1.99”。“1.99”并不是实际的软件版本号，而是为了表示向下兼容。

### 名词释义

- SSH：泛指SSH协定或实现SSH之软件。
- SSH-1：SSH协定版本第1版，以资与SSH-2区分。其中1.3与1.5版最常使用，提及时采SSH-1.3与SSH-1.5。
- SSH-2：SSH协定版本第2版，以资与SSH-2区分，为现行最新版本。
- SSH1：专指塔图·于勒宁所开发“secure shell”第1版，实作SSH-1协定。
- SSH2：专指塔图·于勒宁所开发“secure shell”第2版，实作SSH-2协定，现属于SSH Communications Security该公司所有。
- OpenSSH(OpenBSD Secure Shell)：专指基于secure shell 1.2.12版分支所开发之软件，现行版本已停止支援SSH-1协定。
- OpenSSH /1：OpenSSH于执行SSH-1协定行为代称。
- OpenSSH /2：OpenSSH于执行SSH-2协定行为代称。

## 基本架构

SSH协议框架中最主要的部分是三个协议：

- 传输层协议（The Transport Layer Protocol）：传输层协议提供服务器认证，数据机密性，信息完整性等的支持。
- 用户认证协议（The User Authentication Protocol）：用户认证协议为服务器提供客户端的身份鉴别。
- 连接协议（The Connection Protocol）：连接协议将加密的信息隧道复用成若干个逻辑通道，提供给更高层的应用协议使用。

同时还有为许多高层的网络安全应用协议提供扩展的支持。

各种高层应用协议可以相对地独立于SSH基本体系之外，并依靠这个基本框架，通过连接协议使用SSH的安全机制。

## SSH的安全验证

在客户端来看，SSH提供两种级别的安全验证。

- 第一种级别（基于密码的安全验证），知道帐号和密码，就可以登录到远程主机，并且所有传输的数据都会被SSH传输层协议加密。但是，可能会有别的服务器在冒充真正的服务器，但只要客户端校验主机公钥，在服务器私钥不泄露的前提下就能避免被“中间人”攻击。
- 第二种级别（基于密钥的安全验证），需要依靠密钥，也就是你必须为自己创建一对密钥，并把公钥放在需要访问的服务器上。客户端软件会向服务器发出请求，请求用你的私钥进行安全验证并发送使用私钥对会话ID等信息的签名。服务器收到请求之后，先在你在该服务器的用户根目录下寻找你的公钥，然后把它和你发送过来的公钥进行比较，并用公钥检验签名是否正确。如果两个密钥一致，且签名正确，服务器就认为用户登录成功。

在服务器端来看，SSH也提供安全验证。

- 服务器将自己的公钥分发给相关的客户端，并将密钥交换过程中的公开信息与协商密钥的哈希值的签名发送给客户端，客户端将获取的服务器公钥计算指纹并与其他安全信道获得的公钥指纹相比对并验证主机签名。
- 存在一个密钥认证中心，所有提供服务的主机都将自己的公钥提交给认证中心，公钥认证中心给服务端颁发证书，而任何作为客户端的主机则只要保存一份认证中心的公钥就可以了。在这种模式下，服务器会发送认证中心提供给主机的证书与主机对密钥交换过程中公开信息的签名。客户端只需要验证证书的有效性并验证签名。

## SSH协议的可扩展性

SSH协议框架中设计了大量可扩展项，比如用户自定义算法、客户自定义密钥规则、高层扩展功能性应用协议。这些扩展大多遵循IANA的有关规定，特别是在重要的部分，像命名规则和消息编码方面。

## 外部链接

- SSH Communications Security Corporation的网站
- OpenSSH组织的网站
- IANA的标准及组织
- RFC4251:The Secure Shell (SSH) Protocol Architecture