【问题标题】:Jenkins: what is the correct format for private key in CredentialsJenkins:凭证中私钥的正确格式是什么
【发布时间】:2019-05-07 06:32:01
【问题描述】:

我正在创建一个在 Windows Server 2016 上运行的 Jenkins 2.152 中的作业,该作业需要从 bitbucket.org 上托管的 git 存储库中提取。 我通过 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 凭证中私钥的预期格式是什么吗?或者也许还有其他的东西我可以检查。

非常感谢任何帮助。

【问题讨论】:

    标签: git jenkins ssh bitbucket


    【解决方案1】:

    以下对我有用

    1. 创建一个文件夹(比如testkey),在文件夹中cd并右键选择git bash

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

    ssh-keygen -f test.key

    1. 复制那个key connect,你可以用记事本打开这个key,然后把那个key粘贴到github。记住 Git 只接受 OPENSSH 密钥。

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

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

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

    2. 转到 Jenkins -> 凭据 -> 添加新凭据。

    7.选择 Kind SSH Username and Key ,提供用户名 ,然后将步骤 5 中复制的 PEM 密钥内容粘贴到私钥中,注意密码是可选的。

    1. 现在像这样为 ssh 添加 repo,

    从 GITHUB 复制的原始 SSL 命令 - git@github.com:test/goto.git

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

    【讨论】:

      【解决方案2】:

      所以只是添加一个答案,将密钥从新的 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 更改密码,但它不介意新密码与旧密码相同(甚至没有),并且在此过程中可以转换格式。

      【讨论】:

        【解决方案3】:

        不知何故我让它再次工作,但解决问题的真正步骤尚不清楚。

        我所做的是再次重新生成 ssh 密钥并将所有内容放到其默认位置。重新上传公钥,替换凭证中的私钥即可开始工作。

        【讨论】:

          【解决方案4】:

          我也收到此错误消息,最终发现 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-----
          
          1. 创建作业并配置存储库路径和凭据,如下所示:

          【讨论】:

            【解决方案5】:

            检查您正在使用的 Windows 版 Git 版本:Starting 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 格式。

            OpenSSH 格式自 2014 年起在 OpenSSH 版本中得到支持,并在源代码分发中的 PROTOCOL.key 文件中进行了描述,它提供了更好的离线密码猜测保护,并支持私钥中的密钥 cmets。
            如有必要,可以通过在生成或更新密钥时将“-m PEM”添加到 ssh-keygen 的参数来编写旧 PEM 样式的密钥。

            【讨论】:

            • 谢谢!我刚刚意识到我尝试使用的 ssh 密钥是在较旧的 Linux 机器上生成的。我会测试并报告。
            • 用这条评论解决了我的问题后,我意识到以前的密钥有一个标题“-----BEGIN OPENSSH PRIVATE KEY-----”,而新的有一个“-----BEGIN RSA 私钥-----"。谢谢@VonC​​pan>
            • 不明白为什么我的钥匙不能工作,谢谢!
            • ...请注意,这不是问题的答案。这是一种帮助用户的尝试,但它没有提供任何有用的信息。
            • @EricBlade 它确实回答了“有人知道 Jenkins 凭证中私钥的预期格式是什么吗?”这个问题。 (来自 OP):PEM,而不是 OpenSSH
            【解决方案6】:

            最后,我找不到将私钥粘贴到 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 并将凭据保留为 None

            这样 Git 和 SSH 将能够在默认位置找到 SSH 密钥,通常是 c:\Users\username.ssh\

            希望这对某人有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-27
              • 1970-01-01
              • 1970-01-01
              • 2013-05-01
              • 1970-01-01
              • 2014-01-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多