Jenkins: 个人凭据中私钥的正确格式是什么

25

我正在Windows Server 2016上运行的Jenkins 2.152中创建一个作业,需要从在bitbucket.org托管的git repo中拉取代码。 我已经通过git-bash测试了ssh密钥,所以我知道它是有效的且没有密码。 但是当我尝试在Jenkins中使用相同的私钥时,出现了错误消息。

Failed to connect to repository : Command "git.exe ls-remote -h 
git@bitbucket.org:mygroup/myrepo HEAD" returned status code 128:
stdout: 
stderr: Load key 
"C:\\Users\\JE~1\\AppData\\Local\\Temp\\ssh2142299850576289882.key": invalid format 
git@bitbucket.org: Permission denied (publickey). 
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

凭据设置如下:

 scope: Global
 user: git
 Private Key -> Enter Directly -> copy and past - generated by ssh-keygen -t rsa in gitbash
 Passphrase: empty
 ID: empty
 description: bitbucket.org

我注意到另一个Windows Jenkins服务器上,私有密钥每行的字符数不同。

有人知道Jenkins凭据中私钥的预期格式吗?或者也许有其他事情我可以检查。

非常感谢任何帮助。

7个回答

20
检查您正在使用的Git for Windows版本:从2.19.2开始,它附带了OpenSSH v7.9p1(之前是7.7)。
而且...openssh 7.8刚刚更改了默认的ssh-keygen格式,从经典的PEM 64个字符到OPENSSH 70个字符!
只有ssh-keygen -m PEM -t rsa -P "" -f afile会生成旧格式(-m PEM)。

ssh-keygen(1):

默认情况下,写入OpenSSH格式私钥,而不是使用OpenSSL的PEM格式。

自2014年以来,在OpenSSH发布中受支持并在源分发中的PROTOCOL.key文件中描述的OpenSSH格式,提供了更好的离线密码猜测保护,并支持私钥中的密钥注释。
如果需要,在生成或更新密钥时将“-m PEM”添加到ssh-keygen的参数中,可以编写旧的PEM样式密钥。


谢谢!我刚意识到我正在尝试使用的ssh密钥是在旧的Linux机器上生成的。我会测试并回报。 - Bart C
6
在看到这条评论解决了我的问题后,我意识到之前的密钥标题是 "-----BEGIN OPENSSH PRIVATE KEY-----" 而现在的密钥标题是 "-----BEGIN RSA PRIVATE KEY-----"。感谢 @VonC。 - Can YILDIZ
2
不理解为什么我的密钥不起作用,感谢您的帮助! - Ewert
请注意,这不是对问题的回答。它是为了帮助用户,但并没有提供有用的信息。 - Eric Blade
1
@EricBlade,它回答了“有人知道Jenkins凭据中私钥的预期格式是什么吗?”(来自OP)的问题:PEM格式,而不是OpenSSH。 - VonC

19

我也遇到了这个错误消息,最终发现 Jenkins 凭据应该是 RSA 密钥而不是公钥。以下是我配置 Jenkins 从 Bitbucket 克隆的步骤:

  1. 在 Jenkins 凭据中添加凭据
   Kind: SSH username and private key
   Scope: Global
   Username: <my username in bitbucket>
   Private key: <Enter directly>
         -----BEGIN RSA PRIVATE KEY-----
         ......
         -----END RSA PRIVATE KEY-----
请按照以下方法创建一个作业,并将存储库路径和凭据配置如下:

enter image description here


8
最终,我没找到在Jenkins凭证中粘贴私钥的方法。虽然这对许多人来说可能是常识,但我还是决定提供下面的解决方法。以下是我作为解决方式从Bitbucket.org拉取我的私有存储库的步骤:
  1. 以运行Jenkins服务的用户身份登录Windows主机。在我的情况下,Jenkins服务作为专用用户运行,因为我需要访问仅限于该用户的写权限网络共享。
  2. 打开Git-bash并使用ssh-keygen命令生成SSH密钥,接受所有默认值。
  3. 在Jenkins中,将git repo URL输入为 git@bitbucket.org:team_name/repo_name,将凭据留为空白。
这样Git和SSH就能够在默认位置(通常为c:\Users\username.ssh\)找到SSH密钥。
希望这对某些人有所帮助。

5

所以,为了添加一个答案来实际将新的OPENSSH格式的密钥转换为旧的PEM格式:

$ ssh-keygen -f blah.key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in blah.key.
Your public key has been saved in blah.key.pub.
The key fingerprint is:
SHA256:ndMFvZjbD7M3MoqFy8+me74gPhcuoDVLF2/Oh+hXQ8I perbelding@erpelbook4.local
$ head -n 1 blah.key
-----BEGIN OPENSSH PRIVATE KEY-----
$ ssh-keygen  -f blah.key -m PEM -p
Key has comment 'redacted'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.
$ head -n 1 blah.key
-----BEGIN RSA PRIVATE KEY-----

ssh-keygen -p 可以更改私钥的密码,但它并不在意新密码与旧密码相同(甚至为无)并且在此过程中可以转换格式。


2

以下方法适用于我:

  1. 创建一个文件夹(例如testkey),进入该文件夹,右键并选择git bash

  2. 现在,在git bash中使用以下命令创建OPENSSH密钥。这里的test.key是您的OPENSSH密钥的名称(请注意,密码短语是可选的)

ssh-keygen -f test.key

  1. 复制该密钥连接,您可以使用记事本打开该密钥,并将该密钥粘贴到github中。请记住,Git仅接受OPENSSH密钥。

enter image description here

  1. 现在将该密钥转换为PEM格式,在同一个bash窗口中运行以下命令(请注意,密码是可选的)

ssh-keygen -f test-pem.key -m PEM -p

  1. 现在密钥已转换为PEM密钥,请使用记事本复制密钥内容。

  2. 进入Jenkins -> 凭据 -> 添加新凭据。

enter image description here

7. 选择 SSH 用户名和密钥类型,提供用户名,并将在步骤5中复制的PEM密钥内容粘贴到私钥中,注意口令是可选的。

enter image description here

现在像这样添加SSH的repo,

Original SSL Command Copied from GITHUB - git@github.com:test/goto.git

change it to  - ssh://git@github.com/test/goto.git

0

不知怎么的,我又让它正常工作了,但是真正解决问题的步骤不太清楚。

我所做的是重新生成 ssh 密钥并将所有内容放回到默认位置。重新上传公钥,在凭据中替换私钥,然后它就开始工作了。


0

您使用从一台机器生成的id_rsa(私钥),然后在另一个Windows操作系统上进行身份验证时,请务必检查此文件的行分隔符是LF-Unix(\n)还是CRLF-Windows(\r\n)。如果您使用带有CRLF-Windows(\r\n)的此文件,请转换为LF-Unix(\n)。要验证此文件,您可以使用Notepad++或Note pad。 要转换为LF-Unix(\n),请在命令提示符上运行以下命令: "C:\Program Files\Git\usr\bin\dos2unix.exe" C:\users\your_profile.ssh\id_rsa image of private key with Line Separator


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