当前位置: 首页 > news >正文

SSH公钥私钥!进阶!SSH与Git!

当你使用 Git 与远程仓库(如 GitHub、GitLab)交互时,有两种主要的连接方式:HTTPS 和 SSH。HTTPS 方式每次操作(如 git push)都需要你输入用户名和密码(或个人访问令牌),而 SSH 方式则通过我们之前讨论的公钥私钥机制,实现更安全、更便捷的“免密”操作。

这个过程是如何工作的?GitHub 怎么知道我是谁?

第一章:核心原理:认证与授权

要理解这个过程,首先要区分两个概念:认证 (Authentication)授权 (Authorization)

  • 认证 (你是谁?):这是验证你身份的过程。SSH 的作用就在这里。你本地的私钥是你的“数字身份证”,GitHub 上你账户里存储的公钥是对应的“身份证备案”。当你连接时,GitHub 通过检查你的“身份证”来确认你的真实身份。

  • 授权 (你能做什么?):这是在你身份被确认后,检查你是否有权限执行特定操作的过程。例如,你是否有权限向某个私有仓库推送代码?这是由 GitHub 的仓库权限系统管理的。

SSH 只负责第一步:认证。 它向 GitHub 证明了“我就是持有这个私钥的用户”,GitHub 则根据这个证明,找到你对应的 GitHub 账户,然后才开始第二步的授权检查。

第二章:服务器在哪里?它知道什么?

1. 服务器是谁?

当你使用 SSH 方式与 GitHub 交互时,你连接的“服务器”就是 GitHub 的服务器。

当我们克隆或推送一个仓库时,会用到一个 SSH 格式的 URL,例如:
git@github.com:your-username/your-repo.git

让我们拆解这个 URL:

  • git: 这是你连接到 GitHub 服务器时,所使用的用户名注意: 这不是你的个人 GitHub 用户名!这是一个所有用户共用的、在 GitHub 服务器上预设好的特殊系统账户,专门用于处理 Git 的 SSH 连接。

  • @: 分隔符。

  • github.com: 这就是服务器的地址。你的 SSH 客户端会连接到这台服务器。

  • :your-username/your-repo.git: 这部分并不是标准的 SSH 路径,而是传递给 GitHub 服务器的参数,告诉它你想要操作哪个仓库。

所以,当你执行 git push 时,你的电脑实际上是在执行一条类似这样的命令:ssh -i [你的私钥] git@github.com "操作指令 for your-repo.git"

2. 服务器怎么知道我的账号?

这是最关键的一步,整个流程如下:

  1. 你发起连接(公钥宣告):你的 Git 客户端调用 SSH 发起连接。重要:你的私钥永远不会被发送到网络上。 在这个初始阶段,你的客户端实际上是向 GitHub 服务器宣告:“你好,我想以 git 用户的身份连接,并且我准备使用一个公钥来证明我的身份。这个公钥是 [你的公钥内容或其指纹]。” 客户端会发送这个公钥信息,但私钥本身绝不会离开你的电脑。

  2. GitHub 服务器查找公钥:GitHub 的 SSH 服务器收到了这个连接请求。它会立即拿着你宣告的公钥,去它庞大的“所有用户公钥备案”数据库里进行全局搜索。

  3. 匹配账户并准备挑战:因为你之前已经在你的 GitHub 账户设置中添加了这个公钥,所以服务器能够成功匹配到。此时,服务器完成了身份识别:“哦,持有这个公钥的人,就是 GitHub 上的 your-username 这个用户!” 但认证还没结束,服务器还需要验证你是否真的持有对应的私钥。

  4. 服务器发起挑战(私钥验证阶段):这才是判断私钥的阶段。服务器会生成一个随机的、一次性的消息(称为“挑战”),然后用它刚刚在你账户里找到的那个公钥对这条消息进行加密。然后,它将这个加密后的消息发送回你的电脑。

  5. 客户端应答挑战:你的电脑收到这个加密消息后,会调用本地对应的私钥(例如 ~/.ssh/id_rsa_github)进行解密。因为只有配对的私钥才能解开公钥加密的内容,所以如果解密成功,你的电脑就能得到原始的随机消息。然后,你的电脑将这个解密后的原始消息发回给 GitHub 服务器。

  6. 认证成功:GitHub 服务器收到你返回的消息后,会跟它自己最初生成的随机消息进行比对。如果两者完全一致,就向服务器证明了你确实是那个私钥的合法持有者。至此,认证 (Authentication) 过程才算真正完成

  7. 开始授权检查:现在,GitHub 已经完全确认了你的身份是 your-username。接下来,它会进入授权 (Authorization) 阶段,检查 your-username 这个账户,是否拥有对 your-repo.git 这个仓库的写入权限。

  8. 执行操作:如果授权检查通过,GitHub 就会接受你推送的代码。如果检查失败(比如你试图推送到一个不属于你或你没有权限的仓库),连接就会被拒绝。

