在gitlab上获得权限被拒绝(公钥)

时间:2016-11-04 16:26:08

标签: git ubuntu ssh gitlab

我的问题是我无法从GitLab推送或获取。但是,我可以克隆(通过HTTP或通过SSH)。我尝试推送时出现此错误:

  

权限被拒绝(publickey)致命:无法从远程存储库中读取

从我看过的所有主题中,我就是这样做的:

  • 在我的计算机上设置SSH密钥并将公钥添加到GitLab
  • 完成配置 - 全局用户名和电子邮件
  • 通过SSH和HTTP克隆以检查是否可以解决问题
  • 完成ssh -T git@gitlab.com命令

如果您对如何解决我的问题有任何见解,我们将不胜感激。

36 个答案:

答案 0 :(得分:128)

我搜索了很多之后发现了这个。它对我来说非常好。

  1. 转到" Git Bash"就像cmd一样。右键单击"以管理员身份运行"。
  2. 输入ssh-keygen
  3. 按enter键。
  4. 它会要求您将密钥保存到特定目录。
  5. 按enter键。它会提示您输入密码或输入无密码。
  6. 将为特定目录创建公钥。
  7. 现在转到目录并打开.ssh文件夹。
  8. 您会看到一个文件id_rsa.pub。在记事本上打开它。复制其中的所有文字。
  9. 转到https://gitlab.com/profile/keys
  10. 粘贴在"键"文本框。
  11. 现在点击"标题"下面。它会自动填满。
  12. 然后点击"添加密钥"。
  13. 现在试一试,它肯定会起作用。

答案 1 :(得分:37)

第1步: 在〜/ .ssh /文件夹中添加了一个看起来像

的配置文件
   User git
   Hostname gitlab.com
   IdentityFile ~/.ssh/id_rsa_gitlab
   TCPKeepAlive yes
   IdentitiesOnly yes

第2步:只需克隆没有sudo的git repo。

答案 2 :(得分:11)

我认为简单的解决方案是将私钥添加到身份验证代理(如果您的密钥不是~/.ssh/id_rsa),

ssh-add ~/.ssh/<your private key>

你基本上让ssh-agent来处理它。

此外,您可以add it permanently

答案 3 :(得分:9)

确保您没有投放sudo git clone git@gitlab.com:project/somethiing.git,否则ssh会查看/root/.ssh而不是您上传的密钥~/.ssh/id_rsa

答案 4 :(得分:7)

就我而言,它在WSL(Linux的Windows子系统)中不起作用。

启动WSL时,我必须

  • 启动ssh-agent_ eval $(ssh-agent -s)
  • 将密钥添加到ssh-agent:ssh-add ~/.ssh/id_rsa
  • 如果出现提示,请输入密码

现在连接正常。
我们可以使用ssh -T git@github.com

对此进行测试

详细说明:Git via SSH from Windows returns Permission Denied

答案 5 :(得分:3)

就我而言,它不是gitlab问题,而是sshd配置问题。除了用户列表之外,ssh服务器不允许连接。用户git,即远程连接到gitlab的用户git,不在该列表中。所以,先检查一下。

您可以在/etc/ssh/sshd_config中查看您的ssh服务器配置。如果你有一个带有AllowUsers选项的行,请添加git:

AllowUsers user1 user2 user3 git

答案 6 :(得分:3)

对于使用 Windows 10 且对他/她没有其他帮助的任何人:

就我而言,我必须使用 https 而不是ssh克隆存储库,并弹出一个窗口询问我的凭据。 之后一切正常。

答案 7 :(得分:3)

有一个非常简单的解决方案: 而不是使用ssh-移至https。 去做这个: 在您的项目文件夹中,您有一个.git文件夹 在那里-您有一个配置文件-在文本编辑器中将其打开 并更改行

  

url =git@gitlab.com:您的名称/yourproject.git

  

url = https://gitlab.com/yourname/yourproject.git

答案 8 :(得分:3)

要完成的步骤,出现相同的错误,但我已将其修复。 Gitlab需要ssh-rsa,因此下面是为rsa运行ssh的代码

  1. ssh-keygen -o -t rsa -b 4096 -C "name@gmail.com"

