1. 什么是 SSH?
SSH(Secure Shell)是一种用于远程计算机之间安全通信的网络协议。
它允许一台计算机通过网络连接另一台计算机,并在连接过程中保证:
- 通信内容不会被轻易窃听;
- 连接双方可以确认身份;
- 数据传输过程保持完整。
简单理解:
SSH 是程序员连接远程计算机的一种安全方式。
例如:
- 电脑连接 Linux 服务器;
- 本地连接远程开发环境;
- Git 连接远程代码仓库。
SSH 本身不是 Git,也不是服务器,它是一种负责"安全连接"的协议。
2. 为什么程序员需要 SSH?
程序员经常需要操作不在自己电脑上的资源。
例如:
本地:
个人电脑
开发环境
代码文件
远程:
代码仓库
测试服务器
云服务器
生产环境
如果没有 SSH,就需要通过其他方式访问这些资源。
SSH 提供了一套标准方式,让程序员可以:
- 登录远程机器;
- 上传和下载代码;
- 执行远程命令;
- 管理开发环境。
因此:
SSH 是程序员连接远程资源的基础工具。
3. SSH 连接时最重要的问题:你是谁?
当你的电脑连接服务器时,服务器需要判断:
这个连接者是谁?是否允许访问?
这就是身份认证(Authentication)。
SSH 支持多种认证方式,其中程序员最常用的是:
密码认证
通过:
用户名 + 密码
证明身份。
例如:
markdown
用户名:username
密码:******
密钥认证
通过:
私钥 + 公钥
证明身份。
现代开发环境中更常使用密钥认证。
4. 什么是 SSH 密钥?
SSH 密钥是一组用于身份认证的密码学凭证。
它由两个部分组成:
vbnet
私钥(Private Key)
+
公钥(Public Key)
两者是一对。
4.1 私钥
私钥保存在自己的电脑中。
作用:
证明:
我拥有这个身份。
特点:
- 只能自己保存;
- 不能公开;
- 不能上传到服务器。
例如:
你的电脑
私钥
↓
生成身份验证信息
私钥类似现实中的:
身份证原件。
4.2 公钥
公钥提供给远程服务保存。
作用:
用于验证:
你提供的身份信息是否真实。
例如:
服务器
保存你的公钥
↓
验证你的连接
公钥类似:
身份证验证信息。
5. SSH 文件结构
SSH 在电脑中有一个专用目录:
bash
~/.ssh
它保存 SSH 相关文件。
典型结构:
arduino
.ssh
├── id_ed25519
├── id_ed25519.pub
├── config
├── known_hosts
└── agent
6. 每个文件分别负责什么?
id_ed25519
作用:
保存私钥。
负责:
证明"我是这个身份"。
特点:
- 不公开;
- 不上传;
- 不复制给别人。
id_ed25519.pub
作用:
保存公钥。
负责:
让服务器验证你的身份。
通常上传到:
- GitHub;
- GitLab;
- Gitea;
- 服务器。
config
作用:
保存连接规则。
解决的问题:
如果我有很多服务器,SSH 应该如何连接?
例如不同目标可能有:
- 不同地址;
- 不同端口;
- 不同用户名;
- 不同密钥。
config 就像 SSH 的"通讯录"。
known_hosts
作用:
保存服务器身份记录。
解决的问题:
我连接的服务器是不是之前那个服务器?
它记录:
- 服务器地址;
- 服务器指纹。
用于防止连接到伪造服务器。
ssh-agent
作用:
管理已经加载的私钥。
解决的问题:
每次使用 SSH 都需要重新输入私钥密码吗?
ssh-agent 可以暂时保存解锁后的私钥。
7. SSH 的完整工作过程
当你连接一个 SSH 服务时:
markdown
1. 找到目标服务器
↓
2. 建立加密连接
↓
3. 服务器要求身份验证
↓
4. 客户端使用私钥证明身份
↓
5. 服务器使用保存的公钥验证
↓
6. 验证通过
↓
7. 获得访问权限
8. 用一句话总结 SSH
如果把计算机世界比作现实世界:
- SSH = 安全通道;
- 私钥 = 身份证原件;
- 公钥 = 身份验证信息;
- config = 地址簿;
- known_hosts = 认识的服务器名单;
- ssh-agent = 帮你管理钥匙的助手。
9. 从零开始配置 SSH:创建自己的远程身份
前面的内容解释了 SSH 中各个角色之间的关系。
接下来,我们通过一次完整配置流程,把这些概念真正应用到电脑中:
- 创建自己的身份(密钥);
- 告诉服务器自己的身份(上传公钥);
- 配置连接规则;
- 完成第一次 SSH 连接。
完整流程:
markdown
创建密钥
↓
保存私钥
↓
上传公钥
↓
配置连接
↓
测试认证
9.1 检查电脑是否已有 SSH 配置
SSH 默认将相关文件保存在:
bash
~/.ssh
其中:
~
表示当前用户的主目录。
例如:
macOS:
bash
/Users/username
Linux:
arduino
/home/username
查看:
bash
ls -la ~/.ssh
如果显示:
yaml
No such file or directory
说明:
当前用户还没有 SSH 配置目录。
创建:
bash
mkdir -p ~/.ssh
设置权限:
bash
chmod 700 ~/.ssh
如果已经存在:
例如:
arduino
.ssh
├── id_ed25519
├── id_ed25519.pub
├── config
└── known_hosts
说明:
电脑之前已经使用过 SSH。
此时不要直接覆盖,需要确认:
- 哪些密钥正在使用;
- 哪些服务绑定了这些密钥。
9.2 创建 SSH 密钥
生成新的 SSH 密钥:
bash
ssh-keygen -t ed25519 -C "your_email@example.com"
这一步创建:
vbnet
私钥(Private Key)
+
公钥(Public Key)
-t
指定密钥类型:
bash
-t ed25519
表示:
生成 Ed25519 类型密钥。
为什么使用 Ed25519?
SSH 支持多种算法:
RSA
ECDSA
Ed25519
Ed25519 目前广泛使用。
特点:
- 安全性高;
- 密钥长度短;
- 计算效率高;
- 配置简单。
因此:
GitHub、GitLab、Gitea 等平台通常推荐使用 Ed25519。
-C
添加备注信息:
bash
-C "your_email@example.com"
备注不会参与认证。
它只是帮助识别密钥。
例如:
css
ssh-ed25519 AAAAC3xxxx your_email@example.com
最后:
css
your_email@example.com
只是说明标签。
执行后:
系统询问:
vbnet
Enter file in which to save the key:
默认:
javascript
~/.ssh/id_ed25519
直接回车。
生成:
bash
~/.ssh
├── id_ed25519
└── id_ed25519.pub
9.3 理解新生成的两个文件
私钥
文件:
javascript
~/.ssh/id_ed25519
作用:
客户端证明:
我拥有这个身份。
类似:
身份证原件。
不能:
- 上传 Git 平台;
- 发给别人;
- 提交代码仓库。
公钥
文件:
javascript
~/.ssh/id_ed25519.pub
作用:
让服务器验证身份。
类似:
身份证验证信息。
查看:
bash
cat ~/.ssh/id_ed25519.pub
复制输出内容。
9.4 将公钥添加到 Git 服务
SSH 密钥认证关系:
rust
你的电脑 Git服务器
私钥
id_ed25519
公钥
id_ed25519.pub
服务器不会保存你的私钥。
只保存:
公钥
添加方式:
sql
账号设置
↓
SSH Keys
↓
Add SSH Key
↓
粘贴公钥
↓
保存
保存后:
服务器建立:
公钥
↓
对应 Git 用户
的关系。
9.5 配置 SSH 连接规则
前面介绍过:
ini
config = SSH 通讯录
它解决:
SSH 如何知道连接某个服务器时应该使用什么参数?
创建:
bash
touch ~/.ssh/config
编辑:
bash
vim ~/.ssh/config
添加:
text
Host git.example.com
HostName git.example.com
User git
Port 22222
IdentityFile ~/.ssh/id_ed25519
为什么 User 是 git?
这是很多新手第一次配置 SSH 时最容易疑惑的问题。
很多人会认为:
这里应该填写我的 GitHub/Gitea 用户名。
实际上不是。
SSH 本身连接的是一台远程计算机,而不是直接连接 Git 账号。
例如:
普通服务器:
bash
ssh username@server.com
表示:
使用服务器中的:
username
这个系统用户登录。
但是 Git 服务(GitHub、GitLab、Gitea)通常采用特殊设计:
所有 Git 用户通过一个统一的 SSH 用户进入:
git
例如:
bash
ssh git@git.example.com
表示:
连接 Git 服务器,并使用服务器上的:
git 用户
作为 SSH 登录入口。
为什么这样设计?
因为一个 Git 服务可能有大量用户。
如果每个用户都对应服务器系统账号:
erlang
user_a
user_b
user_c
...
服务器管理会非常复杂。
因此:
所有人
↓
git 用户入口
↓
SSH 密钥认证
↓
识别真实 Git 账号
所以:
sql
User git
表示:
使用 Git 服务提供的 SSH 入口用户。
它不是:
- 你的电脑用户名;
- 你的 Git 平台账号;
- 你的邮箱。
真正识别你的身份的是:
SSH 公钥
配置含义:
javascript
连接 git.example.com
↓
服务器:
git.example.com
SSH用户:
git
端口:
22222
身份密钥:
~/.ssh/id_ed25519
保存。
修改权限:
bash
chmod 600 ~/.ssh/config
9.6 第一次测试 SSH 连接
执行:
bash
ssh -T git@git.example.com
如果服务器使用非默认端口:
bash
ssh -T -p 22222 git@git.example.com
参数:
-T
表示:
不进入远程 Shell。
这里只验证:
SSH 身份认证是否成功。
-p
指定端口。
SSH 默认:
22
企业 Git 服务可能修改:
22222
成功:
rust
Hi username! You've successfully authenticated.
表示:
本机私钥
↓
SSH身份认证
↓
服务器公钥验证
↓
身份确认成功
9.7 配置完成后的 SSH 文件结构
最终:
bash
~/.ssh
├── id_ed25519 # 私钥,证明自己的身份
├── id_ed25519.pub # 公钥,提供服务器验证
├── config # SSH连接规则
├── known_hosts # 已验证服务器记录
└── agent # 密钥代理相关
对应关系:
| 文件 | 作用 |
|---|---|
| id_ed25519 | 保存自己的身份凭证 |
| id_ed25519.pub | 提供服务器验证身份 |
| config | 管理 SSH 连接规则 |
| known_hosts | 保存服务器身份记录 |
| ssh-agent | 管理已加载密钥 |