为啥 Jenkins 在启动代理时说“服务器拒绝了 1 个私钥”?

Posted

技术标签:

【中文标题】为啥 Jenkins 在启动代理时说“服务器拒绝了 1 个私钥”?【英文标题】:Why Jenkins says "Server rejected the 1 private key(s)" while launching the agent?为什么 Jenkins 在启动代理时说“服务器拒绝了 1 个私钥”? 【发布时间】:2017-06-03 17:39:27 【问题描述】:

我可以使用 SSH 成功连接到远程机器,但是当我从 Jenkins 启动代理时,它会引发以下错误:

ERROR: Server rejected the 1 private key(s) for user1 (credentialId:xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/method:publickey)
[01/19/17 05:35:15] [SSH] Authentication failed.
hudson.AbortException: Authentication failed.
    at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1219)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:714)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:709)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[01/19/17 05:35:15] Launch failed - cleaning up connection
[01/19/17 05:35:15] [SSH] Connection closed.

我可以使用 user1 建立从主机到节点机器的 SSH 连接,但是当我尝试使用来自 jenkins 的 user1 启动代理时,它会拒绝私钥。有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

我按照以下步骤解决了这个问题:

从目标从节点的控制台

    切换到root用户:
sudo su
    添加一个 jenkins 用户,主目录为 /var/lib/jenkins(注意:我将主目录保存在 /var/lib/jenkins):
useradd -d /var/lib/jenkins jenkins

来自 Jenkins 大师

Jenkins 用户复制 /var/lib/jenkins/.ssh/id_rsa.pub 密钥到 master

从目标从节点的控制台

    为 Jenkins 用户创建一个 authorized_keys 文件
mkdir /var/lib/jenkins/.ssh
touch /var/lib/jenkins/.ssh/authorized_keys

    将来自 Jenkins master 的密钥粘贴到文件 vim 中。使用:wq!保存

    确保文件拥有正确的所有者和权限。

chown -R jenkins /var/lib/jenkins/.ssh
chmod 600 /var/lib/jenkins/.ssh/authorized_keys
chmod 700 /var/lib/jenkins/.ssh

【讨论】:

在第一次运行时,Jenkins 需要将 remoting.jar 复制到 /var/lib/jenkins,因此 jenkins 用户也必须是 /var/lib/jenkins 目录的所有者。此答案中提到的所有内容都是正确的,但就我而言,我必须另外执行以下命令:chown -R jenkins /var/lib/jenkins 如果您使用 Fedora 或类似的发行版(例如 RHEL),请不要在您的 SSH 服务器上禁用 PAM 身份验证。检查文件/etc/ssh/sshd_config 并确保您拥有UsePAM yes。我通过运行sudo systemctl status sshd 并看到有关它的警告发现了这一点。该文件本身试图帮助我:# WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.. @psq 非常感谢。我已经尝试了每一个配置如何......我绝望地撞到墙上,你的解决方案对我帮助很大。 P.s 我正在使用 oraclelinux。【参考方案2】:

我通过以下步骤解决了这个问题:

1) 确保您在从机和主机上都处于正确的路径上。您还需要使用正确的用户登录机器。假设我需要创建一个新的全局 jenkins 用户“jenkins”并且我希望我的密钥位于路径“/home/jenkins/.ssh/”中,首先将“jenkins”用户添加到机器中。

2) 现在创建 .ssh 文件夹并使用https://support.cloudbees.com/hc/en-us/articles/222978868-How-to-Connect-to-Remote-SSH-Slaves-中给出的步骤生成 ssh 密钥

3) 确保在您的主机中执行上述步骤 - 1 和 2

4) 您需要在同一路径中的主从计算机中拥有 ssh 密钥,并具有相同的“jenkins”用户权限。

5) 最后,来回 SSH 两台机器 IP 以检查终端的双向连接。

6) 配置 jenkins 凭据和节点。确保在节点配置中提供相同的远程根目录 - “/home/jenkins”,并选择“手动可信密钥验证策略” - 如https://linuxacademy.com/community/posts/show/topic/16008-jenkins-adding-a-slave中所建议的那样

【讨论】:

【参考方案3】:

我的解决方案是:

$ user add -d /var/lib/jenkins jenkins
$ sudo su
$ passwd jenkins
$ chown -R jenkins /var/lib/jenkins/.ssh/*
$ chmod 700 .ssh

篡改了2小时后它工作了......

【讨论】:

不知道为什么你被否决了 - jenkins 用户的 chown 更改正是让我着迷的原因,而且在我自己弄清楚这一点之前已经很长时间了。谢谢!【参考方案4】:

主人需要为我添加已知主机列表。 您需要做的是从本地通过 SSH 连接到主服务器。然后使用 master 私钥 SSH 到 slave。如果您可以手动执行此操作,那么 Jenkins 也将能够执行此操作。

我在 Jenkins 中使用主私钥作为凭证,遵循@Aamir 的回答,终于取得了一些成功。

【讨论】:

以上是关于为啥 Jenkins 在启动代理时说“服务器拒绝了 1 个私钥”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Jenkins Docker 代理中使用测试容器:容器无法启动,NoRouteToHostException

Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项

Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办?

Jenkins新建节点,启动方式没有“通过Java Web启动代理”选项怎么办?

jenkins为啥只打印maven的构建日志,不显示项目启动日志?

为啥我们在 SqLite 中读取内容时说 id,但在创建/更新/删除行时说 'id'?