Git SSH 认证问题解决过程记录
背景
之前,我一直是通过使用自己的阿里云主账号跟公司的钉钉组织绑定的方式来登录阿里云 codeup 的。后面因为该账号登录后,页面出现白屏。来不及联系阿里云技术支持来解决这个问题,公司运维人员让我切换到公司的 RAM 账号来登录。因为这是阿里云 codeup 的新账号,所以需要重新配置新的 SSH key。配置完成后,在命令行终端执行 git pull 时出现下面的错误。
问题描述
在进行 Git 操作时遇到以下错误:
找不到代码库,请确认是否有权限且代码库路径正确
fatal: unable to access 'https://codeup.aliyun.com/xxx/ecosystem/project-name.git/': The requested URL returned error: 403
问题分析
症状
- Git pull/clone 操作返回 403 错误
- SSH 测试连接成功,但无法访问具体仓库
- 错误信息提示权限或路径问题
根本原因
问题出在 SSH agent 的密钥管理上。SSH agent 中加载了错误的密钥(ED25519类型),而阿里云 CodeUp 仓库需要使用特定的 RSA 密钥进行认证。
涉及的概念
-
SSH Agent
- 一个密钥管理器,用于存储和管理 SSH 密钥
- 运行在后台的程序,可以保存已解密的私钥
- 避免重复输入密码
- 在 macOS 系统中是预装的系统组件,作为
launchd的一部分自动运行 - macOS 会在首次使用时自动启动 SSH agent,无需手动安装或配置
-
SSH 密钥类型
- RSA:传统且广泛使用的密钥类型
- ED25519:较新的密钥类型,提供更好的安全性
- 不同服务可能支持不同的密钥类型
-
Git 认证机制
- HTTPS:使用用户名密码认证
- SSH:使用密钥对认证
- SSH 认证依赖于 SSH agent 的密钥管理
解决步骤
-
检查当前 SSH agent 状态
ssh-add -l输出显示当前加载的密钥类型和信息
-
清除现有密钥
ssh-add -D移除 SSH agent 中的所有密钥
-
添加正确的密钥
ssh-add ~/.ssh/id_rsa # 添加用于 CodeUp 的 RSA 密钥确保添加的是正确的密钥文件
-
验证密钥添加
ssh-add -l确认新添加的密钥已被正确加载
-
测试 Git 操作
git pull验证问题是否解决
常用命令参考
ssh-add -l- 列出当前加载的所有密钥ssh-add -D- 删除所有已加载的密钥ssh-add ~/.ssh/[密钥文件]- 添加特定的密钥ssh -T git@codeup.aliyun.com- 测试与 CodeUp 的 SSH 连接-T(Disable pseudo-terminal allocation): 禁用伪终端分配,用于纯粹的 SSH 连接测试,不需要分配终端
ssh -vT git@codeup.aliyun.com- 使用详细模式测试 SSH 连接,用于调试-v(Verbose mode): 详细模式,显示连接过程中的调试信息,包括密钥协商、认证方式等详细日志- 可以使用多个 v(如 -vv 或 -vvv)来获取更详细的日志信息
预防措施
-
密钥管理
-
为不同的服务使用不同的密钥
-
明确标记每个密钥的用途:
-
使用有意义的文件名,例如:
~/.ssh/id_rsa.github # GitHub 使用的密钥 ~/.ssh/id_rsa.codeup # 阿里云 CodeUp 使用的密钥 ~/.ssh/id_rsa.gitlab.company # 公司 GitLab 使用的密钥 -
在生成密钥时添加注释:
ssh-keygen -t rsa -C "username@company-codeup" -f ~/.ssh/id_rsa.codeup -
在 ~/.ssh/config 中配置密钥映射:
# CodeUp 配置 Host codeup.aliyun.com IdentityFile ~/.ssh/id_rsa.codeup User git # GitHub 配置 Host github.com IdentityFile ~/.ssh/id_rsa.github User git
-
-
定期检查 SSH agent 中的密钥状态
-
-
配置管理
- 在
~/.ssh/config中配置不同主机的密钥 - 为不同的 Git 托管服务配置不同的认证方式
- 保持密钥权限的正确性(600 或 400)
- 在
-
文档记录
- 记录每个密钥的用途和关联服务
- 保存故障处理步骤以供将来参考
- 定期更新和维护认证配置