在 Ubuntu 上使用 Jenkins 用户从 GitHub 获取代码时出现“权限被拒绝(公钥)”的错误提示。

36

这是我的设置:

  1. Jenkins作为'jenkins'用户在我的Linux机器上运行。
  2. 我已经按照Linux - 设置Git的说明,为'jenkins'用户生成了SSH密钥对。
  3. 当我使用sudo su jenkins并尝试ssh-vT git@github.com时,总是要求我输入密码,但我最终总是得到了认证。(详细选项会显示使用的哪个密钥,以及其他信息)。
  4. 我可以使用Jenkins从GitHub克隆我的存储库:

如下所示:

jenkins@alpm:~/jobs/test git/workspace$ git pull 
Enter passphrase for key '/var/lib/jenkins/.ssh/id*_rsa':
Already up-to-date.

到目前为止,我已经严格按照指示操作。问题是,Jenkins作业遇到以下错误:

status code 128:
stdout: 
stderr: Permission denied (publickey).
fatal: The remote end hung up unexpectedly
这与我输错密码短语时遇到的错误相同(当然,Jenkins不会要求我输入密码短语)。以下页面: 告诉我ssh-agent可以帮助记住密码短语,当我使用自己的用户时它确实可以,但对于jenkins id则不行。请注意,以我的普通用户身份运行时会产生以下结果:
echo "$SSH_AUTH_SOCK"
/tmp/keyring-nQlwf9/ssh

当使用我的 'jenkins' 帐户运行相同的命令时,没有任何输出(甚至没有权限被拒绝)。

我认为问题是密钥短语没有被记住。 你有什么想法吗? 我应该为 jenkins 用户启动 ssh-agent 或密钥环管理器吗?如何启动? 还是在转发到同一台机器时使用 ssh 转发更合适? 还有其他更好的想法吗?

