SSH(Secure Shell) --- 安全外壳协议
一 、起源背景
SSH(Secure Shell)起源于 1995 年,由芬兰计算机科学家 Tatu Ylönen 开发。其主要目的是为了解决当时远程登录和数据传输中存在的安全问题。
不安全的远程协议:
- 在 SSH 出现之前,许多远程登录协议,如 Telnet 和 rlogin,使用明文传输数据,包括用户的登录凭据。这使得数据容易被窃听和攻击。
- 不安全的网络环境中,攻击者可以轻易捕获这些明文数据,导致信息泄露和系统入侵。
对安全性的需求:
- 随着互联网的迅速发展,远程访问变得越来越普遍,同时对数据安全和隐私的需求也日益增加。
- Tatu Ylönen 认识到需要一种新的协议来保护远程连接的安全性,避免数据在传输过程中被攻击。
SSH 的发展
SSH-1 版本:
- 1995 年,Tatu Ylönen 发布了 SSH 的第一个版本(SSH-1),实现了加密、身份验证和数据完整性保护。
- SSH-1 通过对传输的数据进行加密,有效地防止了窃听和中间人攻击。
SSH-2 版本:
- 1996 年,SSH-2 版本发布,改进了协议的安全性和功能,包括更强的加密算法和多种身份验证方式。
- SSH-2 成为了广泛接受的标准,支持更多的功能,如端口转发和文件传输(通过 SFTP 和 SCP)。
现代 SSH
SSH 协议的开源实现和广泛应用使其成为当前远程管理和安全通信的标准。许多现代操作系统(如 Linux 和 macOS)都内置了 SSH 客户端和服务器功能,进一步推动了其普及。
二、SSH是什么
SSH(Secure Shell)是一种安全的网络协议,用于通过不安全的网络远程访问和管理计算机。它为数据传输提供了加密,确保通信的安全性和完整性。
主要特点
安全性:
- SSH 使用加密技术,确保在网络上发送的数据不会被窃听或篡改。
- 支持多种加密算法,如 AES、3DES 和 Blowfish。
身份验证:
- SSH 提供多种身份验证方式,包括密码验证和公钥验证。
- 公钥验证更为安全,用户可以生成一对密钥(公钥和私钥),私钥保留在本地,公钥放在远程服务器上。
远程管理:
- SSH 允许用户通过命令行界面(CLI)远程控制服务器和其他设备。
- 通过 SSH,用户可以执行命令、传输文件、监控系统状态等。
端口转发:
- SSH 支持端口转发(tunneling),允许用户通过安全通道访问远程服务,增强网络安全。
多种功能:
- 除了远程终端访问,SSH 还支持 SFTP(Secure File Transfer Protocol)和 SCP(Secure Copy Protocol),用于安全地传输文件。
三、工作原理
连接建立:客户端向 SSH 服务器发送连接请求,服务器返回其公钥。客户端验证服务器的身份,并生成会话密钥,使用服务器的公钥加密后发送给服务器。
身份验证:服务器接收到加密的会话密钥后,使用私钥解密并验证客户端的身份。
加密通信:一旦建立安全通道,所有传输的数据都将通过该通道加密。
可以把 SSH 的连接过程比喻成一个“密友通信”的故事:
1.连接建立
客户端(比如你)决定要联系 服务器(你的朋友)并请求建立一个加密的通话通道。这时候,朋友会先把他的“密钥”(类似他特殊的加密箱的密码)交给你,但他不会告诉你具体的密码是什么,只会告诉你一个“锁”——这个锁只有他自己有“钥匙”能打开。
于是你拿着朋友给你的锁,把自己的“会话密钥”(一把你们接下来用于聊天的特别钥匙)放到一个盒子里,并用朋友的锁把盒子锁好,确保别人无法打开这个盒子,然后把它寄给朋友。
2. 身份验证
你的朋友收到这个锁住的盒子后,只有他能用自己私有的“钥匙”打开盒子,取出你的会话密钥。这个时候他知道,是你寄的东西,而且他有你的密钥,这证明你们彼此的身份。
3. 加密通信
现在,你们都拥有了这个会话密钥(特殊钥匙),可以开始用它在通话中加密每一句话。每当你们聊完一句话,就用这个密钥锁起来再传给对方,而只有拥有相同密钥的对方能解锁、看到消息内容。
这样,即使有人“偷听”你们的对话,由于没有密钥,偷听的人也无法解锁这些加密的信息——你们的对话始终是安全的。
使用场景
- 远程服务器管理:系统管理员可以远程访问和管理服务器,进行系统维护和配置。
- 开发和调试:开发者可以在远程开发环境中编写和测试代码。
- 文件传输:使用 SFTP 或 SCP 安全地传输文件。
实际运用场景举例
在 GitHub 中,使用 SSH 来进行通信时,主要是通过 SSH 密钥来建立安全的连接。这样可以避免每次操作时都输入用户名和密码。下面是如何在 GitHub 中实现 SSH 通信的步骤:
1. 生成 SSH 密钥对
首先,你需要生成一对 SSH 密钥(公钥和私钥),这对密钥将用于加密通信。
在 Linux 或 macOS 中生成密钥:
打开终端。
输入以下命令生成 SSH 密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
其中
-t rsa
表示使用 RSA 算法,-b 4096
表示生成一个 4096 位的密钥,-C
后面是你的邮箱,用于标识这个密钥。按照提示,选择密钥存储位置和设置密码(可以为空)。
默认情况下,密钥将存储在
~/.ssh/id_rsa
(私钥)和~/.ssh/id_rsa.pub
(公钥)中。
在 Windows 上生成密钥:
- 安装 Git for Windows,并在安装时选择 Git Bash。
- 打开 Git Bash。
- 输入以下命令:
同样按提示设置文件位置和密码。ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2. 将公钥添加到 GitHub
生成的 SSH 密钥对中,公钥(id_rsa.pub
)需要添加到 GitHub 上,以便 GitHub 识别你的机器。
- 打开
~/.ssh/id_rsa.pub
文件(或者使用以下命令输出公钥内容):cat ~/.ssh/id_rsa.pub
- 复制公钥的内容(从
ssh-rsa
开始,直到你的邮箱地址)。- 登录到 GitHub。
- 进入 Settings(设置)> SSH and GPG keys。
- 点击 New SSH key,粘贴你复制的公钥,给它一个名字(例如:
My Laptop SSH Key
),然后点击 Add SSH key。
3. 配置 Git 使用 SSH
接下来,你需要配置 Git 使用 SSH 来与 GitHub 通信。
- 打开终端或 Git Bash。
- 配置 Git 使用你的邮箱地址:
git config --global user.name "Your Name" git config --global user.email "your_email@example.com"
- 验证 SSH 配置是否正确,使用以下命令测试与 GitHub 的连接:
如果是第一次连接,系统会提示你确认 GitHub 的 SSH 密钥(输入ssh -T git@github.com
yes
)。如果一切正常,你会看到类似如下的输出:Hi username! You've successfully authenticated, but GitHub does not provide shell access.
4. 克隆或推送代码
现在,你可以使用 SSH 克隆 GitHub 上的仓库,而不需要每次输入用户名和密码。
- 克隆仓库时,使用 SSH URL:
git clone git@github.com:username/repository.git
- 推送代码时,Git 会使用你已经配置的 SSH 密钥进行身份验证,不需要手动输入密码。
5. 常见问题和解决方法
- "Permission denied (publickey)" 错误:这通常是因为公钥没有正确添加到 GitHub,或者 Git 没有使用正确的 SSH 密钥。可以通过
测试连接是否成功。ssh -T git@github.com
- 没有使用正确的密钥:如果你有多个密钥,可以通过指定 SSH 配置文件来告诉 Git 使用哪个密钥。在
~/.ssh/config
文件中添加如下内容:这样 Git 会自动使用指定的密钥。Host github.com User git Hostname github.com IdentityFile ~/.ssh/id_rsa
通过这些步骤,你就可以在 GitHub 上通过 SSH 安全地进行代码操作,如拉取、推送代码等,避免频繁输入密码,提升操作效率和安全性。
借用我之前提供的 密友通信 的例子,我们可以通俗地讲解一下 GitHub 中 SSH 通信 是如何实现的。
假设你是一个软件开发者,你需要和 GitHub 上的项目进行合作。这里的“GitHub”就像你的朋友,而你的“电脑”就是你自己。你希望能安全地与 GitHub 进行交流,避免每次操作都输入密码。这个时候,SSH 就是你和 GitHub 之间的一条“密友通道”。
PS.公钥相当于一个装有写有你名字的锁(这个锁是打开的)的信箱 私钥相当于可以解开这个锁的钥匙。第一次握手 朋友用你的这个 信箱和锁 锁住一个新的锁和钥匙,同时他自己也有这把新锁的钥匙。 第二次握手 朋友把这个装有新锁和钥匙的信箱用你的锁 锁住给你。第三次握手 你用自己的钥匙打开这把锁,并在箱子里面放入要传输的信息,并保存好朋友给的新锁的钥匙。至此以后就可以用这把新锁进行传输信息。
1. 建立连接 - 生成公钥和私钥
你决定和 GitHub 建立一条安全的通道,就像你要和朋友通信时,你们会用一种特定的密码锁来确保通信安全。为了建立这种锁,你需要生成一对“钥匙”:
- 私钥:这把钥匙只你自己能拥有,就像你自己用来打开盒子的钥匙。
- 公钥:这把钥匙是公开的,别人可以拥有,但无法解锁你的盒子。GitHub 需要这把钥匙来知道你是谁。
在终端(或者 Git Bash)里,你用一个命令生成这两把钥匙(公钥和私钥)。你可以把这个过程想象成自己准备了一个加密的信箱,其中存放了一个“公开的锁”(公钥)和一个私密的“钥匙”(私钥)。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 生成了一个 私钥(
id_rsa
)和 公钥(id_rsa.pub
)。- 私钥 你保管好,不轻易透露,只有你能使用。
- 公钥 是用来给 GitHub 使用的,任何人都能看到,但它没有办法解开你的加密信息。
2. 验证身份 - 将公钥交给 GitHub
现在你有了公钥(
id_rsa.pub
),你需要把它交给 GitHub,让 GitHub 知道这把公钥是属于你的。这样,GitHub 就知道了,只有拥有私钥的人才能和它通信。把公钥添加到 GitHub 的过程,像是你把自己的加密信箱的“锁”交给了 GitHub,GitHub 会保管好这把“锁”,并在以后的通信中用它来验证你。
- 登录 GitHub,进入 Settings > SSH and GPG keys。
- 在这里点击 New SSH key,然后把你生成的公钥(
id_rsa.pub
)复制并粘贴进去。3. 建立加密通道 - 使用 SSH 克隆仓库
假设你要把 GitHub 上的一个项目克隆到本地,或者你要将本地的修改推送到 GitHub。你通过 SSH 向 GitHub 发送请求,GitHub 会用它的“公钥”来检查你的身份。
在进行这个操作时,GitHub 就像你的朋友,它会使用你之前交给它的“公钥”来确认你是否是合法的通信方。然后,它会生成一个专门的“会话密钥”——一个临时的加密钥匙,它们俩(你和 GitHub)可以用它来加密和解密通信内容,确保别人无法窃听。
git clone git@github.com:username/repository.git
这条命令就像是你通过这条密友通道向 GitHub 请求复制项目。GitHub 检查你的身份(通过公钥),确认无误后,就允许你操作项目文件。
4. 加密通信 - 安全传输代码
一旦你和 GitHub 建立了这条“加密通道”,你们之后的所有通信都会通过这个加密的信道来进行。无论你是 推送 本地的修改,还是 拉取 GitHub 上的最新代码,都不需要再输入密码了。
所有的操作都用你和 GitHub 共用的“会话密钥”进行加密——这个密钥在会话结束时会销毁,所以即便有人想偷听你们的通信内容,也无法解密。
例如,当你提交代码时,Git 就会用你和 GitHub 共同的“会话密钥”加密你的代码,确保只有 GitHub 能解密并接收到这些内容:
git push origin main
5. 总结
通过以上步骤,你和 GitHub 成立了一个安全的通信通道,不用每次操作时都输入用户名和密码。你通过 SSH 生成的公钥和私钥作为“锁”和“钥匙”,确保了通信的安全性。每次连接时,GitHub 会使用你的公钥来验证身份,一旦通过验证,就开始加密通信,保证信息的安全传输。
四、如何使用 SSH
安装 SSH 客户端:
在大多数 Linux 和 macOS 系统中,SSH 客户端默认安装。Windows 用户可以使用 PuTTY 或 Windows 10/11 的内置 SSH 客户端。连接到远程服务器:
使用命令:ssh username@hostname
,其中username
是远程服务器的用户名,hostname
是服务器的 IP 地址或主机名。身份验证:
输入密码(如果使用密码验证),或使用公钥验证进行身份验证。执行命令:
连接成功后,可以在远程服务器上执行命令。