新手程序员 SSH 第一课:从 Git 仓库连接失败理解 SSH 协议与密钥配置

1. 什么是 SSH?

SSH(Secure Shell)是一种用于远程计算机之间安全通信的网络协议

它允许一台计算机通过网络连接另一台计算机,并在连接过程中保证:

  1. 通信内容不会被轻易窃听;
  2. 连接双方可以确认身份;
  3. 数据传输过程保持完整。

简单理解:

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 管理已加载密钥

相关推荐
玄芯散人2 小时前
【筑基·057】Git代码时光机:版本控制入门到分支管理
git·版本控制·嵌入式开发
szephyr4 小时前
Git 分支管理实战:feature/release/hotfix 怎么用才不乱
git·分支管理·团队协作·工作流·hotfix
一木 之林4 小时前
手搓家庭服务器:二手装机、Docker部署、端口映射与frp内网穿透
服务器·人工智能·git·编辑器
烛之武5 小时前
Git教程笔记
git·gitee
Sharewinfo_BJ5 小时前
PBIP项目结构与文件解析
git·powerbi·智信bi·上北智信
Hvitur17 小时前
Linux安装Git【离线安装】
git
howard20051 天前
6.4 Git安装与配置
git·安装配置
tryCbest1 天前
git实现前后端分离项目提交同一个仓库
git·gitee
Mr.朱鹏1 天前
Git 仓库同时推送到 Gitee 与 GitHub 配置指南
git·gitee·开源·github