ps:我从未使用 sudo gitted,我总是使用 jenkins 或我的用户帐户(正如在这篇 SO 帖子中提到的 - Ubuntu/GitHub SSH Key Issue


1
尝试使用“Jenkins”用户创建一个.ssh密钥,这是秘诀。 - Luiz E.
3
实际上起作用的不是使用jenkins用户创建ssh密钥,虽然这是必要的,但还不足够。有帮助的是将密码留空(因此不需要输入密码)。 - pimajor
1
那么,它是否工作了呢?请用简短的回答(而不是评论)描述问题是如何解决的。谢谢! - Gonen
尝试这个 https://dev59.com/labja4cB1Zd3GeqPcS18#55469070 - Remigiusz
9个回答

50

由于几个月来没有人从评论中写出答案,我将快速提供解决方案。

有两个可能的问题/解决方案:

  1. id_rsa 用错误的用户创建

    使用 jenkins 用户创建 id_rsa (参见 hudson无法从git仓库获取)

  2. 将密码短语留空


为什么创建密钥对的用户很重要? - Richard
1
因为每个用户都有自己的 .ssh 文件夹,其中存储了密钥。用户 jenkins 使用他自己在 ~/.ssh/id_rsa 中的 ssh 密钥连接到 github。如果您使用自己的用户创建它们,则 jenkins 将不会使用它们,但仍将使用他自己的 ssh 密钥。 - Patrick Boos
1
那本来需要一段时间才能弄清楚,但是一旦你想到了,其实很明显。非常感谢! - binarygiant
创建另一个用户的id_rsa,将其移动到所需用户的文件夹并对其进行chown设置,这样不就足够了吗? - Tzen
2
留空口令解决了问题,使用口令时我遇到了上述错误。谢谢! - lukass77

15

总结在Jenkins服务器上必须完成的任务:

# 1. Create the folder containing the SSH keys if necessary
if [ ! -e ~jenkins/.ssh ]; then mkdir ~jenkins/.ssh; fi
cd ~jenkins/.ssh/

# 2. Create the SSH pair of keys
# The comment will help to identify the SSH key on target systems
ssh-keygen -C "jenkins" -f ~jenkins/.ssh/id_rsa -P ""

# 3. Assign the proper access rights
chown -R jenkins ~jenkins/.ssh/
chmod 700 ~jenkins/.ssh
chmod 600 ~jenkins/.ssh/*

请注意:

  • 生成密钥时,请保留默认的“id_rsa”名称,不要使用其他名称,例如“id_rsa_jenkins”,即使正确设置也无法使用。
  • 不要为您的密钥使用密码
  • 检查公钥(id_rsa.pub)是否已上传到git服务器(GitHub、Bitbucket等)。完成后,运行以下命令测试您的SSH密钥:ssh -vvv git@github.com (根据您的git服务器更改地址)

兄弟,你救了我的一天!我一直在苦苦挣扎这个设置,但其他方法都不起作用。在这里它像魔法一样运行。 - Paulo Pedroso
请在生成密钥时保持默认的“id_rsa”名称,其他名称如“id_rsa_jenkins”将无法工作,即使正确设置也是如此。这解决了我的问题。非常重要。谢谢! - Kevin Milner

10

当我创建密钥时,我通过简单地将密码留空来解决了这个问题。


4
已确认。这意味着尽管Jenkins拥有具有UI的凭据存储库,用于输入密码短语,但它无法处理SSH密钥上的密码短语。这是一个安全漏洞。https://issues.jenkins-ci.org/browse/JENKINS-20879 - bbaassssiiee
将Jenkins中的SSH和Git插件更新到最新版本后,问题得到了解决。看起来这个问题在2017年就已经被修复了。 - Bjørn Stenfeldt

5
我想补充一点,如果您是手动创建的密钥,则可能仍然由您拥有,而不可读取于jenkins,请尝试:
sudo chown jenkins -R /var/lib/jenkins/.ssh/*

在 Jenkins 用户上进行一些检查,$ su jenkins 然后测试 Git 连接 ssh -T git@xxx-server. - syyu

3

请确认以下内容:

  1. 公钥(id_rsa.pub)是否已上传至git服务器。
  2. 检查jenkins用户是否能够访问github -> 检查是否将正确的私钥(id_rsa)复制到了/var/lib/jenkins/.ssh/目录下。
  3. 是否在~/.ssh目录下创建了known_hosts文件。尝试使用ssh -vvv git@github.com命令查看调试日志。如果一切正常,github.com会被添加到known_hosts中。
  4. 确认id_rsa权限是否设置为755(chmod 755 id_rsa)。

完成以上检查后,请尝试ssh -vvv git@github.com命令进行验证。 在ssh成功前,请不要在jenkins中进行配置!


2
对于Mac用户,可以通过按照以下步骤删除现有密钥并创建新的私钥和公钥来解决问题:
1. 删除位于 /Users/用户名/.ssh 的所有公钥和私钥 2. 在Jenkins的Credentials选项卡中删除所有已保存的凭据。
3. 删除Github存储库设置中定义的现有公共SSH密钥
4. 按照https://confluence.atlassian.com/bitbucketserver/creating-ssh-keys-776639788.html#CreatingSSHkeys-CreatinganSSHkeyonLinux&MacOSX的说明,创建新的SSH密钥(私钥和公钥:id_rsa和id_rsa.pub)
5. 在Github或等效存储库设置中设置新创建的公共SSH密钥(id_rsa.pub)。
6. 在Jenkins中,通过添加私钥(id_rsa)为你的Github用户名的凭据创建新的凭据 7. 此错误现在应该已经被解决。

2

如果你正在Windows中以服务形式运行Jenkins,你需要验证运行服务的用户。如果你使用"MACHINENAME\user"用户创建了密钥,请更改服务,以便运行该服务的用户匹配。


1

需要从Jenkins用户生成密钥。

sudo su jenkins
ssh-keygen

生成密钥后,应将其作为SSH密钥添加到Bitbucket或Github中。

0

我通过创建带有私钥的凭据来解决了这个问题。这样一来,我就不需要担心操作系统中私钥文件的权限问题。

  1. 创建新的凭据类型为“SSH用户名和私钥”。
  2. 提供Github用户ID。
  3. 选中单选按钮“私钥 -> 直接输入”,然后点击添加按钮将私钥文件内容从操作系统(.ssh/id_rsa)复制粘贴并保存。

现在在流水线中,提供带有SSH的Github仓库URL,并选择这个新的凭据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接