Jenkins git插件自签名证书

时间:2017-11-03 14:21:27

标签: git ssl github jenkins

我目前正在尝试让Jenkins构建托管在GitHub企业存储库中的项目。我们正在为GitHub服务器使用自签名证书,这会导致一些问题。

我能解决的大部分问题都是:

git命令行:
获取PEM格式的证书并教git使用.config文件查找信息:

[http "https://github.*******************.com"]
    sslCAInfo = "path\\to\\selvSignedCerts\\fileName.pem"
    sslCAPath = "path\\to\\selvSignedCerts\\"
    sslVerify = true

Jenkins GitHub插件:
将证书信息添加到java cacerts密钥库:

keytool -import -trustcacerts -alias myAlias 
   -keystore "%JenkinsInstallDir\jre\lib\security\cacerts"
   -file "myCertsInfo.pem"

在将信息导入密钥库后重新启动Jenkins终于完成了这一操作,因此我可以在中配置GitHub Enterprise服务器 管理Jenkins - >配置系统 - > GitHub企业服务器 - > API端点

由于以下原因,以前无法进行此配置:

SSL certificate problem: self signed certificate in certificate chain

现在,我的git命令行很高兴,Jenkins的GitHub插件很高兴,这意味着Jenkins本身很高兴,但git-client插件显然不是。

我在jenkins中创建了 GitHub Organizations 作业,指定了企业服务器上组织的链接。配置使用在全局jenkins设置中配置的API端点,使用配置的凭据并查找具有默认名称 Jenkinsfile

的管道文件

作业能够执行结帐,它识别两个分支,并在每个分支中找到相应的Jenkins文件。它还使用Jenkinsfile配置为每个分支自动创建了一个新作业。

jenkinsfile目前看起来像这样:

#!/usr/bin/env groovy

pipeline {
  agent any
  stages {
    stage('Scan for new jobs') {
      steps {
        echo 'Scanning...'
      }
    }
    stage('Build') {
      steps {
        echo 'Build'
      }
    }
  }
}

现在,管道中的第一步是隐式scm结账。这会失败,输出如下所示:

14:01:27 Connecting to https://github.*********.com/api/v3 using <userId>/******
Obtained Jenkinsfile from <commitHash>
[Pipeline] node
Running on Jenkins in D:\****\Jenkins\****\workspace\****
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
 > C:\Program Files\Git\bin\git.exe rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > C:\Program Files\Git\bin\git.exe config remote.origin.url https://github.****.com/***/***.git # timeout=10
Fetching without tags
Fetching upstream changes from https://github.****.com/***/***.git
 > C:\Program Files\Git\bin\git.exe --version # timeout=10
using GIT_ASKPASS to set credentials 
 > C:\Program Files\Git\bin\git.exe fetch --no-tags --progress https://github.****.com/***/***.git +refs/heads/develop:refs/remotes/origin/develop
ERROR: Error fetching remote repo 'origin'
hudson.plugins.git.GitException: Failed to fetch from https://github.****.com/***/***.git
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:825)
    at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1092)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1123)
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:113)
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:85)
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:75)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
    at hudson.security.ACL.impersonate(ACL.java:260)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: hudson.plugins.git.GitException: Command "C:\Program Files\Git\bin\git.exe fetch --no-tags --progress https://github.****.com/***/***.git +refs/heads/develop:refs/remotes/origin/develop" returned status code 128:
stdout: 
stderr: fatal: unable to access 'https://github.****.com/***/***.git/': SSL certificate problem: self signed certificate in certificate chain

    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1970)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1689)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$300(CliGitAPIImpl.java:71)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:380)
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:823)
    ... 13 more
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

所以错误再次出现:

stderr: fatal: unable to access 'https://github.****.com/***/***.git/': SSL certificate problem: self signed certificate in certificate chain

现在看来,git-client插件(或git插件?)看起来似乎不是在 lib \ security \ cacerts 的密钥库中,而且看起来也不像关心 .gitconfig 文件。

现在我的问题是,这个插件在哪里寻找有效的证书?或者还有什么我没有得到的?

所有关于此问题或类似问题的研究都会导致将证书添加到java密钥库中,我已经这样做了。我没有找到指向正确方向的任何其他信息。大多数我都在想,为什么 GitHub Organizations 工作可以很好地处理存储库,检测所有分支,检出并处理 Jenkinsfile 和其他工作(I&# 39;我还手动创建了一个自由式作业来检查它是否可以检查回购 - 具有相同的负面结果)仍然无法访问由于自签名证书问题的回购...

环境:(Jenkins正在运行)
Windows 7 x64
git version 1.9.4.msysgit.0
詹金斯版本:2.73.2
Java JRE:1.8.0_144-b01
插件:
git 3.6.3
git-client 2.6.0
git-server 1.7
github 1.28.1
github-api 1.90

1 个答案:

答案 0 :(得分:1)

好的,我找到了答案。 进程监控来救援!

使用Process Monitor我可以看到 git.exe 在构建我的小型自由式项目时正在读取gitconfig文件。
现在,令我惊讶的是,在用户目录(也就是全局配置)中读取 .gitconfig ,而在系统(也就是系统配置)下读取 .gitconfig 读取位于以下位置的.gitconfig文件:

C:\Program Files\Git\mingw64\etc\.gitconfig

此文件的原始内容如下:

[http]
    sslCAInfo = C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
    sslBackend = openssl
[diff "astextplain"]
    textconv = astextplain
[credential]
    helper = manager

在添加有关我的自签名证书信息的信息后,如上所示,内容现在是:

[http]
    sslCAInfo = C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
    sslBackend = openssl
##################################
# Self Signed Server Certificate
[http "https://github.****.com"]
    sslCAInfo = "path\\to\\selvSignedCerts\\fileName.pem"
    sslCAPath = "path\\to\\selvSignedCerts\\"
    sslVerify = true
[diff "astextplain"]
    textconv = astextplain
[credential]
    helper = manager

瞧 - 自由式作业和Jenkinsfile定义的自动生成的作业成功结束了回购并成功构建。

希望这可以帮助其他人通过自签名证书经历这样的痛苦 但主要提示:停止使用自签名证书!购买官方产品会更便宜! (将不得不与我们的IT部门交谈......)