Git 账号在一台电脑关联多个版本仓库 | Git 多账号 ssh-key 管理 | Github 和 Gitlab 共同使用...

本文详细指导新手如何为每个GitHub和GitLab账户分别生成专属的SSH-key,并配置config文件以避免邮箱识别错误。通过实例说明了配置步骤、测试连接及优化项目目录。

问题

使用电脑已存在的 ssh-key 直接添加到版本仓库,这是新手配置时候很容易犯的错误。

相关报错:OpenSSL SSL_read: Connection was reset, errno 10054Bug0015

场景

在一台电脑上登录 git,但是要操作多个版本仓库如 GitLab 和 GitHub,但是版本仓库的邮箱可能不一样。

原因/解析

两个版本仓库添加同一个 ssh-key,会导致一个 ssh-key 的邮箱不对。

如何生成 ssh-key ,下文解决方案第一步给出。

代码托管网站主要看 email( email邮箱涉及到 Git 这个版本控制工具邮箱和版本仓库 GitLab 或者 GitHub 绑定的邮箱)来识别身份,用自己的版本控制工具 Git 的 email 地址来匹配版本仓库 GitLab 或者 GitHub 账户名的邮件地址,如果相同,代码托管网站就认为此操作是账户所有者的操作。比如:

如果本地设定的user.email值是:personal@126.com,由于在GitHub上的账户的邮件地址也是personal@126.com,如果从这台电脑push的话,GitHub会认定这次这个push是账户拥有者自己做的,跟直接登录到GitHub,从网站上修改,是相同的,修改人是一样,就是账户拥有者。

这篇文章对Git用户名与Github账户关系的理解,对用户名邮箱等分析的可以说比较透彻。也是解决 github 和 gitlab 共同使用关键。

解决方案

思路

1、为 Github 和 Gitlab(两个及以上 GitHub 账号同理) 生成不同的 ssh-key,并给予不同的命名如下,保存到指定位置。
2、添加ssh-key到版本仓库(Github、Gitlab、Gitee)

步骤

1个 Github + 一个 Gitlab

1、生成ssh-key

进入命令行输入如下指令,生成ssh-key

# 为 github 生成ssh-key 	-f 后面是指定生成文件名字
ssh-keygen -t rsa -C "github 绑定的邮箱" -f C:/Users/xxx/.ssh/id_rsa_github
# id_rsa_github.pub是github的ssh-key

# 为gitlab生成ssh-key	
ssh-keygen -t rsa -C "gitlab 绑定的邮箱" -f C:/Users/xxx/.ssh/id_rsa_gitlab
# id_rsa_gitlab.pub是 gitlab 的 ssh-key

2、创建 config 文件
在 .ssh 文件夹下创建 config 文件,注意无后缀就直接命名 config
令不同 Host 实际映射到同一 HostName,但密钥文件不同。

Host github
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_github

Host gitlab
    #HostName [IP or host] 
    HostName 1xx.6x.xx.xx      
    IdentityFile ~/.ssh/id_rsa_gitlab
                                                                      
Host github2
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_github2

配置文件解析

#Host myhost(myhost为自定义的host简称,连接远程服务器就可以用命令ssh myhost)[注意下面有缩进]
     #User 登录用户名/账号邮箱(如:git/xxxxx2@xx.com) 
     #HostName 主机名可用ip也可以是域名(如:github.com)
     #Port 服务器open-ssh端口(默认:22,默认时一般不写此行)
     #IdentityFile 证书文件路径(如~/.ssh/id_rsa_*)

3、测试连接

测试连接是否成功,执行命令并出现下面情况说明成功!

ssh -T git@gitlab
# 出现:Welcome to GitLab, 用户名!

ssh -T git@github   #ssh -T git@github.com 也可,但是注意两个GitHub账号就不能区分了,下文有介绍
# 出现:Hi 用户名! You've successfully authenticated, but GitHub does not provide shell access.

两个GitHub账号时建议(原理同上)

注意此时ssh -T git@github.com如果配置两个github账号时会有报错,很明显生活显而易见的。

因此配置时建议入下:

Host github1.github.com
    HostName github.com
    User xxxxx@xx.com  # 账号邮箱
    IdentityFile ~/.ssh/id_rsa_github
                                                                 
Host github2.github.com
    HostName github.com
    User xxxxx2@xx.com  # 第二套账号邮箱
    IdentityFile ~/.ssh/id_rsa_github2

测试连接

ssh -T git@github1.github.com

ssh -T git@github2.github.com

其他优化

配置仓库, 让不同仓库的项目工作在不同目录

假如公司电脑 gitlab 用的比较多,gitlab 配置,可以全局配置

git config --global user.name 'username'
git config --global user.email 'username@gmail.com'	# 这里是公司gitlab用的邮箱

而对于 github 配置,可以单独创建一个目录,在该目录下存放github上的代码

