ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

在我的电脑上设置一个 SSH 密钥并将公钥添加到 GitLab

完成了用户名和电子邮件的配置 --global

通过 SSH 和 HTTP 克隆以检查是否可以解决问题

完成 ssh -T git@gitlab.com 命令

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

运行 ssh -vvvv git@gitlab.com 以查看它是否获取 SSH 密钥
您是否通过 gitlab.com/profile/keys 添加了 SSH 密钥?
@ Nils Werner:当我执行此命令时,我得到了很多行,但其中之一是“身份验证成功(公钥)”
确保您没有运行 sudo git clone git@gitlab.com:project/somethiing.git,否则 ssh 将在 /root/.ssh 中查找,而不是您上传的密钥 ~/.ssh/id_rsa
我通过“ssh-add ~/.ssh/the_key”向代理添加密钥,然后按短语授权它们,从而解决了同样的问题。这是我添加到 GitLab 的私有部分。

F
Ferhat KOÇER

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

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

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


如果您在将 pub 文件复制到剪贴板时迷失了方向。请尝试以下操作:type %userprofile%\.ssh\id_rsa.pub | clip
在 Windows 10 中,如果您确实需要找到 .ssh\id_rsa.pub 您可以在 git bash 上键入此 cat ~/.ssh/id_rsa.pub 它会显示“密钥”,因此您可以将其复制并粘贴到 gitlab.com/profile/keys 中的文本字段
确保执行此操作:ssh-add filename(如果不在 rsa 目录中,则使用路径)在执行上述步骤之后
我这样做了,问题没有解决,权限被拒绝
引用@Blasanka 的答案 ssh-add filename,其中 filename 是最后没有 .pub 的文件。系统会提示您输入在 ssh 密钥创建期间生成的密码以添加您的身份
M
Mahdi Mohammadi Zadeh

第 1 步:在 ~/.ssh/config 文件中添加了一个配置文件,如下所示

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

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

** 有时您的 ~/.ssh/config 中有配置,但是 IdentityFile 路径不正确。您可以像 ls ~/.ssh/ 那样检查文件名。对于 gitlab,该文件通常是 id_ed25519。因此正确的配置是 IdentityFile ~/.ssh/id_ed25519


如果具有默认名称的密钥文件已用于不同目的,则这是必需的。如果您要创建一个具有非默认名称的密钥文件,例如 Fedo 示例中的 id_rsa_gitlab,您将需要提供一个配置文件。 Gitlab 关于此事的好文章:gitlab.com/help/ssh/…
这对我有用。我同时拥有 Github 和 Gitlab 密钥,以便您获得此解决方案。
我必须将 Hostname 更改为 Host 才能使其正常工作
这适用于我在 Windows 10 上使用超级终端中的 Ubuntu 20.04 WSL
这里重要的部分是 IdentityFile 是私有部分;您应该将此文件与您上传到 Gitlab 的 *.pub 公钥相匹配。故意将一个私钥与另一个公钥混合会失败。 Gitlab 会对您进行身份验证,因为您有一对匹配的文件。
H
Hussain

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

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

您基本上让 ssh-agent 处理它。

此外,您还可以add it permanently


它是扩展名为 .pub 的文件
不,私钥是没有 .pub 扩展名的文件。
在这个之后工作就像一个魅力。谢谢你,先生
E
Elad

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

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

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


谢谢。为我炒锅。
这并不能解决它完全回避它的问题。
这就是我正在寻找避免 ssh 并使用 https 方式的答案。
http 不允许我创建 git push -f,只能创建 git push
这工作,谢谢。 @UpAndAdam 这回避了这个问题,当然,但是 ssh 在 Windows 上是如此有问题和令人沮丧,我宁愿回避它。我宁愿完成工作也不愿与 ssh 搏斗。
T
TmTron

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

当我启动 WSL 时,我必须

启动 ssh-agent_eval $(ssh-agent -s)

将密钥添加到 ssh-agent:ssh-add ~/.ssh/id_rsa

如果出现提示,请输入密码

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

笔记:

weasel-pageant 允许我们重用在 WSL 内的 PuTTY 选美中加载的 ssh 密钥

详细解释:Git via SSH from Windows 返回 Permission Denied


r
rivanov

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


谢谢你。我的公司需要项目 em / 文件夹。我不得不使用 sudo 生成 ssh。这样,我可以使用 sudo git clone。你的建议对我帮助很大。
C
Chaurasia

如果您在 Linux 或 macox 中,只需在终端中尝试:

ssh-add -l

如果它什么都不返回,试试这个:

ssh-add

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

重试后:

ssh-add -l

它必须返回你的身份,所以重试克隆后,它必须工作

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

谢谢


不断返回 The agent has no identities.
你拯救了我的一天,谢谢!
s
skotperez

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

您可以在 /etc/ssh/sshd_config 中检查您的 ssh 服务器配置。如果您有带有选项 AllowUsers 的行,请将 git 添加到其中:

