如何在一台电脑上设置多个用于不同git平台的公钥
一、背景
当我在自己的本地电脑给github设置完公钥后,再想在gitlab上推送/拉取代码时,发现:

所以我希望能够在一台mac上同时拥有两个平台的密钥,推送/拉取代码时能够分别在不同平台上操作
二、步骤
核心原理:Mac的SSH客户端支持通过 *~/.ssh/config* 配置文件,*为不同的git服务器(eg:github.com/gitlab.com)绑定专属的密钥文件*,当你访问对应服务器时,SSH 会自动选择匹配的密钥,无需每次手动指定。
步骤 1:为 GitHub 和 GitLab 分别生成独立密钥
先为两个平台生成****命名不同的密钥对****(避免覆盖默认密钥),打开 Mac 的「终端」(Terminal)执行:
1. 生成 GitHub 专用密钥
1 | # 替换为你的GitHub注册邮箱,密钥文件命名为id_ed25519_github |
2. 生成 GitLab 专用密钥
1 | # 替换为你的GitLab注册邮箱,密钥文件命名为id_ed25519_gitlab |
执行每个命令后会出现提示:
Enter passphrase (empty for no passphrase): → 可选:设置密钥密码(更安全,每次用 SSH 时需输入),也可直接回车跳过;
Enter same passphrase again: → 若设了密码则重复输入,否则回车。

生成完成后,~/.ssh目录下会出现 4 个文件:
id_ed25519_github(GitHub 私钥)、id_ed25519_github.pub(GitHub 公钥);
id_ed25519_gitlab(GitLab 私钥)、id_ed25519_gitlab.pub(GitLab 公钥)。
步骤 2:创建 / 编辑 SSH Config 文件(核心:自动匹配密钥)
这是实现 “不同平台用不同密钥” 的关键,Mac 的 SSH 会通过这个配置文件识别服务器并选择对应密钥。
1. 打开 Config 文件(没有则创建)
1 | # 用文本编辑器打开~/.ssh/config,不存在则自动创建 |
2. 粘贴以下配置内容(直接复制,替换注释里的路径)
1 | # GitHub 配置 |
3. 设置 Config 文件的正确权限(Mac 安全要求)
SSH 对配置文件权限要求严格,执行以下命令确保权限正确(否则会失效):
1 | chmod 600 ~/.ssh/config # Config文件权限设为600(仅自己可读可写) |
步骤 3:将对应公钥上传到 GitHub/GitLab
分别复制 GitHub 和 GitLab 的公钥内容,上传到对应平台的 SSH 设置里。
1. 复制 GitHub 公钥(Mac 一键复制)
1 | cat < ~/.ssh/id_ed25519_github.pub |
登录 GitHub → 右上角头像 → Settings → SSH and GPG keys → New SSH key;
Title:填备注(如 “Mac - GitHub”);
Key:粘贴复制的公钥内容 → 点击Add SSH key。
2. 复制 GitLab 公钥(Mac 一键复制)
1 | cat < ~/.ssh/id_ed25519_gitlab.pub |
登录 GitLab → 右上角头像 → Preferences → SSH Keys;
Title:填备注(如 “Mac - GitLab”);
Key:粘贴复制的公钥内容 → 点击Add key。
步骤 4:测试 SSH 连接(验证配置是否生效)
分别测试 GitHub 和 GitLab 的 SSH 连接,确认密钥匹配成功。
1 | # 测试 GitHub 连接 |
若输出 Hi 你的GitHub/GitLab用户名! You’ve successfully authenticated…,说明 GitHub/GitLab 密钥配置成功。
三、Q & A
Q:有的同学可能会遇到这个问题:github连接成功了,但是好像gitlab连接失败了,更“诡异”的是gitlab/github都可以正常pull/push等操作
A:
ssh -T 测试的是「全局 GitLab 服务器的用户级认证」,而 push/pull 正常说明「针对具体仓库的权限认证是有效的」—— 两者的认证逻辑、依赖的密钥 / 权限范围不同,并非真的 “连接失败”。
具体可以查看一下实际的仓库类型,是否是私有仓库
1 | # 查看仓库的远程地址(确认是 gitlab.com 还是私有 GitLab) |
输出示例 1(公共 gitlab.com 仓库):
1 | origin git@gitlab.com:你的用户名/你的仓库.git (fetch) |
输出示例 2(私有 GitLab 实例 / Deploy Key 授权):
1 | origin git@gitlab.company.com:部门/你的仓库.git (fetch) |
如果是示例 2,说明你测试的 gitlab.com 和实际操作的 gitlab.company.com 是两个不同的服务器,密钥自然不匹配。
