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


134

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

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

从我看过的所有线程来看,这是我所做的:

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

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


5
运行ssh -vvvv git@gitlab.com以查看是否获取了SSH密钥
Nils Werner

1
您是否通过gitlab.com/profile/keys添加了SSH密钥?
Akram Fares

@ Nils Werner:执行此命令时,我会看到很多行,但其中之一是“身份验证成功(公钥)”
Alexandre Fernandes Bartolomeu

4
确保您未在​​运行sudo git clone git@gitlab.com:project/somethiing.git,否则将使用ssh /root/.ssh代替上载的密钥~/.ssh/id_rsa
rivanov

1
我通过“ ssh-add〜/ .ssh / the_key”向代理添加密钥,然后通过短语授权它们来解决了相同的问题。这是我添加到GitLab的私有部分。
Celdor

Answers:


257

我经过大量搜索后发现了这一点。对我来说,它将完全正常。

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

现在试一试,它肯定会起作用。


2
万一您迷失了将发布文件复制到剪贴板中的情况。请尝试以下操作:type %userprofile%\.ssh\id_rsa.pub | clip
jquijano

5
在Windows 10中,如果确实需要找到.ssh \ id_rsa.pub,则可以在git bash上键入此 cat〜/ .ssh / id_rsa.pub,它将显示“ Key”,因此您可以将其复制并粘贴到文本字段中在gitlab.com/profile/keys
Chutipong Roobklom

11
请确保执行以下操作:(ssh-add filename如果不在rsa目录中,则使用路径)在执行上述步骤之后
Blasanka

3
像魅力一样工作。谢谢。
brduca

3
我这样做了,问题没有解决,权限被拒绝了
Billal Begueradj

62

步骤1:在~/.ssh/config文件中添加了一个配置文件,看起来像

   User git
   Hostname gitlab.com
   IdentityFile ~/.ssh/id_rsa_gitlab
   TCPKeepAlive yes
   IdentitiesOnly yes

步骤2:只需克隆git repo而无需sudo。
文档:https : //gitlab.com/help/ssh/README#working-with-non-default-ssh-key-pair-paths


1
如果具有默认名称的密钥文件已经用于其他目的,则这是必需的。如果要使用非默认名称创建密钥文件id_rsa_gitlab(例如Fedo的示例),则需要提供一个配置文件。Gitlab关于此事的漂亮文章:gitlab.com/help/ssh/…–
Dany

这对我有用。我同时拥有Github和Gitlab密钥,以便您使用此解决方案。
M.Cush

我必须进行更改HostnameHost使其正常运行
-Sadee

27

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

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

您基本上ssh-agent可以照顾它。

另外,您可以将其永久添加


它是带有扩展名.pub的文件
Felipe

7
不可以。私钥是没有.pub扩展名的文件。
侯赛因

15

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

启动WSL时,我必须

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

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

笔记:


11

确保您没有在运行sudo git clone git@gitlab.com:project/somethiing.git,否则将使用ssh /root/.ssh而不是您上载的密钥~/.ssh/id_rsa


9

有一个非常简单的解决方案:代替使用ssh-移至https。为此:在项目文件夹中有一个.git文件夹-您有一个配置文件-在文本编辑器中将其打开并更改行

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

网址= https://gitlab.com/yourname/yourproject.git


谢谢。为我工作。
ktv6

7

如果您使用的是Linux或macox,请在终端中尝试以下操作:

ssh-add -l

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

ssh-add

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

重试后:

ssh-add -l

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

注意:不要忘记在个人资料gitlab中添加ssh密钥

谢谢


5

就我而言,这不是一个gitlab问题,而是一个sshd配置问题。ssh服务器不允许连接,但用户列表除外。用户git(远程连接到gitlab的用户)不在该列表中。因此,请先检查此内容。

您可以在中检查ssh服务器配置/etc/ssh/sshd_config。如果您在选项行中AllowUsers添加git:

AllowUsers user1 user2 user3 git

3

我在docker上运行了gitlab,这是我解决问题的方法。

发现在docker / var / log / gitlab / sshd / current内部,出现了多次消息:

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

之后,我通过以下方式将该文件的所有权从99:users更改为git:users

chown git:用户的authorized_keys


1
非常感谢。我在Kubernetes上运行Gitlab,并且/ gitlab-data目录(这也是authorized_keys的安装点)存在权限问题。一个简单的chown就足够了。
Dillen Meijboom

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. 打开它并获取密钥,然后将粘贴复制到Gitlab,您就快完成了。

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

  10. 你会得到: Welcome to GitLab, @joy4!

  11. 做完了


谢谢。这在Windows 10上有效。我按照gitlab的说明尝试了ed25519,但没有用。
迪卡

这个答案非常好-不确定为什么它的投票不高。
mgibson

3

以前,这对我来说非常困难,但是当我尝试时,在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按钮将起作用。

这对我有用!谢谢
Shamseer Ahammed

2

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

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

2

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

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

ssh-keygen -t ed25519 -C "your-email-id@gmail.com" 

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

将公钥添加到您的gitlab中(如何将ssh密钥添加到gitlab中

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

ssh-add ~/my-pc/Desktop/.ssh/ed25519

2

主要有两件事

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

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


2

可能导致此行为的另一个问题是当您使用2个可能的%HOME%-位置进行安装时。

我正在使用PC,其中一些文档存储在本地,而某些文档存储在网络驱动器上。有些应用程序认为C:\Users\<MyUserName>\是我的%home%,另一些应用程序认为是U:\家。

原来,ssh-keygen把我的私钥放在C:\users\<MyUserName>\ssh -T然后ssh -v也在那里。

因此,其他所有内容似乎都可以正常工作git clonegit push而其他人则在中寻找密钥U:\。失败了,所以我得到了前面提到的错误。

我花了一个小时才找到答案,但最后的解决方案很简单:我将所有内容从复制C:\Users\<MyUserName>\.sshU:\.ssh


1

我这样解决了

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

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

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

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

file1 -> id_rsa 

file1.pub -> id_rsa.pub

并放置在两个位置 "/c/Users/xxx/.ssh/"


1

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

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


1

对我来说,问题是,我UsePAM从切换yesnoSSH配置文件下的/etc/ssh/sshd_config。与UsePAM yes一切正常。


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

希望对您有所帮助!


1

如何在ubuntu中将SSH密钥添加到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密钥。复制这些并

  5. 转到您的gitlab帐户。

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

SSH密钥将被添加!

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


该答案与之前的说明有何不同?
RalfFriedl '19

1

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

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


1

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

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

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

一种解决方法是通过运行以下命令重建authorized_keys文件

$ sudo gitlab-rake gitlab:shell:setup

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

一个更永久的解决方案是使用authorized_keys文件,而是在Gitlab数据库上使用索引查找

GitLab Shell提供了一种通过对GitLab数据库进行快速索引查找来授权SSH用户的方法。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密钥,然后尝试提取一个存储库来确认SSH是否正常工作。

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

在此处输入图片说明

设置索引查找并取消选中“ 写入authorized_keys”文件后,SSH访问就可以了。


1

对于使用Windows 10且无其他工作的人:

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


1

我知道,我回答得很晚,甚至StackOverflow也证实了我是否真的想回答。我之所以要回答,是因为没有人实际描述过实际问题,因此想分享相同的内容。

基础

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

协议

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

  1. HTTP协议
  2. SSH协议

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

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

HTTP协议

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

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

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

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

SSH协议

简单的SSH连接适用于公私钥对。因此,在您的情况下,由于您正在使用SSH URL进行通信,因此GitLab无法对您进行身份验证。现在,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结果相匹配来解决此问题:)



0

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


0

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

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


0

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


0

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

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


那没有回答问题。
RalfFriedl

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.