如何为Jenkins设置SSH密钥以通过SSH发布?

40
Jenkins要使用ssh发布和ssh命令需要证书,可以在“管理Jenkins”->“配置系统”->“通过ssh发布”下进行配置。
问题是:如何创建证书?
我有两个Ubuntu服务器,一个运行Jenkins,另一个运行应用程序。
我是在部署盒子上设置Jenkins证书并将其部分放在上面,还是在部署盒子上设置证书并将其部分放在Jenkins上?证书是否需要以名为Jenkins的用户的名字命名,还是可以为任何用户?我们在开发盒子上没有Jenkins用户。
我知道有许多不兼容的ssh类型,Jenkins需要哪些?
有人找到了如何设置所有这些内容(生成密钥的方法,放置它们的位置等)的指南吗?
5个回答

61

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

步骤1:以用户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

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

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

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

步骤 3,配置 Jenkins

  1. 在 Jenkins 网页控制面板中,转到“Manage Jenkins”->“Configure System”->“Publish over SSH”
  2. 要么输入文件的路径,例如“var/lib/jenkins/.ssh/id_rsa”,要么粘贴与目标服务器上相同的内容。
  3. 输入您的口令短语、服务器和用户详细信息,然后就可以开始使用了!

16
“Publish over SSH” 在我的Jenkins中不存在。 - Dimitri Kopriwa
3
@BigDong 这是一个插件,安装后它会出现。 - Julian Go
1
@infosecDaemon 请查看 https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin。 - Leszek Jasek
16
如果有人想知道如何让whoami返回用户jenkins:当您已经以另一个用户登录后,请执行 su -s /bin/bash jenkins。仅执行su jenkins不起作用,因为jenkins默认没有shell。 - Nagev
1
如果您在使用Jenkins密码时遇到问题,请使用sudo su jenkins命令。这将只要求sudo密码(root密码)。 - Sadha Nanda
显示剩余7条评论

9

您无需在Jenkins服务器上创建SSH密钥,也无需将SSH密钥存储在Jenkins服务器的文件系统中。这个信息对于Jenkins服务器实例可能经常被创建和销毁的环境非常关键。

生成SSH密钥对

在任何机器上(Windows、Linux、MacOS...都可以)生成SSH密钥对。可以使用本文作为指南:

在目标服务器上

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

在Jenkins中

使用“发布通过SSH”插件

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

访问:Jenkins > 管理Jenkins > 配置系统 > 发布通过SSH

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

使用存储的全局凭证

访问:Jenkins > 凭证 > 系统 > 全局凭证(不受限制) > 添加凭证

  • 类型: "具有私钥的SSH用户名"
  • 作用域: "全局"
  • ID: [创建唯一ID来标识此密钥]
  • 描述: [可选,输入描述信息]
  • 用户名: [Jenkins将用于连接远程服务器的用户名]
  • 私钥: [选择“直接输入”]
  • 密钥: [粘贴私钥的内容(根据上述文章中的id_rsa)]
  • 密码: [输入密钥的密码,如果密钥未加密,则留空]

5

针对 Windows 操作系统:

  1. 在 Jenkins 中安装与仓库所需插件(例如 Github 安装 Github 和 Github Authentication 插件)
  2. 您可以使用 Putty key generator 生成密钥,或者在 git bash 中运行以下命令:$ ssh-keygen -t rsa -b 4096 -C your_email@example.com
  3. 私钥必须为 OpenSSH 格式。您可以使用 Putty key generator 将私钥转换为 OpenSSH 格式。
  4. SSH 密钥是公私钥对,公钥用于仓库克隆,私钥则保存为 Jenkins 凭据。
  5. 为了使用 SSH 密钥,您需要复制 SSH URL 而不是 HTTPS URL。

0
在设置关键凭据时,它需要的用户名是“jenkins”,然后我们需要切换到该用户(在cli中)以生成密钥对,使git连接正常工作。
以下是步骤:
1. 切换到jenkins用户 sudo su - jenkins -s /bin/bash
2. 生成密钥对 ssh-keygen
3. 如描述一样,在jenkins中配置私钥
4. 在部署密钥部分上,在git存储库侧配置公钥
5. 测试连接,应该可以正常工作。
注意:这些步骤适用于本地机器上的jenkins,ubuntu 20.04。

测试连接可以通过在Jenkins用户上下文中执行命令ssh -T git@github.com来进行。 - George Pligoropoulos

0
在Jenkins升级到2.412之后,RSA密钥无法工作,而通过SSH进行文件传输的插件也无法工作。 为了使其正常工作,请生成ECDSA SSH密钥。
ssh-keygen -t ecdsa -m PEM -f key_name

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