AllowUsers user1 user2 user3 git

Y
Y. Joy Ch. Singha

要完成的步骤,得到同样的错误,但我修复了它。 Gitlab 想要 ssh-rsa 所以下面是为 rsa 运行 ssh 的代码

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

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

它将提示您输入,因此在提示以下代码后只需按 Enter,输入保存密钥的文件(/home/yourDesktopName/.ssh/id_rsa):它将再次提示您输入,因此只需在下面的代码是提示,输入密码(没有密码时为空):它会再次提示您最后一次输入,所以在下面的代码提示后按 Enter,再次输入相同的密码:您将显示您的 ssh-rsa 生成。登录到您的 Gitlab 帐户并转到右侧导航栏,您将获得设置,在左侧边栏中您将获得 ssh 密钥。进入其中。看上面提示你输入,你会得到 ssh-rsa 的路径。转到您的 SSH 文件夹并获取 id_rsa.pub 打开它并获取密钥并将复制粘贴到 Gitlab,您就快完成了。检查方式:ssh -T git@gitlab.com 你会得到:欢迎来到 GitLab,@joy4!完毕。


谢谢。这适用于 Windows 10。我按照 gitlab 的指示尝试了 ed25519,但没有工作。
这个答案非常好 - 不知道为什么它没有投票更高。
这就是我的解决方案。
S
Shashank Agrawal

我知道,我很晚才回答这个问题,甚至 StackOverflow 也确认了我是否真的想回答。我正在回答,因为没有人真正描述过实际问题,所以想分享同样的问题。

基础知识

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

协议

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

HTTP 协议 SSH 协议

当您克隆存储库(或更改远程 URL)并使用像 https://gitlab.com/wizpanda/backend-app.git 这样的 HTTPs URL 时,它使用第一个协议,即 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 将允许您执行操作。

所以我不会重复穆罕默德已经给出的步骤,我会在理论上重复它们。

