SSH基本原理

本文最后更新于 2025年4月17日 早上

SSH目前作为我经常使用的一项技术,在远程连接云服务器上和同步git代码两个方面发挥着必不可少的作用。也是好奇心泛滥,对SSH进行了一些探究。

SSH是什么

网上的解释是这样的:SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

我自己的理解是这样的:SSH是这么一种协议,它允许服务器和客户端进行安全、加密的通信,只要进行一些配置以达成互信,客户端就可以对服务器进行一些许可的操作。SSH连接尽管也包括密码连接,但是配置秘钥之后,就可以方便的实现免密连接了。

SSH的工作机制

SSH服务的服务机制

SSH的使用首先需要服务器端提供sshd服务,sshd服务的配置是通过读取 /etc/ssh 文件夹下的 sshd_config 配置文件来确定的。服务器在安装sshd服务的时候,就会生成多个秘钥对,这些秘钥对存储在 /etc/ssh 文件夹下,是一系列类似ssh_host_xxx_key和ssh_host_xxx_key.pub的文件对,xxx 有 dsa,ecdsa,ed25510,rsa 几种不同的加密方式。

SSH协议包括密码连接和秘钥连接两种方式,在不修改 sshd_config 的情况下,两种方式都是默认开启的。密码连接需要知道用户名、密码和主机地址就可完成连接。秘钥连接的方式需要一系列的配置方可完成连接。

秘钥连接的方式需要两个非对称秘钥对,一是上面说的服务器的秘钥对,二是客户端的秘钥对。客户端首次要求连接服务器时,服务器会对请求连接的客户端暴露公钥指纹,客户端一旦认可并保存后,会将服务器的这个公钥保存(windows是保存在.ssh文件夹下的known_hosts文件夹下,不同客户端保存位置不一样),至于这个公钥是用来仅仅用来判定服务器的还是连接时用来发送加密信息的,当前还不清楚;这一步过后,客户端完成对服务端的信任认证。客户端在使用秘钥连接之前,通常需要通过一些方法提前把客户端自己使用的秘钥对中的的公钥告诉给服务器并由服务器保存。在申请连接时,据说服务器会生成一个随机码并通过客户端提前给的客户端公钥加密后发送给客户端,客户端收到信息后再由自己的私钥解密,解密后再反馈给服务端验证,如果正确,服务端则开始信任客户端则,连接即可建立。

一些还没搞清楚的问题

我仍然有对该机制疑惑的部分,如果看到这里的你能解决我的疑惑或者愿意与我一起探讨,头像下方的联系方式都能找到我。

  • 双方每次建立连接时是否都需要完成一次双向的非对称加密认证?即客户端发起连接时,先找配置文件中的服务器公钥加密一个信息A发给服务器,服务器解密之后再将该解密信息通过客户端的公钥加密给客户端,客户端用自己的私钥解密后检测信息是否是A,从而判定该次连接是否合法。
  • SSH连接建立后的通信,所有内容都是加密传输的么?用的什么加密策略?非对称还是对称?

SSH服务的核心文件和文件内容

SSH的核心文件指的是SSH服务对提供什么方式的服务进行约定的,建立双方互信基础的文件。

服务端的核心文件

服务器端的核心文件包括配置服务的sshd_config文件和秘钥对文件这两个主机相关的文件,和作为被连接用户的鉴权文件。

主机相关的文件

主机相关的文件主要是提供ssh连接服务的相关配置和主机的标识文件。

位置

对于centOS服务器来说,位置位于 /etc/ssh文件夹下

配置文件:sshd_config

sshd_config是sshd服务的全局配置文件,目前我实践过的一些配置项如下。

配置项 说明
Port 数字,默认22 ssh服务的端口
HostKey 文件路径 作为服务端的秘钥私钥文件
AllowUsers 用户名组(空格分开) 允许登录的用户,还有更深入的解释,参见sshd_config(5)
PasswordAuthentication yes/no 是否允许密码登录
MaxAuthTries 数字 指定一次连接的最大尝试次数,没有尝试到了次数会如何
AuthorizedKeysFile 文件路径 认证秘钥文件,以哪个用户登录,就是相对哪个用户的家目录
ChallengeResponseAuthentication yes/no 这个不太理解,不过好像需要设置为no,后面有机会再了解
UsePAM yes/no 不是太懂,不过有参考文章 查看链接
标识文件:秘钥对文件

这些秘钥对文件是用来表示主机的,在客户端尝试连接主机时,主机会将秘钥对中的公钥和公钥指纹告知客户端,如果客户端信任该主机(也就是认为该主机就是自己要连接的主机),客户端就会保存并使用公钥加密信息,服务端再利用秘钥对中的私钥解密信息。

用户认证相关的文件

连接服务器,是要以用户名@主机的形式进行连接的,一个主机可以有多个用户,客户端想以某个身份获得连接到某个主机的权限,就需要在该用户的认证文件下留下客户端自己秘钥对中的公钥。

位置

该位置由主机sshd_config中的Auth…的值来设置,默认是在.ssh文件夹下,还有更多的说明可以查询man手册

认证文件:authorized_keys

这个文件名是默认的,里面是存的各授权客户端(秘钥对)的公钥,一行一个授权公钥。

要使用SSH以某个用户连接某个主机时,一定要现在这里将客户端所用秘钥对的公钥保存在这里,方式多种多样,服务端读取公钥复制后,利用vim粘贴是我现在通常的做法。

客户端的核心文件

客户端的核心文件包括秘钥对和配置文件,配置文件可以是一个或者多个,视客户端而定,无论是几个,配置文件至少需要包括连接配置,信任主机清单两项内容。

位置

不同客户端核心文件的保存位置不一样,作为windows用户,我现在主要使用windows自带工具(powershell,cmd)和mobaxterm来进行远程服务器连接。

windows默认

windows将ssh连接的多个核心文件默认是放在登录用户文件夹下的.ssh这个隐藏文件夹下,一般路径是C:\Users\<username>\.ssh

MobaXterm

MobaXterm是将除了认证文件外的其他配置都存放在程序的安装目录下的MobaXterm.ini这个文件里面。

秘钥对

以RSA256为例,一般秘钥对的文件是id_rsa_<name>id_rsa_<name>.pub这样的名称,其他加密方式应该也差不多,改改前缀。这个秘钥对的公钥,放到服务端的用户home目录下的.ssh文件夹下的authorized_keys文件中,才能让服务端信任客户端。

连接配置和信任主机清单

在windows默认配置中,连接配置文件是config,信任主机清单是known_hosts。在MobaXterm中,连接配置文件和信任主机清单都可通过GUI配置后保存在MobaXterm.ini文件里。

连接配置

配置项 说明
Host 主机,准确的说是主机别名,接在SSH命令后连接主机
HostName 主机名,可以是域名或者IP地址
User 用户名,要连接的主机上的某个可连接用户
PreferredAuthentications 首选认证方式,填写publickey,其他值不详,没找到资料
IdentityFile 含路径的私钥文件,家目录一般以 ~ 代替

信任主机清单

在windows中,每个信任主机占一行,有三个字段组成,分别是主机名称(如果是域名,后面会跟随IP地址),加密方式,主机公钥。这个信息在首次连接时自动生成。

参考文档

CSDN–ssh详解

Linux PAM 验证


SSH基本原理
https://www.xiebingyuan.cn/2020/04/9b1e8c16388b/
作者
bingyuan
发布于
2020年4月14日
更新于
2025年4月17日
许可协议