name@gmail.com是您的gitlab帐户电子邮件

  1. 它将提示您输入,因此在提示以下代码后按Enter键即可

    输入用于保存密钥的文件(/home/yourDesktopName/.ssh/id_rsa):

  2. 它将再次提示您输入,因此在提示以下代码后按Enter键即可。

    输入密码(无密码时为空):

  3. 它将再次提示您输入最后一个,因此在提示以下代码后按Enter键即可。

    再次输入相同的密码:

  4. 您将显示ssh-rsa生成。

  5. 登录到您的Gitlab帐户,然后转到右侧导航栏进行设置,并在左侧边栏获取ssh密钥。输入它。

  6. 在提示您输入的提示上方,您将获得ssh-rsa的路径。

  7. 转到您的SSH文件夹并获取id_rsa.pub

  8. 打开它并获取密钥,然后将Paste Paste复制到Gitlab,就快完成了。

  9. 检查者:ssh -T git@gitlab.com

  10. 您将获得:Welcome to GitLab, @joy4!

  11. 完成。

答案 9 :(得分:2)

主要有两件事

  1. .ssh文件夹中必须具有id_rsa.pub和id_rsa(专用)密钥(该密钥应该位于主文件夹中;如果没有,请创建它)。如果您用不同的方式命名密钥文件

  2. 将id_rsa的权限更改为chmod 400〜/ .ssh / id_rsa

答案 10 :(得分:2)

我有使用docker运行的gitlab,这就是我为解决问题而采取的措施。

发现在docker / var / log / gitlab / sshd / current 里面发生了多次消息:

  

身份验证被拒绝:错误的所有权或文件/var/opt/gitlab/.ssh/authorized_keys的模式

之后我将该文件的所有权从 99:users 更改为 git:users

  

chown git:users authorized_keys

答案 11 :(得分:2)

