Bitbucket:我如何能够在不设置该笔记本电脑的ssh密钥的情况下从笔记本电脑推送到repo



我真的很困惑我的比特桶的行为:

  1. 我有一个名为Prototype的项目,该项目下有多个存储库;

  2. 我能够将新的提交推送到名为Tiger的repo;我假设我已经将笔记本电脑的ssh密钥设置在了bitbucket的"中;"个人设置/SSH密钥";,因为如果我没有这样做,我将无法将提交推送到Tiger

  3. 还有一个名为Cat的repo,我刚刚发现我无法向它推送新的提交。这真的让我很困惑,因为我在同一台笔记本电脑上;

  4. 所以我检查了我的比特桶的";"个人设置/SSH密钥";,和BOOM!里面没有我笔记本电脑的ssh密钥!

那么,我如何首先推动到Tiger???我可能错了。。。但我确实记得我的笔记本电脑的ssh密钥存储在比特桶中。

  1. 然后我继续尝试将笔记本电脑的ssh密钥保存到bitbucket中,但它说:Someone has already added that SSH key.

到底怎么回事?

有什么想法吗?

TL;DR

弗雷德里克的评论有关键的见解(如果你能原谅这里的措辞的话):

您正试图将相同的密钥添加到两个不同的比特桶帐户

这只是ssh身份验证的问题,但对ssh身份验证来说是个大问题。每个Bitbucket帐户必须使用唯一公钥。

龙:怎么回事

Git本身不包含身份验证。要进行分布式操作,您的Git软件必须连接到其他一些Git软件。这两个软件版本不必相同——事实上,有些服务器可能根本不使用(C)Git——只要它们都使用Git协议,但该协议没有身份验证。它只是假设在使用协议时,服务器和客户端已经完全相互信任。所以主机系统相信你是你声称的人之前,你必须以某种方式证明你是。这就是身份验证过程。

通常,身份验证包括建立某种用户身份。每个网站都有点不同(出于$的原因,有时需要实际的美元,有时$reasons只是一个元变量),但有两种通用的方法来验证任何大型Git托管网站:

  • http(现在大多是https,因为纯http非常不安全),或者
  • ssh

https身份验证具有最大的可变性,因为有许多https实现,并且每个实现都有自己的身份和授权技术,所以它是我们可以说是最少的一种。然而,Bitbucket和GitHub现在都使用基于令牌的身份验证,而不是基于密码的身份验证。令牌和密码之间的区别本质上是,令牌是结构的密码,(对用户隐藏)结构包含额外信息。一种是让网站生成令牌(通常使用密码,也许还使用一些第二因素进行双因素身份验证)。然后,引导自己的Git提供用户名和令牌作为密码。这对将您验证为到宿主网站。这里的用户名是你的身份,密码或令牌是你的证明(所以要小心!)。

要在Git中使用此方法,请使用以https://开头的URL。它们的形式为https://user@host/path/passed/to/host(尽管可以在此处插入密码/令牌,或者省略user部分,但通常最简单的做法是包含用户并省略密码,这样只需通过某些凭据系统管理密码)。

ssh身份验证更加统一,可能是因为ssh实现较少,而且大多数都可以追溯到一个共同的起点。要在Git中使用ssh身份验证,请使用以ssh://开头或形式为user@host:path的URL,例如git@bitbucket.org:my/repo.git。ssh系统使用公钥加密这里没有涉及密码,至少目前是这样。

您的Git软件本身不进行任何身份验证,但可以使用凭据助手。它只对https身份验证执行此操作。这是高度可配置的,并且有很多系统依赖性。这也不是最初的问题,所以这就是我们在这里要说的全部。

在Git和大型托管站点中使用ssh身份验证

当您使用ssh进行身份验证时,会涉及到一个用户名,它就在URL中:ssh://user@host/pathuser@host:pathssh://部分(如果使用此表单)和at符号`@和冒号(如果使用该表单)是将出现在URL中的文字字符。

所有大型Git服务器都要求提供user部分作为文本字符串git。也就是说,他们将不将您认证为自己,而是将您验证为git伪用户。这有很多技术上的原因,但它们都归结为";这样比较容易,现在是惯例了;。由于您将声称自己是git伪用户,而不是无论您是真正的,主机都需要以其他方式弄清楚您是谁。大型Git服务器这样做的方式是作弊。

