Git SSH和https正在请求两个不同的用户

fdbelqdn  于 2022-12-02  发布在  Git
关注(0)|答案(2)|浏览(120)

当我尝试用ssh克隆时,例如:git@test.company.com:service/test.git我得到了一个用户git@test.company.com的请求密码,但是当我尝试用http git http://test.company.com:service/test.git做同样的事情时,我得到了一个请求shh证书userName
为什么?我如何让ssh请求我的实际用户而不是git@test.company.com
我已经尝试配置使用git config --global命令来设置我的用户名和密码,但仍然无济于事。

vbkedwbf

vbkedwbf1#

当通过ssh使用gitlab时,您需要使用一个特定的ssh密钥进行身份验证。

  • 在服务器端:你需要注册你的公钥(使用gitlab的web界面)
  • 在计算机上:您可以在.ssh/config文件中进行设置:
Host test.company.com
    IdentityFile ~/.ssh/company-key
x8diyxa7

x8diyxa72#

TL;DR

  • 当在Git中使用ssh时,配置你的ssh子系统(通常只配置)。如果你的计算机有多个ssh实现,你 * 可能 * 需要使用Git级别的配置(git config --global)来选择一个特定的ssh实现。“user”总是git;您需要使用一些非Git系统(例如网页)来配置您正在使用的 * 服务器 *。
  • 在Git中使用https时,使用git config --global配置Git使用你想要的凭据助手,然后使用任何方式配置特定的凭据助手。你需要用户名 * 和 * 密码、令牌或其他任何东西。

Secure Shell ( ssh )Hypertext Transfer Protocol Secure ( https )是两个完全不同的协议,它们通常由完全不同的配置控制,并且使用完全不同的程序。
作为LeGEC answered,ssh通常使用每台主机的配置条目(在主目录中名为.ssh的目录(文件夹)中名为config的文件中找到)来设置连接到特定主机的选项。在这里,您可以列出用户名和/或特定密钥对。协议本身使用公钥和私钥对来处理身份验证,其工作方式如下:
1.公钥/私钥对提供加密和解密消息文本的方法。拥有公钥部分的人可以 * 加密 * 文本;拥有私钥的人可以 * 解密 * 这些文本;但只有公钥的人无法解密他们自己加密的文本。这种数学技巧依赖于“单向”散列函数或大素数的乘积或其他东西,这些东西可能会也可能不会在量子计算的未来幸存下来(参见P vs NP problemthis question)。
1.您的计算机通过IPv4或IPv6网络向目标计算机上的 *ssh服务端口 *(或任何端口)发送一个传出请求。当服务器响应时,它会发送该服务器的“指纹”以及有关其支持的加密协议类型的许多其他信息。然后,您的主机会检查此“指纹”以确保它已到达 * 正确的 * 服务器。
如今,使用“首次使用时信任”的方法是很常见的,也就是说,如果我们从未联系过某个特定的主机服务器(GitLab,GitHub,Bitbucket,等等)之前,不知道正确的指纹,我们只是取他们发送的任何指纹,也许给用户看,问用户看起来是否可以,然后保存。在随后的连接中,ssh将确保它的指纹与上次的指纹相同。如果出现了错误的指纹,ssh软件将拒绝连接尝试,假设某个坏家伙拦截了您与真实的服务器的通信尝试。
1.假设这里一切顺利,您的ssh实现和他们的ssh实现现在可以协商了。您的计算机要求以特定的 * 用户名 * 进行身份验证,并且通常会提供公钥/私钥对中的 * 公钥 * 部分。系统通常会假设您以前以某种方式 * 向 * 该主机提供了相同的公钥(见下面的注解)。然而,由于任何人都 * 可能 * 窥探到你的公钥,现在他们的工作是验证你实际上也拥有 * 私钥
1.为了测试您是否拥有 * 私钥 ,服务器会选择一些随机数据,并使用您发送的公钥对其进行加密。然后,服务器会将这些加密数据发送给您。使用您的私钥,您可以解密这些随机数据,并将其发送回服务器。如果您将正确的解密结果发送给服务器,服务器就会相信您拥有 * 此特定密钥对 * 的两部分。换句话说,您似乎有权声称自己是您所声称的用户。
Git托管服务器(包括GitLab)设置了这个过程,这样当你登录时,你通常会被强制向他们提供字符串常量git作为用户名。因此,他们会在此时 * 忽略 * 你 * 声称 * 的用户。相反,他们在一个大表中查找你发送的公钥。因为你已经在他们的系统中存储了公钥(当你把它注册为“这是一个公钥,我将在未来使用”,无论你如何去做),他们现在相信你是那个注册特定公钥的人。
这整个过程依赖于这样一个理念:
没有两个不同的用户拥有相同的公钥
**因此,“你是谁”完全由获得访问权的密钥对决定,不需要其他信息,但是在使用ssh时,您必须尝试以用户git的身份“登录”。**然后,您必须提供一个“有效”的密钥对:其中 public 密钥已在服务器上注册,并且您拥有相应的 private 密钥。

**相比之下,HTTPS具有完全不同的信任模型。**它使用的不是简单的“用户名和密钥对”系统,而是以前称为“ ssl 层”(SSL)的系统,现在称为Transport Layer Security or TLS

TLS比ssh要复杂得多。请查看维基百科页面了解背景。TLS 1.3的详细信息(现在大多数系统都需要)或1.2超出了本答案的范围(我自己还没有深入研究其中的大部分内容),但是正如您所看到的,通常必须提供用户名和密码或令牌。* 不 * 忽略此处的用户名。您 * 必须在此事务中提供正确的用户名。

Git不“执行”身份验证

在我看来,这里最有趣的一点是,Git 实际上并没有 * 做 * 任何验证,而是依赖于 * 其他软件 *,如下所示:

  • 要使用ssh和ssh认证,Git只需 * 运行ssh*。安全shell提供了一个流数据工具,因此一旦ssh连接建立,Git就可以发送和接收数据。ssh程序提供了所有必要的加密和解密、授权和安全性。这是一个干净而简单的模型,只要ssh本身是安全的,连接也是安全的。
  • 要使用https,Git通常需要系统提供的“libcurl”库或类似的库。Libcurl与现代计算机上的cURL program相关联。由于界面本身很复杂,而且Git本身不是加密软件,Git需要依赖 credential helpers 来获取传输设置的用户名和密码或令牌部分。

这就是在“TL;或者Git正在运行ssh并且ssh正在进行身份验证,或者Git正在使用libcurl并且需要身份验证信息来将 * feed * 到 * libcurl。

相关问题