服务器通过你宣告的公钥来识别出你的 GitHub 账户,然后再通过一个加密的“挑战-应答”过程,来验证你是否真的持有对应的私钥。这个过程确保了只有你才能以你的身份进行操作。

第三章:手把手配置指南

让我们完整地走一遍配置流程。

步骤一:生成专用的 SSH 密钥(推荐)

为了安全和管理方便,我们可以为 GitHub 创建一个专用的密钥对。

# -f 参数可以直接指定输出文件名,避免交互式询问
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_github -C "your_email@example.com"

这会在你的 .ssh 目录下生成 id_rsa_github (私钥) 和 id_rsa_github.pub (公钥) 两个文件。

步骤二:在 GitHub 上添加公钥
  1. 复制你的新公钥内容到剪贴板。

    # macOS
    pbcopy < ~/.ssh/id_rsa_github.pub
    # Linux (需要 xclip)
    xclip -selection clipboard < ~/.ssh/id_rsa_github.pub
    # Windows (PowerShell)
    Get-Content ~/.ssh/id_rsa_github.pub | Set-Clipboard

    当然,你也可以直接用记事本打开 id_rsa_github.pub 文件并手动复制。

  2. 登录 GitHub,进入 Settings > SSH and GPG keys

  3. 点击 New SSH key

  4. 给你的 Key 起一个可识别的标题(例如 My MacBook Pro),然后将剪贴板中的公钥内容粘贴到 Key 文本框中。

  5. 点击 Add SSH key

步骤三:配置本地 SSH config 文件

为了让你的 SSH 客户端在连接 github.com 时自动使用我们刚创建的专用密钥,需要配置 ~/.ssh/config 文件。

打开该文件,添加以下配置块:

Host github.comHostName github.comUser gitIdentityFile ~/.ssh/id_rsa_github
  • Host github.com: 创建一个别名,匹配所有到 github.com 的连接。

  • HostName github.com: 指定真实服务器地址。

  • User git: 自动使用 git 用户名。

  • IdentityFile ...: 核心配置,指定使用哪个私钥文件进行认证。

步骤四:测试连接

保存 config 文件后,在终端运行以下命令:

ssh -T git@github.com

如果你看到类似 Hi your-username! You've successfully authenticated... 的消息,那么恭喜你,所有配置都已成功!

步骤五:克隆或更新你的仓库 URL

现在,确保你的本地仓库使用的是 SSH 格式的远程 URL。

  • 对于新仓库:直接从 GitHub 页面复制 SSH 格式的 URL 进行克隆。

    git clone git@github.com:your-username/your-repo.git
  • 对于已有仓库:你可以检查当前的远程 URL,如果不是 SSH 格式,就更新它。

    # 检查当前 URL
    git remote -v
    # origin  [https://github.com/your-username/your-repo.git](https://github.com/your-username/your-repo.git) (fetch)
    # origin  [https://github.com/your-username/your-repo.git](https://github.com/your-username/your-repo.git) (push)# 如果是 HTTPS,更新为 SSH
    git remote set-url origin git@github.com:your-username/your-repo.git

现在,你所有的 git fetch, git pull, git push 操作都将通过 SSH 安全、无感地进行。

http://www.dtcms.com/a/403692.html

相关文章:

  • 网站必须兼容哪些浏览器中核正式员工年收入
  • 珠海网站品牌设计公司简介网络新闻专题做的最好的网站
  • keepalived服务器
  • AI写的超级好用的课堂互动系统
  • 山东建设机械协会网站课程网站建设的设计报告
  • 第四部分:Netty核心源码解析(下)
  • 攻克 大 Excel 上传难题:从异步处理到并发去重的全链路解决方案
  • 【双光相机配准】红外相机与可见光相机配准方案
  • 中国建设银行网站个人客户wordpress 主题显示
  • 开源超级终端PuTTY改进之:增加点对点网络协议IocHub,实现跨网段远程登录
  • 帮别人做网站如何备案wordpress video plugin
  • 118. 杨辉三角(dp)
  • 济宁网站开发招聘威海建设集团官方网站
  • 【QT】QPainter的使用
  • 北京代理网站备案成都市建设工程交易中心网站
  • PyTorch 数据处理工具箱与可视化工具
  • python的高阶函数
  • Python请求示例JD商品评论API接口,json数据返回
  • Json格式化处理碰到的问题
  • 驱动开发(4)|鲁班猫rk356x镜像编译,及启用SPI控制器驱动
  • Rust语言了解
  • 深圳成交型网站建设天元建设集团有限公司企业号
  • 织梦系统做的网站忘记登录密码semir是什么品牌
  • Python实现ETF网格自动化交易集成动量阈值判断
  • 使用c语言连接数据库
  • 网站在百度找不到了王占山人物简介
  • Windows Server 定时备份 MySQL 数据升级版:单表备份 + 压缩功能 + 运维统计
  • gpt-4o+deepseek+R生成热力图表
  • 管理系统前端模板河北seo网络推广
  • Mac完整Homebrew安装教程、brew安装教程踩过的坑、brew安装总结、安装brew遇到的问题