如果我们研究公钥加密,我们会发现它的工作原理是让你(或你的Git软件,或者在这种特殊情况下,ssh程序——Git在这里运行ssh,因为Git本身不包含ssh代码)向服务器提供一个公钥:一个长的,由字母和数字组成的随机字符串,以及可能代表某种加密密钥的其他字符。公共密钥之所以如此,是因为它不是秘密!你可以把它展示给任何人,尽管没有充分的理由来炫耀它。

除了这个公钥,无论它是什么,还有一个配对的私钥,你应该对它保密(像密码一样小心保护它)。只要有公共密钥,任何人都可以轻松加密任何数据;私钥的持有者可以使用私钥轻松地解密相同的数据,但缺乏私钥的人不能1因此,当使用ssh时,您连接到服务器——在本例中是Bitbucket——并声称自己是用户git,并向他们发送公钥。他们使用公钥加密随机选择的字符串,你使用私钥解密并将其发送回,他们会发现你实际上拥有私钥。

但是:他们怎么会知道你是谁您自称是git伪用户。这就是作弊的原因:每个公钥/私钥对都有一个唯一的公钥2因此,在使用ssh将连接到主机服务器之前,您必须使用https(以及用户名和密码,可能还有2FA)连接到主机,然后将您计划稍后在ssh连接中使用的公钥上载到主机服务器。

此时,托管服务器——在本例中是Bitbucket——在一个大表或数据库中查找所有公钥。如果你刚刚给他们的公钥已经在表中,他们会给你你看到的错误:

Someone has already added that SSH key.

有人可能就是你。事实上,假设公钥的唯一性,它必须是您!他们不会告诉你是谁,只是告诉你你现在不能添加这个,因为我,bitbucket,已经有了。(如果你想知道他们认为这个特定的公钥代表谁,你只需要运行ssh -T git@bitbucket.com:你也有私钥,你的ssh会用它解密他们发送的内容,你就会成功登录,他们会告诉你他们认为你是谁。)

假设密钥在他们的大表/数据库中是而不是,他们会添加它,以及您使用https登录他们网站时使用的用户名。现在托管服务器知道,如果有人——任何人--在未来出现并提供公钥;某人;自称是。如果有人也可以解密他们作为挑战提供的随机字符串,那么有人也有私钥,因此就是你。


1不是,也就是说,如果没有像足够强大的量子计算机这样神奇的东西"后量子";正如链接文章中所讨论的,密码学是为了抵御这种未来威胁。

2这在任何技术意义上都不能保证,但在公钥中包含了足够多的额外数据和其他垃圾,在任何实用意义上,它都是唯一的。Git本身在对象哈希ID方面也有同样的问题:它们在实践中只是唯一的,而不是理论上的。理论上,理论和实践是一样的,但在实践中却不是--Benjamin Brewster,很可能是


你的案子发生了什么

无法确定。也许您对一个存储库使用https身份验证,对另一个存储库则使用ssh身份验证。

但是,您现在知道,您可以运行ssh -T git@bitbucket.org来查看他们认为您是谁。这是基于您提供给他们的公钥。如果您需要在Bitbucket上拥有多个帐户,则需要仔细控制您提供的公钥。

请注意,ssh可以使用代理来存储密钥对:这使您可以避免将密钥对直接存储在您正在使用的计算机上(例如,如果您正在使用共享的中间工作机器,您可能希望将笔记本电脑侧的密钥保留在非共享笔记本电脑上,并使用代理仅在需要时短暂地将其传递到共享机器)。但是,当确实使用代理时,您将失去对在ssh协商的哪个点提供哪些密钥的控制。.ssh/config文件允许您指定只应发出某些特定密钥。您也可以使用此机制来表示您的ssh应该提供伪用户git用户名:例如,请参阅,Bitbucket ssh公钥被拒绝,但他们的ssh测试连接没有问题(这个问题可以追溯到Bitbucket在过渡期间还是Mercurial服务器的时代)。

相关内容

  • 没有找到相关文章

最新更新