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

Getting permission denied (public key) on gitlab

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

Permission denied (publickey) fatal : Could not read from remote repository

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

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

我有 gitlab 运行 docker,这就是我解决问题的方法。

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

Authentication refused: bad ownership or modes for file /var/opt/gitlab/.ssh/authorized_keys

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

chown git:users authorized_keys

我搜索了很多之后找到了这个。它对我来说非常好用。

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

现在试一试,肯定会成功。

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

第一步: 在 ~/.ssh/config 文件中添加了一个类似于

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

第 2 步:只需在不使用 sudo 的情况下克隆 git 存储库。
文档:https://gitlab.com/help/ssh/README#working-with-non-default-ssh-key-pair-paths

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

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

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

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

此外,您可以add it permanently

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

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

AllowUsers user1 user2 user3 git

我是这样解决的..

使用此命令为 Windows 生成了密钥:

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

但问题是在运行这个命令之后,它弹出了一行: "Enter file in which to save the key (/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/"

的位置

转到终端并重新生成 ssh 密钥。输入 ssh-keygen。它会问你想把它保存在哪里,输入路径。

然后复制public键到gitlabs平台。它通常以 ssh-rsa 开头。

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

ssh-add -l

如果 return 什么都没有,试试这个:

ssh-add

它必须在 ~/.ssh/id_rsa

中创建标识

重试后:

ssh-add -l

它必须return你的身份,所以在重试克隆之后,它一定能工作

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

谢谢

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

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

当我启动WSL时,我必须

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

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

来测试

备注:

待完成的步骤,遇到同样的错误,但我已修复。 Gitlab 需要 ssh-rsa,所以下面是 运行 ssh for rsa

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

name@gmail.com是你的gitlab账号邮箱

  1. 它会提示你输入,所以在提示下面的代码后按回车键,

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

  2. 它会再次提示你输入,所以在提示下面的代码后按回车键,

    输入密码(没有密码则为空):

  3. 它会再次提示你最后一次输入,所以在提示下面的代码后按回车键,

    再次输入相同的密码:

  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. 完成。

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

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

我用的是ubuntu 18.04,其实是我本地机器的权限问题。当我为我的 .git 文件夹设置 read/write 权限后,问题就消失了。

When you have multiple git account and you want different ssh key

You have to follow same step for generating the ssh key, but be sure you

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

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

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

You have to new ssh identity using the below comand

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

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

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

我的问题是,我在 /etc/ssh/sshd_config 下的 SSH 配置文件中将 UsePAMyes 切换为 noUsePAM yes 一切正常。

主要有两点

  1. 您的 .ssh 文件夹中必须有 id_rsa.pub 和 id_rsa(私钥)(如果不存在,它应该在您的家中 folder.Create把你的钥匙放在那里)。如果您以不同的方式命名您的密钥文件,那将不起作用

  2. 修改id_rsa的权限为chmod 400 ~/.ssh/id_rsa

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

希望对大家有所帮助!

如果您的站点使用 TLS/SSL,请使用 git config credential.helper store。 希望这有效

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

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

原来 ssh-keygen 把我的私钥放在 C:\users\<MyUserName>\ 下面, ssh -Tssh -v 也在那里看。

所以一切似乎都正常,除了 git clonegit push 和其他人在 U:\ 中寻找密钥。 哪个失败了,所以我得到了上述错误。

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

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

  1. 在您的项目目录中打开终端。
  2. 输入‘ssh-keygen -o -t rsa -b 4096 -C "your gitlab email" ’然后回车
  3. 键入“vim /home/mnbtech/.ssh/id_rsa.pub”并回车 (或从保存位置手动打开“id_rsa.pub”)
  4. 将出现 SSH 密钥。复制这些和

  5. 转到您的 git实验室帐户。

  6. 单击个人资料图片并单击设置
  7. 左侧selectSSH-Keys
  8. 然后粘贴那些密钥 点击添加密钥

SSH-Key待补!

(N.B 如果您有生成预览 SSH 密钥和获取权限被拒绝(public 密钥)。您删除您的预览 ssh 密钥并生成新密钥并添加 git user.name 和您终端上的电子邮件 )

之前这对我来说非常困难,但当我尝试后,在 Mac 和 Linux 中添加 ssh 密钥变得非常容易。执行此操作的步骤和命令如下:

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

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

cat ~/.ssh/id_rsa.pub

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

  1. 复制密钥并转到您的 Gitlab 配置文件部分,然后转到 ssh key 部分并将其粘贴到那里。单击 Add 按钮即可。

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

只需单击项目登录页面上的克隆按钮并复制 HTTPS link 并将其替换为格式为 [= 的 SSH link 即可解决该问题14=].

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

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

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

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

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

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

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

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

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

  1. 搜索 "variables"
  2. 打开系统环境变量
  3. 点击底部的环境变量按钮
  4. 将名为 "GIT_SSH" 的新键和值 "C:\Program Files\PuTTY\plink.exe" 添加到顶部 "User Variables xxx"
  5. 大功告成。

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

尝试使用 git clone XXX 如果您看到 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to XXX 可能 只是更新了您的 OS,安装了一些开发工具,例如Xcode 及其 Mac、VPN、杀毒软件(尤其是卡巴斯基杀毒软件)或其他工具 between/other。

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

这种方式适合我。

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

我的问题是我使用了具有 sudo 访问权限的非根用户。但是连 sudo git clone ... 都没用。解决方案是为项目创建文件夹,chown user projectfolder 然后 运行 没有 sudo 的克隆。

