查看源代码 SSH 协议简介
SSH 是一种用于在不安全网络上进行安全远程登录和其他安全网络服务的协议。
范围和目的
SSH 提供客户端和服务器之间的单个、全双工、面向字节的连接。该协议还提供隐私、完整性、服务器身份验证和中间人攻击保护。
ssh
应用程序是 Erlang 中 SSH 传输、连接和身份验证层协议的实现。它提供以下功能:
先决条件
假设读者熟悉 Erlang 编程语言、OTP 的概念,并且对公钥有基本的了解。
协议概述
从概念上讲,SSH 协议可以分为四个层:
---
title: SSH Protocol Architecture
---
block-beta
columns 2
l1["SSH Client/Server Applications"]:2
l2a["Connection Protocol"] l2b["Authentication Protocol"]
l3["Transport Protocol"]:2
l4["TCP/IP Stack"]:2
传输协议
SSH 传输协议是一种安全的、低级的传输协议。它提供强大的加密、加密主机身份验证和完整性保护。支持最少的消息身份验证码 (MAC) 和加密算法。有关详细信息,请参阅 ssh
中的 ssh
手册页。
身份验证协议
SSH 身份验证协议是一种通用的用户身份验证协议,在 SSH 传输层协议之上运行。ssh
应用程序支持以下用户身份验证方式:
- 使用公钥技术。支持 RSA 和 DSA,不支持 X509 证书。
- 使用键盘交互式身份验证。这适用于客户端不需要任何特殊软件支持的交互式身份验证方法。相反,所有身份验证数据都是从键盘输入的。
- 使用纯粹基于密码的身份验证方案。在这里,纯文本密码在通过网络发送之前被加密。
在 ssh:connect/3,4 和 ssh:daemon/2,3 中提供了几个用于身份验证处理的配置选项。
可以通过实现 ssh
中的以下行为来自定义公钥处理:
连接协议
SSH 连接协议在传输管道上提供应用程序支持服务,例如,通道多路复用、流控制、远程程序执行、信号传播和连接转发。用于处理 SSH 连接协议的函数可以在 ssh
中的模块 ssh_connection
中找到。
通道
所有终端会话、转发的连接等都是通道。多个通道复用到单个连接中。所有通道都受流控制。这意味着在收到指示窗口空间可用的消息之前,不会向通道对等方发送任何数据。初始窗口大小 指定了在不调整窗口的情况下可以发送到通道对等方的通道数据字节数。通常,SSH 客户端打开一个通道,发送数据(命令),接收数据(控制信息),然后关闭该通道。ssh_client_channel
行为处理 SSH 通道管理的通用部分。这使得编写自己的使用流控制的 SSH 客户端/服务器进程变得容易,从而可以更多地关注应用程序逻辑。
通道有以下三种类型:
- 子系统 - 可以作为 SSH 服务器的一部分运行的命名服务,例如 SFTP (ssh_sftpd),默认情况下内置于 SSH 守护程序(服务器)中,但可以禁用。Erlang
ssh
守护程序可以配置为运行任何 Erlang 实现的 SSH 子系统。 - Shell - 交互式 shell。默认情况下,Erlang 守护程序运行 Erlang shell。可以通过提供您自己的读取-评估-打印循环来自定义 shell。您还可以提供自己的命令行界面 (CLI) 实现,但这需要更多的工作。
- Exec - 一次性远程执行命令。有关更多信息,请参阅函数
ssh_connection:exec/4
。
在哪里可以找到更多信息
有关 SSH 协议的详细信息,请参阅以下请求评论 (RFC):