当前位置: 首页 > 面试题库 >

Jenkins git插件自签名证书

潘琪
2023-03-14
问题内容

我目前正在尝试让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终于成功了,因此我能够在
Manage Jenkins- > Configure System-> GitHub Enterprise Servers-> API
Endpoint中配置GitHub Enterprise服务器

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

SSL certificate problem: self signed certificate in certificate chain

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

我已经在jenkins中创建了 GitHub Organizations*
作业,并指定了到企业服务器上组织的链接。该配置使用在全局jenkins设置中配置的API端点,使用已配置的凭据并查找默认名称为
Jenkinsfile 的管道文件
*

该作业能够执行检出,它识别两个分支,并在每个分支中找到对应的Jenkinsfile。它还使用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
和其他作业(我还手动创建了一个freestyle作业,以检查它是否可以检出存储库-具有相同否定结果)由于 自签名证书 问题仍无法访问该回购…

环境:( 运行Jenkins)
Windows 7 x64
git版本1.9.4.msysgit.0
Jenkins版本: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


问题答案:

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

使用进程监视器,我可以看到,该 git.exe 正在读一本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部门联系…)



 类似资料:
  • 我尝试使用自签名证书在HTTPS连接上向SonarQube实例启动maven sonar:sonar。Maven给我这个错误: [错误]无法执行目标org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:项目data.model上的sonar(default-cli):无法执行SonarQube:无法从服务器获取引导索引:sun.sec

  • 我的手被https、ssl、PKI之类的东西弄得脏兮兮的。对于自签名证书,有一点我不太理解。假设我想创建一个自签名证书,并在我们想要建立安全连接时将其发送给我的朋友。 所以步骤是: 创建一个私钥。 创建一个公钥。 用我的公钥在证书上签名。 因此,当我的朋友得到我的证书时,他必须验证他得到的证书是我的,他需要解密数字签名。但为了解密和验证他必须拥有我的私钥。所以,我有点困惑。

  • 问题内容: 我想签署我的应用程序,但是我不希望它的用户在安装我的应用程序之前在他们的手机上安装证书。是否可以使用自签名证书对j2me midlet进行签名? 问题答案: 这是可能的,为此您需要从Verisign购买签名证书。我确实有相同的签名证书,费用为20000卢比(一次)。

  • 我正在尝试从我的android应用程序访问HTTPS url。我有服务器端的自签名证书(server_certificate.cer)。 我想知道如何添加自签名证书到volley网络请求信任我的自签名证书。使用http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/

  • 我现在走到了路的尽头,看不到解决办法。只是一些背景,我有一个。NET web应用程序,我也有一个自我托管的SignalR端应用程序,客户可以下载它来帮助我的网站与他们的桌面交互。当客户端安装此端应用程序时,它将接受一个自签名证书并安装到受信任的根证书颁发机构和个人证书存储区。 如果我只是忽略这一点并继续下去,它破坏了我的网站SSL,客户在URL栏中看到一个红色的“X”,这不会让他们在网站上感到舒服

  • 本文档提供使用 openssl 生成自签名证书的一个示例,用户也可以根据自己的需求生成符合要求的证书和密钥。 假设实例集群拓扑如下: Name Host IP Services node1 172.16.10.11 DM-master1 node2 172.16.10.12 DM-master2 node3 172.16.10.13 DM-master3 node4 172.16.10.14 DM