cd E:/ProFiles/指定目录
git init
git config --local user.name 'username'
git config --local user.email 'username@gmail.com'	# 这里是github用的邮箱
<think>我们正在解决GitHub SSH密钥权限被拒绝的问题(Permission denied (publickey))。根据引用内容,我们可以发现两个关键点: 1. 引用[1]中提到了在连接时指定公钥认证所接受的密钥类型:`-o PubkeyAcceptedKeyTypes=+ssh-rsa` 2. 引用[2]中提到了在~/.ssh/config文件中配置特定主机允许使用ssh-rsa算法 结合当前GitHub的情况:从2022年3月15日起,GitHub不再支持使用不安全的SHA-1哈希算法生成的RSA密钥。但用户可能仍然在使用旧的RSA密钥,或者系统默认配置可能不支持新的密钥类型。 此外,我们之前生成密钥时推荐使用ed25519,但有些系统可能不支持,或者用户可能在使用旧的RSA密钥。 因此,解决方案可以包括: 1. 确保使用安全的密钥类型(如ed25519)并正确配置。 2. 如果必须使用RSA密钥,则确保密钥长度足够(至少4096位)。 3.SSH配置中为github.com主机添加配置,允许使用rsa-sha2-512或rsa-sha2-256签名算法(GitHub现在支持的RSA签名算法),或者如果客户端较旧,可能需要添加配置以兼容。 但是,根据引用[2]的提示,我们可能需要显式允许ssh-rsa算法(虽然不推荐,但在某些旧系统可能是临时解决方案)。不过,GitHub官方文档指出,他们现在支持rsa-sha2-512/256,而ssh-rsa(即rsa-sha1)已被弃用,但为了兼容性,他们仍然接受(不过会显示警告)。所以,如果用户遇到问题,可能是因为他们的SSH客户端版本较旧,默认不支持新的签名算法。 因此,我们提供以下步骤: 步骤1:检查现有SSH密钥 步骤2:生成新的SSH密钥(如果还没有安全的密钥) 步骤3:配置SSH客户端以使用新密钥,并正确设置算法 步骤4:测试连接 具体解决Permission denied的步骤如下: 1. 确保公钥已正确添加到GitHub账户。 2. 检查本地SSH代理是否正在运行并且密钥已添加。 3. 如果使用RSA密钥,请更新SSH客户端配置以使用更安全的签名算法,或者如果必须使用旧的ssh-rsa,则显式启用(但仅作为临时解决方案)。 详细步骤: 一、验证密钥是否已添加到SSH代理 运行: ```bash ssh-add -l ``` 如果没有任何密钥列出,则需要添加: ```bash ssh-add ~/.ssh/id_ed25519 # 或者你的私钥文件 ``` 二、如果使用RSA密钥,且SSH客户端版本较旧(如OpenSSH 8.2之前),可能不支持新的签名算法,需要更新SSH客户端。或者,可以配置SSH客户端在连接GitHub使用新的签名算法。 三、如果必须使用RSA密钥,并且遇到问题,可以尝试在~/.ssh/config文件中为GitHub添加配置,以使用兼容的签名算法: 创建或修改~/.ssh/config文件: ```config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa # 替换为你的私钥路径 # 以下两行是关键的算法配置,用于支持新的签名算法 HostkeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa ``` 注意:GitHub官方文档指出,他们现在支持rsa-sha2-512rsa-sha2-256,而ssh-rsa(SHA1)已被弃用。因此,上述配置是强制使用旧的ssh-rsa(不推荐),但可能解决连接问题。理想的做法是生成一个新的ed25519密钥,或者使用新的RSA密钥(4096位)并确保使用支持新算法的SSH客户端。 四、另一种临时测试方法是在命令行中指定算法(如引用[1]所示): ```bash ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa -T git@github.com ``` 但是,这只是一个临时测试,要永久解决,建议在配置文件中设置。 然而,更推荐的解决方案是: 1. 生成一个新的ED25519密钥(如果系统支持): ```bash ssh-keygen -t ed25519 -C "your_email@example.com" ``` 2. 将新的公钥添加到GitHub账户。 3. 在~/.ssh/config中指定使用这个新密钥: ```config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 # 以下两行通常不需要,因为ed25519密钥使用新算法,默认支持 # 但如果你同时有RSA密钥,并且想确保使用ed25519,可以明确指定算法(可选) # HostkeyAlgorithms ssh-ed25519 # PubkeyAcceptedAlgorithms ssh-ed25519 ``` 4. 测试连接:`ssh -T git@github.com` 如果问题依旧,请检查权限: - 确保~/.ssh目录权限为700 - 确保私钥文件权限为600 五、如果上述方法都无效,可以尝试更新SSH客户端到最新版本。 总结:优先使用ed25519密钥,并确保正确配置。如果必须使用RSA,请确保密钥为4096位,并更新SSH客户端。如果客户端过旧,可以尝试在配置中启用ssh-rsa算法(作为临时解决方案)。 根据用户的问题,我们给出一个完整的解决步骤: 步骤1:生成新的ed25519密钥(如果还没有) 步骤2:将公钥添加到GitHub 步骤3:配置SSH代理 步骤4:创建或修改~/.ssh/config文件,配置Host github.com 步骤5:测试连接 详细步骤: 1. 生成密钥(如果已有ed25519密钥可跳过): ```bash ssh-keygen -t ed25519 -C "your_email@example.com" ``` 保存到默认路径(~/.ssh/id_ed25519),并设置密码(可选)。 2. 将公钥内容(~/.ssh/id_ed25519.pub)添加到GitHubSSH keys设置中。 3. 确保ssh-agent运行并添加密钥: ```bash eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ``` 4. 创建或编辑~/.ssh/config文件,添加以下内容: ```config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 # 如果使用RSA密钥,并且遇到问题,可以添加以下两行(但ed25519通常不需要) # 但如果你同时有多个密钥,或者之前使用RSA,现在想用ed25519,明确指定IdentityFile即可 ``` 5. 测试连接: ```bash ssh -T git@github.com ``` 6. 如果仍然出现Permission denied,尝试在~/.ssh/config中为github.com主机添加以下两行(强制使用ed25519算法,或者如果使用RSA密钥且必须使用ssh-rsa算法): ```config # 对于ed25519,通常不需要,但可以尝试指定算法(可选) HostkeyAlgorithms ssh-ed25519 PubkeyAcceptedAlgorithms ssh-ed25519 ``` 或者如果是RSA密钥(不推荐): ```config HostkeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa ``` 7. 再次测试。 8. 如果还是不行,请检查以下常见问题: - 公钥是否完整添加到GitHub(没有多余空格或换行) - 是否使用了正确的私钥文件路径 - 是否在连接时使用了正确的用户名(git) 9. 也可以使用详细模式查看错误原因: ```bash ssh -vT git@github.com ``` 根据引用[2]的提示,我们也可以尝试在配置文件中添加`PubkeyAcceptedAlgorithms +ssh-rsa`来解决RSA密钥的问题。但请注意,这只是一个过渡方案,因为GitHub将来可能会完全移除对ssh-rsa的支持。 因此,我们推荐使用ed25519密钥,并避免使用RSA密钥(除非是新的RSA密钥且使用新的签名算法)。 最后,如果用户在使用Windows,并且使用较旧版本的OpenSSH(比如Windows自带的),可能需要更新OpenSSH客户端,或者使用Git Bash中的SSH客户端(通常更新)。 如果问题仍然存在,请提供详细的错误日志(使用ssh -vT)以便进一步分析。</think>## 解决 Git SSH 密钥 "Permission denied (publickey)" 错误 以下是针对 GitHub SSH 密钥权限被拒绝问题的完整解决方案,结合了引用内容最佳实践: ### 1. **检查密钥配置状态** ```bash ssh -T git@github.com -v ``` - 查看详细错误日志,确认问题根源 - 检查是否显示 `Offering public key: /Users/you/.ssh/id_ed25519` 等密钥提供信息 ### 2. **更新 SSH 配置(关键步骤)** 创建或修改 `~/.ssh/config` 文件: ```config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 # 或你的密钥路径 # 兼容性配置(解决 RSA 密钥问题) HostkeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa ``` - 此配置强制接受 RSA 密钥(GitHub 2022年后要求)[^1][^2] - 保存后执行:`chmod 600 ~/.ssh/config` ### 3. **验证并添加密钥到代理** ```bash # 启动 SSH 代理 eval "$(ssh-agent -s)" # 列出已加载密钥 ssh-add -l # 添加密钥(若无) ssh-add ~/.ssh/id_ed25519 ``` ### 4. **测试连接(带调试参数)** ```bash ssh -T -o PubkeyAcceptedAlgorithms=+ssh-rsa git@github.com -v ``` - 应看到成功消息:`Hi username! You've successfully authenticated...` ### 5. **权限修复(重要)** ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/* chmod 644 ~/.ssh/*.pub ``` - Windows 用户需在 Git Bash 中执行 - 错误的文件权限是常见失败原因 ### 6. **密钥生成最佳实践** ```bash ssh-keygen -t ed25519 -C "your_email@example.com" ``` - 推荐 Ed25519 算法(更安全高效) - 如系统不支持,使用:`ssh-keygen -t rsa -b 4096 -C "your_email"` ### 7. **多平台配置示例** ```config # ~/.ssh/config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_work HostkeyAlgorithms +ssh-rsa Host gitlab.com HostName gitlab.com User git IdentityFile ~/.ssh/id_ed25519_personal ``` > **注意**:GitHub 自 2022 年 3 月起要求 RSA 密钥使用 SHA-2 签名[^1]。若使用旧系统,需在连接时显式指定 `-o PubkeyAcceptedAlgorithms=+ssh-rsa`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeRain程序雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值