我遇到了同样的问题,我通过添加新的ssh密钥解决了该问题:

  1. ssh-keygen -t ed25519 -C "email@example.com"
  2. 将您的公共SSH密钥复制到剪贴板(在我的Linux上为xclip -sel clip < ~/.ssh/id_ed25519.pub
  3. 在gitlab上,转到settings=>ssh键,然后跳过新键

答案 12 :(得分:2)

如果您使用的是Linux或macox,只需在终端上尝试一下:

ssh-add -l

如果什么都不返回,请尝试以下操作:

ssh-add

它必须在〜/ .ssh / id_rsa中创建身份

重试后:

ssh-add -l

它必须返回您的身份,因此在尝试克隆后,它必须可以工作

NB:别忘了在个人资料gitlab中添加ssh密钥

谢谢

答案 13 :(得分:2)

我知道,我回答得很晚,即使我真的想回答,也可以通过StackOverflow确认。我之所以要回答,是因为没有人实际描述过实际问题,因此想分享相同的问题。

基础

首先,了解这里的遥控器是什么。远程是GitLab,您的系统是本地系统,因此当我们谈论远程origin时,在git remote -v输出中设置的任何URL就是您的远程URL。

协议

基本上,Git克隆/推/拉主要在两种不同的协议上工作(也有其他协议)-

  1. HTTP协议
  2. SSH协议

克隆克隆存储库(或更改远程URL)并使用HTTPs URL(例如https://gitlab.com/wizpanda/backend-app.git)时,它将使用第一个协议,即HTTP协议。

如果您克隆存储库(或更改远程URL)并使用git@gitlab.com:wizpanda/backend-app.git之类的URL,则它将使用SSH协议。

HTTP协议

在此协议中,每个远程操作(例如克隆,推入和拉出)均使用简单的身份验证(即远程用户名和密码,在本例中为GitLab),这意味着对于每个操作,您都必须输入用户名和密码,可能很麻烦。

因此,当您进行推/拉/克隆操作时,GitLab / GitHub会使用用户名和密码对您进行身份验证,并允许您执行操作。

如果要尝试此操作,可以通过运行命令git remote set-url origin <http-git-url>切换到HTTP URL。

为避免这种情况,您可以使用SSH协议。

SSH协议

简单的SSH连接适用于公私钥对。因此,在您的情况下,GitLab无法对您进行身份验证,因为您使用的是SSH URL进行通信。现在,GitLab必须以某种方式了解您。为此,您必须创建一个公钥-私钥对并将公钥提供给GitLab。

现在,当您使用GitLab推/拉/克隆时,默认情况下,GIT(内部SSH)将向GitLab提供您的私钥并确认您的身份,然后GitLab将允许您执行操作。

因此,我将不再重复穆罕默德已经给出的步骤,我将在理论上重复它们。

  1. 生成密钥对`ssh-keygen -t rsa -b 2048 -C“我的通用SSH密钥”
  2. 默认情况下,生成的密钥对将位于~/.ssh(公用密钥)和id_rsa.pub(专用密钥)的id_rsa中。
  3. 您会将公用密钥存储到您的GitLab帐户(同一密钥可用于多个或任何服务器/帐户)。
  4. 克隆/推/拉时,GIT提供您的私钥。
  5. GitLab将私钥与您的公钥进行匹配,并允许您执行。

提示

您应该始终创建一个至少2048个字节的强rsa密钥。因此命令可以是ssh-keygen -t rsa -b 2048

https://gitlab.com/help/ssh/README#generating-a-new-ssh-key-pair

一般思想

这两种方法各有利弊。键入上面的文本后,我去搜索了更多关于此的内容,因为我从未阅读过有关此的内容。

我找到了这个官方文档https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols,其中提供了更多有关此内容的信息。我的意思是,通过阅读错误并对错误进行思考,您可以做出自己的理论或理解,然后可以与一些Google结果匹配以解决问题:)

答案 14 :(得分:1)

在我们的例子中,这不是用户/客户端方面的问题,而是Gitlab服务器方面的问题。

我们在CentOS 7.1上运行本地Gitlab CE 12.9实例。

我们发现在服务器上, .ssh / authorized_keys 文件未正确更新。用户创建其SSH密钥(遵循Gitlab指南)并将其添加到Gitlab服务器,但该服务器不会更新 authorized_keys ,因此它将始终导致权限被拒绝错误。

一种解决方法是通过运行以下命令来rebuild the authorized_keys file

$ sudo gitlab-rake gitlab:shell:setup

这对在运行rake任务之前 添加了密钥的任何人都有效。对于接下来要添加其密钥的用户,某人必须再次手动运行rake任务。

一个更永久的解决方案是使用 authorized_keys 文件,而使用indexed lookup on the Gitlab database

GitLab Shell提供了一种通过快速的索引索引来授权SSH用户的方法 查找到GitLab数据库。 GitLab Shell使用以下指纹 SSH密钥以检查用户是否有权访问GitLab。

将以下内容添加到您的sshd_config文件中。通常位于 /etc/ssh/sshd_config,但如果您是/assets/sshd_config 使用Omnibus Docker:

Match User git    # Apply the AuthorizedKeysCommands to the git user only   
  AuthorizedKeysCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check git %u %k   
  AuthorizedKeysCommandUser git 
Match all    # End match, settings apply to all users again 

重新加载OpenSSH:

# Debian or Ubuntu installations   
sudo service ssh reload

# CentOS installations   
sudo service sshd reload 

通过在用户界面中删除用户的SSH密钥,添加新密钥并尝试提取存储库来确认SSH是否正常工作。

默认情况下(也是我们安装时的默认设置),在管理区域>性能优化设置中检查了写入授权密钥文件。因此,我们取消了选择,而是使用了Gitlab数据库。

enter image description here

设置索引查找并取消选中写入授权密钥文件后,SSH访问就可以了。

答案 15 :(得分:1)

以前,这对我来说非常困难,但是当我尝试时,在Mac和Linux中添加ssh密钥变得如此容易。有一些步骤和命令可以做到这一点,如下所示:

  1. 打开系统的终端,并通过以下命令在项目目录内移动:
cd 'project directory name'
  1. 在该终端中运行命令ssh-keygen并输入它,直到密钥的randomart图像出现在其中。

  2. 然后在该终端中再输入一个命令:

cat ~/.ssh/id_rsa.pub

它将生成您的ssh密钥。密钥将以ssh-rsa开头,并以.local结尾。

  1. 复制密钥,然后转到Gitlab配置文件部分,然后依次转到ssh key部分并将其粘贴到此处。单击Add按钮将起作用。

答案 16 :(得分:1)

我在gitlab help中找到了解决方案。

To create a new SSH key pair: 
 1. Open a terminal on Linux or macOS, or Git Bash / WSL on Windows.
 2. Generate a new ED25519 SSH key pair: ssh-keygen -t ed25519 -C "email@example.com"
 2.1 Or, if you want to use RSA: ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
 3. Next, you will be prompted to input a file path to save your SSH key pair to... use the suggested path by pressing Enter
 4. Once the path is decided, you will be prompted to input a password to secure your new SSH key pair. It's a best practice to use a password, but it's not required and you can skip creating it by pressing Enter twice.
 5. Copy your public SSH key to the clipboard by using one of the commands below depending on your Operating System:
        macOS:        pbcopy < ~/.ssh/id_ed25519.pub
        WSL / GNU/Linux (requires the xclip package):      xclip -sel clip < ~/.ssh/id_ed25519.pub
        Git Bash on Windows:      cat ~/.ssh/id_ed25519.pub | clip
 6. Navigating to SSH Keys and pasting your public key in the Key field
 7. Click the Add key button

希望它能对您有所帮助!

答案 17 :(得分:1)

  

当您有多个git帐户并且想要不同的ssh密钥时

     

您必须遵循相同的步骤来生成ssh密钥,但是请确保   你

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js" integrity="sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/" crossorigin="anonymous"></script>
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.2/pdf.js"></script>

<form id="myform">
  <input id="inputData" name="metallica" placeholder="Enter a metallica song"><button type="submit">Enter Sandman</button>
</form>

<iframe id="display"></iframe>

输入要保存的路径(例如:my-pc / Desktop / .ssh / ed25519)

将公钥添加到您的gitlab(How to adding ssh key to gitlab

  

您必须使用以下命令重新设置ssh身份

#display

答案 18 :(得分:1)

转到终端,然后重新生成ssh密钥。输入ssh-keygen。它将询问您要将其保存在何处,键入路径。

然后将公钥复制到gitlabs平台。通常以ssh-rsa开头。

答案 19 :(得分:0)

我已按照以下说明解决了git@gitlab.com: Permission denied (publickey)问题

  1. 运行cat ~/.ssh/id_rsa.pub
  2. id_rsa.pub(公共密钥)复制到您的getlab`Setting-> SSH Keys
  3. 运行cat ~/.ssh/id_rsa
  4. id_rsa(私钥)复制到`Code_repo-> git_auth-> id_rsa

注意:,如果您在DockerFile中使用root用户或其他任何地方,然后使用sudo su,请在运行上述命令获取root用户之前照顾机器用户公钥和私钥。

答案 20 :(得分:0)

  1. 使用cd path/to/project进入终端中的项目目录
  2. 运行ssh-keygen
  3. enter 输入密码
  4. 在终端机上运行cat ~/.ssh/id_rsa.pub
  5. 复制在终端上获得的密钥
  6. 转到Gitlab/Settings/SSH-KEYS
  7. 粘贴键,然后按添加键按钮

这对我来说就像一个魅力!

答案 21 :(得分:0)

由于Windows-10上的ssh-agent冲突,我遇到了此问题。 如果您也使用Windows-10,请仔细阅读我对此here

的详细解决方案

如果您不在Windows-10上,请检查是否:

  1. 您的ssh-agent正在运行
  2. 正确的私钥已添加到您的ssh-agent
  3. 正确的公钥已添加到您的github帐户(您可以克隆,因此此步骤应该可以)

答案 22 :(得分:0)

我这样解决了。

使用以下命令为Windows生成密钥:

ssh-keygen -t rsa -C "your.email@example.com" -b 4096

但是问题是运行此命令后,它弹出了一行: “输入要在其中保存密钥的文件(/c/Users/xxx/.ssh/id_rsa):” 在这里,我只给出文件名,因为我的密钥被保存在我的pwd中,而不是在给定位置。当我执行“ git clone”时,它假设密钥位于“ /c/Users/xxx/.ssh/id_rsa”位置,但未找到,因此抛出错误。

在生成密钥时,生成了两个文件,例如“ file1”和“ file1.pub”。我将这两个文件都重命名为

file1 -> id_rsa 

file1.pub -> id_rsa.pub

并将它们都放置在"/c/Users/xxx/.ssh/"位置

答案 23 :(得分:0)

我将我的~/.ssh/id_rsa.pub添加到了我的GitLab设置https://gitlab.com/profile/keys中的已知SSH密钥列表中。那为我解决了问题。 :-)

答案 24 :(得分:0)

我的问题是我使用了具有sudo访问权限的非root用户。但是,即使sudo git clone ...也不起作用。解决方案是为项目chown user projectfolder创建文件夹,然后在没有sudo的情况下运行克隆。

答案 25 :(得分:0)

这种为我工作的方式。

  1. 将ssh / rsa键添加到gitlab
  2. ssh-add(输入您的终端)
  3. 对于已验证类型-ssh -vT git@gitlab.com

答案 26 :(得分:0)

如果您发现git clone XXX可能会使用LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to XXX,则可能只是更新您的操作系统,安装了一些开发工具,例如Xcode及其在Mac,VPN,防病毒软件(尤其是Kaspersky Antivirus)或其他工具之间的工具。

就我而言,只需重新启动操作系统(macOS Catalina)即可解决此问题。

答案 27 :(得分:0)

在Windows 10上使用Pageant作为SSH代理对我没有任何作用,除了在Windows中添加环境变量(从德语Windows 10转换而来,因此命名可能有所不同):

  1. 搜索“变量”
  2. 开放系统环境变量
  3. 单击底部的环境变量按钮
  4. 将一个名为“ GIT_SSH”的新密钥和值“ C:\ Program Files \ PuTTY \ plink.exe”添加到顶部“用户变量xxx”
  5. 您完成了。

非常感谢Benjamin Bortels,消息来源:https://bortels.io/blog/git-in-vs-code-unter-windows-richtig-einstellen

答案 28 :(得分:0)

对我来说,问题是我在UsePAM下的SSH配置文件中将yesno切换到/etc/ssh/sshd_config。使用UsePAM yes,一切都可以完美运行。

答案 29 :(得分:0)

我遇到了同样的问题, 我重新生成.ssh文件夹中的ssh密钥而未命名(将其保留为id_rsa.pub)后,此问题已得到修复。 然后将其再次添加到gitlab ssh密钥。 现在一切正常。

答案 30 :(得分:0)

更改权限:: chmod 400〜/ .ssh / id_rsa 这对我有帮助。

答案 31 :(得分:0)

我使用的是ubuntu 18.04,实际上是本地计算机中的权限问题。当我对.git文件夹设置读/写权限时,问题就消失了。

答案 32 :(得分:0)

两种访问git存储库的方式(即使用SSH或HTTPS)之间似乎有所不同。对我来说,我遇到了错误,因为我试图使用SSH推送本地存储库。

只需在项目的登录页面上单击“克隆”按钮,然后复制HTTPS链接并将其替换为以“ git @ gitlab ...”格式显示的SSH链接,就可以解决问题。

答案 33 :(得分:0)

如何在ubuntu中将SSH密钥添加到gitlab帐户? 在gitlab上获得权限被拒绝(公钥)

  1. 在项目目录中打开终端。
  2. 输入“ ssh-keygen -o -t rsa -b 4096 -C“您的gitlab电子邮件””并按Enter键
  3. 输入“ vim /home/mnbtech/.ssh/id_rsa.pub”,然后按Enter (或从保存位置手动打开“ id_rsa.pub”) 4.SSH密钥将会出现。复制这些内容并

  4. 转到您的gitlab帐户。

  5. 点击个人资料图片,然后点击设置
  6. 在左侧选择SSH密钥
  7. 然后粘贴那些键 点击添加键

将添加SSH密钥!

((如果您具有“生成预览SSH密钥”和“拒绝获取权限”(公用密钥),则为N.B。您删除“预览” ssh密钥并生成新密钥,并在终端上添加git user.name和email)

答案 34 :(得分:0)

如果您的站点使用的是TLS / SSL,请使用git config credential.helper store。 希望这行得通

答案 35 :(得分:0)

好,在尝试@Khan提出的答案后,我遇到了同样的问题。但是,我只能通过将.git / config文件中的原始URL更改为https地址:https://gitlab.com/mygitlabusername/mygitproject.git

来使其工作

由于通过ssh的访问被拒绝,因此我发现使用https应该不是问题。但是,每次推送到存储库时,它都会询问您的用户名和密码