在我们的例子中,这不是 user/client 端的问题,而是 Gitlab 服务器端的问题。

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

我们发现在服务器上,.ssh/authorized_keys 文件没有正确更新。用户创建自己的 SSH 密钥(按照 Gitlab 指南)并将其添加到 Gitlab 服务器,但服务器不会更新 authorized_keys,因此总是会导致权限被拒绝错误。

解决方法是 rebuild the authorized_keys file 运行ning:

$ sudo gitlab-rake gitlab:shell:setup

这适用于在 运行 rake 任务之前添加密钥的任何人。对于下一个要添加密钥的用户,必须有人再次手动 运行 rake 任务。

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

GitLab Shell provides a way to authorize SSH users via a fast, indexed lookup to the GitLab database. GitLab Shell uses the fingerprint of the SSH key to check whether the user is authorized to access GitLab.

Add the following to your sshd_config file. This is usually located at /etc/ssh/sshd_config, but it will be /assets/sshd_config if you're using 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 

Reload OpenSSH:

# Debian or Ubuntu installations   
sudo service ssh reload

# CentOS installations   
sudo service sshd reload 

Confirm that SSH is working by removing your user's SSH key in the UI, adding a new one, and attempting to pull a repo.

默认情况下(我们安装的默认设置),写入authorized_keys文件管理区域>性能优化设置。所以我们取消选中并改用 Gitlab 数据库。

设置索引查找并取消选中 写入 authorized_keys 文件 后,SSH 访问正常。

对于任何使用 Windows 10 而没有其他任何东西适用于 him/her 的人:

在我的例子中,我不得不使用 https 而不是 ssh 克隆回购协议,并且 window 弹出窗口询问我的凭据。 之后一切正常。

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

基础知识

首先了解这里的remote是什么。远程是 GitLab 而你的系统是本地的,所以当我们谈论远程 origin 时,你的 git remote -v 输出中设置的 URL 就是你的远程 URL.

协议

基本上,Git clone/push/pull 主要适用于两种不同的协议(还有其他协议)-

  1. HTTP协议
  2. SSH 协议

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

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

HTTP 协议

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

因此,当您 push/pull/clone、GitLab/GitHub 使用您的用户名和密码验证您的身份并允许您执行操作时。

如果你想试试这个,你可以通过 运行 命令 git remote set-url origin <http-git-url> 切换到 HTTP URL。

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

SSH 协议

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

现在,当您 push/pull/clone 使用 GitLab 时,GIT(SSH 内部)将默认将您的私钥提供给 GitLab 并确认您的身份,然后Git实验室将允许您执行该操作。

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

  1. 生成密钥对`ssh-keygen -t rsa -b 2048 -C "My Common SSH Key"
  2. 生成的密钥对默认在~/.ssh中命名为id_rsa.pub(public密钥)&id_rsa(私钥)。
  3. 您将 public 密钥存储到您的 Git 实验室帐户(同一个密钥可以用于多个或任何 server/accounts)。
  4. 当您 clone/push/pull 时,GIT 提供您的私钥。
  5. GitLab 将私钥与您的 public 密钥匹配并允许您执行。

提示

您应该始终创建至少 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 结果相匹配来解决问题 :)

由于 Windows-10 上的 ssh-agent 冲突,我遇到了这个问题。 如果您也在使用 Windows-10 那么请查看我对此 here

的详细解决方案

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

  1. 你的 ssh-agent 是 运行
  2. 正确的私钥已添加到您的 ssh-agent
  3. 正确的 public 密钥已添加到您的 github 帐户(您可以克隆,所以这一步应该没问题)
  1. 使用 cd path/to/project
  2. 在终端中转到项目目录
  3. 运行 ssh-keygen
  4. 输入输入密码
  5. 运行 cat ~/.ssh/id_rsa.pub 在终端
  6. 复制您在终端获得的密钥
  7. 转到Gitlab/Settings/SSH-KEYS
  8. 粘贴密钥并按添加密钥按钮

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

创建 SSH 密钥后,您只需添加 Public 密钥,通常命名为:

id_rsa.pub

id_ed25519.pub

通过使用 GitLab 的最新工作 URL,即:

https://gitlab.com/-/profile/keys/

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

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

所以在“adminhome/.ssh”文件夹中找不到 ssh 私钥。所以要解决这个问题你可以:

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

这听起来可能很愚蠢,但请确保您的系统和 git 客户端使用相同的 ssh 客户端。这可能是 Windows.

上最相关的

当您安装 Windows 的现代版本时,默认安装 OpenSSH 客户端,当您为 Windows 安装 Git 时,它在内部使用自己的捆绑 ssh 客户端。因此,您需要将 Git for Windows 指向您的 OpenSSH 安装。

对于任何其他第 3 方 ssh 客户端也是如此,我们将在此处将 OpenSSH 作为我们的首选客户端。

  1. Win + R => 命令
  2. where ssh - 如果已安装则获取 OpenSSH 路径
  3. Win + S => 'Edit environment variables ...'
  4. 系统变量 => 查找 GIT_SSH
  5. 编辑或创建,如果不存在,将 OpenSSH 路径设置为它的值
  6. 创建一个新的终端实例,现在应该在其中应用更改,您应该可以开始了。

请注意,如果您使用的是 VS Code 或其他一些具有集成终端的编辑器,那么简单地创建一个新终端并不能解决问题,您需要重新启动编辑器。