如何为詹金斯设置 ssh 密钥以通过 ssh 发布

Posted

技术标签:

【中文标题】如何为詹金斯设置 ssh 密钥以通过 ssh 发布【英文标题】:how to setup ssh keys for jenkins to publish via ssh 【发布时间】:2016-09-16 19:50:20 【问题描述】:

Jenkins 需要证书才能使用 ssh 发布和 ssh 命令。可以在"manage jenkins" -> "Configure System"-> "publish over ssh"下配置。

问题是:如何创建证书?

我有两台 ubuntu 服务器,一台运行 Jenkins,一台运行应用程序。

我是设置 Jenkins 证书并将其一部分放在部署盒上,还是将其设置在部署盒上,并将其一部分放在 Jenkins 上?证书是否需要以名为 Jenkins 的用户的名义使用,或者可以用于任何用户?我们在开发框中没有 Jenkins 用户。

我知道有许多不兼容的 ssh 类型,Jenkins 需要哪些?

有没有人找到关于如何设置这一切的指南(如何生成密钥,将它们放在哪里等)?

【问题讨论】:

【参考方案1】:

您需要在 Jenkins 服务器上以 Jenkins 用户的身份创建一个公钥/私钥,然后将公钥复制到您想要在目标服务器上进行部署的用户。

第一步,在构建服务器上以用户jenkins生成公钥和私钥

build1:~ jenkins$ whoami
jenkins
build1:~ jenkins$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa): 
Created directory '/var/lib/jenkins/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
[...] 
The key's randomart image is:
[...]
build1:~ jenkins$ ls -l .ssh
total 2
-rw-------  1 jenkins  jenkins  1679 Feb 28 11:55 id_rsa
-rw-r--r--  1 jenkins  jenkins   411 Feb 28 11:55 id_rsa.pub 
build1:~ jenkins$ cat .ssh/id_rsa.pub
ssh-rsa AAAlskdjfalskdfjaslkdjf... jenkins@myserver.com

第 2 步,将 pub 文件内容粘贴到目标服务器上。

target:~ bob$ cd .ssh
target:~ bob$ vi authorized_keys (paste in the stuff which was output above.)

确保您的 .ssh 目录的权限为 700,而您的 authorized_keys 文件的权限为 644

第三步,配置Jenkins

    在 jenkins Web 控制面板中,导航到“管理 Jenkins”->“配置系统”->“通过 SSH 发布” 要么输入文件的路径,例如“var/lib/jenkins/.ssh/id_rsa”,或粘贴与目标服务器上相同的内容。 输入您的密码、服务器和用户详细信息,一切顺利!

【讨论】:

“通过 SSH 发布”在我的詹金斯中不存在 @BigDong 是插件,安装后会出现 @infosecDaemon 见wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin 对于任何想知道如何让 whoami 返回用户 jenkins 的人:以其他用户身份登录后,请执行 su -s /bin/bash jenkins。只做su jenkins 是行不通的,因为jenkins 默认没有shell。 如果您在使用 jenkins 密码时遇到问题,请使用 sudo su jenkins ..这只会询问 sudo 密码(root 密码)【参考方案2】:

您不需要在 Jenkins 服务器上创建 SSH 密钥,也不需要将 SSH 密钥存储在 Jenkins 服务器的文件系统上。在可能频繁创建和销毁 Jenkins 服务器实例的环境中,这一点信息至关重要。

生成 SSH 密钥对

在任何机器上(Windows、Linux、MacOS ... 没关系)生成一个 SSH 密钥对。以本文为指导:

GitHub: Generating a new SSH key and adding it to the ssh-agent(您可以跳过“将 SSH 密钥添加到 ssh-agent”部分)

在目标服务器上

在目标服务器上,您需要将 public 密钥的内容(id_rsa.pub 根据上述文章)放入 Jenkins 用户主目录下的 .ssh/authorized_keys 文件中将用于部署。

在詹金斯

使用“通过 SSH 发布”插件

参考:https://plugins.jenkins.io/publish-over-ssh/

访问:Jenkins > Manage Jenkins > Configure System > Publish over SSH

如果私钥已加密,则您需要在“密码”字段中输入密钥的密码,否则不要理会。​​li> 将“密钥路径”字段留空,因为当您使用粘贴的密钥时,该字段将被忽略(下一步) 复制并粘贴 private 密钥的内容(id_rsa 根据上述文章)到“密钥”字段中 在“SSH 服务器”下,为您的目标服务器“添加”一个新的服务器配置。

使用存储的全局凭据

访问:Jenkins > Credentials > System > Global credentials (unrestricted) > Add Credentials

种类:“带有私钥的 SSH 用户名” 范围:“全球” ID:[为此键创建唯一 ID] 描述:[可选,输入描述] 用户名:[用户名 JENKINS 将用于连接到远程服务器] 私钥:[选择“直接输入”] Key:[粘贴 private 密钥的内容(id_rsa 根据上述文章)] Passphrase:[输入密钥的密码,如果密钥未加密,则留空]

【讨论】:

【参考方案3】:

对于 Windows:

    在 Jenkins 中为存储库安装必要的插件(例如:GitHub install GitHub 和 GitHub Authentication plugins)。 您可以使用 Putty 密钥生成器生成密钥,或者在 git bash 中运行以下命令:$ ssh-keygen -t rsa -b 4096 -C your_email@example.com 私钥必须是 OpenSSH。您可以在 putty 密钥生成器中将您的私钥转换为 OpenSSH SSH 密钥成对出现,公共和私有。公钥插入到要克隆的存储库中。私钥在 Jenkins 中保存为凭据 您需要复制 SSH URL 而不是 HTTPS 才能使用 ssh 密钥。

【讨论】:

以上是关于如何为詹金斯设置 ssh 密钥以通过 ssh 发布的主要内容,如果未能解决你的问题,请参考以下文章

如何为同一主机的多个 gitlab 帐户使用多个 ssh 密钥[重复]

如何为 Github 帐户和 Bitbucket 公司帐户添加多个 SSH 密钥

如何为另一个用户生成 ssh 密钥?

如何为本地 git (github) 存储库永久添加 SSH 密钥? [复制]

如何为 jenkins git 插件指定 ssh 密钥

标准错误:主机密钥验证失败 | GitHub |詹金斯 |视窗