生成密钥对 `ssh-keygen -t rsa -b 2048 -C "My Common SSH Key" 默认情况下,生成的密钥对在 ~/.ssh 中,名为 id_rsa.pub(公钥)和 id_rsa(私钥)。您将公钥存储到您的 GitLab 帐户(同一密钥可用于多个或任何服务器/帐户)。当您克隆/推/拉时,GIT 会提供您的私钥。 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,其中详细说明了这一点。我的观点是,通过阅读错误并对错误进行思考,您可以做出自己的理论或理解,然后可以匹配一些谷歌结果来解决问题:)


x
xab

我有 gitlab 与 docker 一起运行,这就是我为解决问题所做的。

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

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

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

chown git:users authorized_keys


太感谢了。我在 Kubernetes 上运行 Gitlab,并且 /gitlab-data 目录(也是授权密钥的挂载点)存在权限问题。一个简单的chown就足够了。
@DillenMeijboom 您需要设置的 chown 权限是什么?我怀疑我的类似问题,但我不确定将 gitlab-data 挂载目录设置为什么。
S
Srikrushna

当您有多个 git 帐户并且想要不同的 ssh 密钥时,您必须按照相同的步骤生成 ssh 密钥,但请确保您

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

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

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

您必须使用以下命令获得新的 ssh 身份

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

J
JoeyGutMen

我在 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

我希望它可以帮助你们中的一些人!


D
Damien Flament

早些时候这对我来说非常困难,但是当我尝试时,在 Mac 和 Linux 中添加 ssh 密钥变得如此容易。有几个步骤和命令可以执行此操作,如下所示:

打开系统的终端并通过以下命令进入项目目录:

cd 'project directory name'

在该终端中运行命令 ssh-keygen 并输入它,直到密钥的 randomart 图像出现在那里。然后在该终端中再输入一个命令:

cat ~/.ssh/id_rsa.pub

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

复制密钥并转到您的 Gitlab 配置文件部分,然后 ssh 密钥部分并将其粘贴到那里。单击添加按钮,这将起作用。


T
Tasos Anesiadis

对于使用 Windows 10 且没有其他任何东西为他/她工作的任何人:

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


C
ColdFire

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

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


c
cherankrish

主要是两件事

您的 .ssh 文件夹中必须有 id_rsa.pub 和 id_rsa(私有)密钥(它应该在您的主文件夹中。如果它不存在,请创建它,放置您的密钥)。如果您以不同的方式命名密钥文件,它将无法工作将 id_rsa 的权限更改为 chmod 400 ~/.ssh/id_rsa


E
Emil Bode

可能导致此行为的另一个问题是,当您的设置具有 2 个可能的 %HOME%-位置时。

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

结果是 ssh-keygen 将我的私钥放在 C:\users\<MyUserName>\ 下,而 ssh -Tssh -v 也在那里。

所以一切似乎都运行良好,除了 git clonegit push 和其他人在 U:\ 中寻找一个键。失败了,所以我得到了上述错误。

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


B
BIS Tech

这种方式为我工作。

将 ssh / rsa 密钥添加到 gitlab ssh-add(键入您的终端)以验证类型 - ssh -vT git@gitlab.com


ssh-add 是我失踪了!谢谢!
f
fcdt

使用 cd path/to/project 转到终端中的项目目录 运行 ssh-keygen 输入密码 在终端中运行 cat ~/.ssh/id_rsa.pub 复制您在终端中获得的密钥 转到 Gitlab/Settings/SSH- KEYS 粘贴密钥并按添加密钥按钮

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


J
Jean-François Corbett

我是这样解决的。。

使用以下命令为 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”位置,但未找到,因此抛出错误。

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

file1 -> id_rsa 

file1.pub -> id_rsa.pub

并将两者都放置在位置 "/c/Users/xxx/.ssh/"


r
regina_fallangi

转到终端并再次重新生成 ssh 密钥。键入 ssh-keygen。它会询问您要保存它的位置,输入路径。

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


m
manifestor

我的问题是,我在 /etc/ssh/sshd_config 下的 SSH 配置文件中将 UsePAMyes 切换到 no。使用 UsePAM yes 一切正常。


R
RalfFriedl

如何在 ubuntu 中将 SSH 密钥添加到 gitlab 帐户?

在项目目录中打开终端。输入 'ssh-keygen -o -t rsa -b 4096 -C "your gitlab email" ' 然后回车 输入 'vim /home/mnbtech/.ssh/id_rsa.pub' 并回车(或手动打开你的 'id_rsa. pub'from 你保存它的地方) SSH 密钥将出现。复制这些并转到您的 gitlab 帐户。单击配置文件图像并单击设置在左侧选择 SSH-Keys 然后粘贴这些密钥单击添加密钥

SSH-Key 将被添加!

(注意,如果您有 Generate Previews SSH Key 和 Getting permission denied (public key)。您删除您的 Previews ssh 密钥并生成新密钥并在您的终端上添加 git user.name 和电子邮件)


该答案与前面的说明有什么不同?
t
tonderaimuchada

访问 git 存储库的两种方法之间似乎存在差异,即使用 SSH 或 HTTPS。对我来说,我遇到了这个错误,因为我试图使用 SSH 推送我的本地存储库。

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


那没有回答问题。
đ
đinh ngọc dương

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


U
Umar Hayat

我使用以下说明解决了 git@gitlab.com: Permission denied (publickey) 个问题

RUN cat ~/.ssh/id_rsa.pub 复制 id_rsa.pub(公钥)到你的 getlab `Setting -> SSH Keys RUN cat ~/.ssh/id_rsa 复制 id_rsa(私钥)到`Code_repo->git_auth->id_rsa

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


T
Thomas

在 Windows 10 上使用 Pageant 作为 SSH 代理对我没有任何帮助,除了向 Windows 添加环境变量(从德语 Windows 10 翻译,因此命名可能不同):

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

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


G
Gino Mempin

在我们的例子中,这不是用户/客户端的问题,而是 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 提供了一种通过对 GitLab 数据库进行快速索引查找来授权 SSH 用户的方法。 GitLab Shell 使用 SSH 密钥的指纹来检查用户是否有权访问 GitLab。将以下内容添加到您的 sshd_config 文件中。这通常位于 /etc/ssh/sshd_config,但如果您使用 Omnibus Docker,它将是 /assets/sshd_config: 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 # 结束匹配,设置再次应用于所有用户 Reload OpenSSH: # Debian 或 Ubuntu 安装 sudo service ssh reload # CentOS 安装 sudo service sshd reload 通过在 UI 中删除用户的 SSH 密钥、添加新密钥并尝试提取存储库来确认 SSH 是否正常工作。

默认情况下(以及我们安装的默认设置),在管理区域 > 性能优化设置中检查了 Write to authorized_keys 文件。所以我们取消选中它并使用 Gitlab 数据库。

https://i.stack.imgur.com/Gppam.png

设置索引查找并取消选中 Write to authorized_keys 文件后,SSH 访问变得正常。


S
Saaiheswar

就我而言,我使用 Ubuntu,有两个用户,一个是管理员用户,另一个是我,我以我(普通用户)身份登录时创建了“id_rsa”和“id_rsa.pub”文件,这些文件在您的“ .ssh”文件夹在您的主文件夹中,它可能无法找到,因为它是隐藏的,所以让它可见,以检查文件是否在其中。

所以文件是在我的用户配置文件中的“home/.ssh”中创建的,但是在将代码推送到 gitlab 时,我在终端中以管理员身份登录,使用命令:su - adminName(在此之后提示输入密码)

所以在“adminhome/.ssh”文件夹中找不到 ssh 私钥。因此,要解决此问题,您可以:

在管理员配置文件中创建“id_rsa”和“id_rsa.pub”(或)使用您的配置文件而不是管理员配置文件将代码推送到 gitlab。