当我尝试用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
命令来设置我的用户名和密码,但仍然无济于事。
2条答案
按热度按时间vbkedwbf1#
当通过ssh使用gitlab时,您需要使用一个特定的ssh密钥进行身份验证。
.ssh/config
文件中进行设置:x8diyxa72#
TL;DR
git config --global
)来选择一个特定的ssh实现。“user”总是git
;您需要使用一些非Git系统(例如网页)来配置您正在使用的 * 服务器 *。git config --global
配置Git使用你想要的凭据助手,然后使用任何方式配置特定的凭据助手。你需要用户名 * 和 * 密码、令牌或其他任何东西。长
Secure Shell (
ssh
)和Hypertext Transfer Protocol Secure (https
)是两个完全不同的协议,它们通常由完全不同的配置控制,并且使用完全不同的程序。作为LeGEC answered,ssh通常使用每台主机的配置条目(在主目录中名为
.ssh
的目录(文件夹)中名为config
的文件中找到)来设置连接到特定主机的选项。在这里,您可以列出用户名和/或特定密钥对。协议本身使用公钥和私钥对来处理身份验证,其工作方式如下:1.公钥/私钥对提供加密和解密消息文本的方法。拥有公钥部分的人可以 * 加密 * 文本;拥有私钥的人可以 * 解密 * 这些文本;但只有公钥的人无法解密他们自己加密的文本。这种数学技巧依赖于“单向”散列函数或大素数的乘积或其他东西,这些东西可能会也可能不会在量子计算的未来幸存下来(参见P vs NP problem和this 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 实际上并没有 * 做 * 任何验证,而是依赖于 * 其他软件 *,如下所示:
这就是在“TL;或者Git正在运行ssh并且ssh正在进行身份验证,或者Git正在使用libcurl并且需要身份验证信息来将 * feed * 到 * libcurl。