导入Git存储库时,Jenkins"无法找到请求目标的有效证书路径"错误

use*_*245 18 java ssl jenkins

我正在尝试使用我的笔记本电脑上的Jenkins Git插件从Jenkins 构建一个Git repo.Git repo驻留在具有自签名证书的公司可信服务器上.在指定URL时我总是收到错误:

Failed to connect to repository : sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)

我理解这个错误表面由于自签名证书,但服务器属于我的公司,并由权威签署.

我还尝试使用自签名从另一台笔记本电脑导入相同的repo并继续得到相同的错误.

任何帮助将不胜感激

小智 35

转到 - >管理Jenkins - >配置全局安全 - >插件管理器,然后选中使用浏览器进行元数据下载的复选框.

它将解决问题.

  • 这不再是一个有效的解决方案。 (16认同)
  • 有没有办法让这个复选框出现?我什至看不到“配置全局安全”中的“插件管理器”部分 (11认同)
  • 由于安全问题和弃用,已在此处删除 https://github.com/jenkinsci/jenkins/pull/3970。 (7认同)

RUD*_*ULU 24

Jenkins 与它自己的 JRE 捆绑在一起,因此您可能使用的是非常旧的 JRE,因此是旧的信任证书。更新如下

  1. 转到您的 Jenkins 主文件夹并打开 jenkins.xml 文件: %Jenkins_Home%/jenkins.xml

  2. 你会发现<executable>%BASE%\jre\bin\java</executable>。这可能真的很旧/过时了,因此将其替换为系统安装的 java 运行时之类的<executable>%JAVA_HOME%\jre\bin\java</executable>或特定版本的<executable>C:\Program Files (x86)\Java\jre1.8.0_144\bin\java</executable>.

现在您应该没有问题,因为它会获取较新的信任证书

例子

  • 就是这个!Jenkins 中的 Java 已经 5 岁了!:哦 (2认同)
  • 这不起作用,该设置在我的部署(docker 容器/Linux)上不存在。另请注意,此解决方案似乎适用于 Windows 部署。 (2认同)

Hig*_*ife 21

该错误是Java虚拟机报告的常见错误消息.当Java环境没有关于HTTPS服务器的信息以验证它是否是有效网站时,会导致此问题.有时,证书由内部根CA提供,或者是自签名证书.这有时会使JVM混淆,因为它不是Java"可信"列表中可以提供这些证书的JVM之一.

因为我们知道certififcate是"有效的",所以我们可以将此证书直接导入JVM.在这样做时,我们告诉JVM这是一个"可信"的证书,并"忽略"它的任何问题.

您需要将证书添加到Java证书颁发机构文件中.对于Debian/Ubuntu Linux机器,通常位于:

$JAVA_HOME/jre/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)

但是,您不希望将其添加到JRE cacert密钥库,因为它将被JRE覆盖/重写,因此最好为Jenkins复制此文件.

  • $JAVA_HOME - 这应该是当前java主目录所在的位置.如果您只安装了Java Runtime Environment(JRE),那么可以替换$JAVA_HOME/jre为$JRE_HOME.

  • $ALIAS - 这可以是任何价值.将此证书与其他证书区分开来是一种价值.示例将是"git-repo"或"工件服务器".

  • $JENKINS_HOME - 这是你詹金斯家的路.经常/var/lib/jenkins.

您可以使用以下命令将证书导入JVM cacerts文件. - 在你的詹金斯大师.获取证书,复制Jenkins的JVM密钥库,将证书导入密钥库,将可信密钥库添加到Jenkins启动参数并重新启动Jenkins.

# Import certificate
openssl s_client -showcerts -connect https://your-target-server\
< /dev/null 2> /dev/null | openssl x509 -outform PEM > ~/root_ca.pem

# Duplicate Java Keystore file and move into Jenkins...
mkdir $JENKINS_HOME/keystore/
cp $JAVA_HOME/jre/lib/security/cacerts $JENKINS_HOME/keystore/

# Add Certificate to Keystore
keytool -import -alias $ALIAS -keystore $JENKINS_HOME/keystore/cacerts -file ~/root_ca.pem

# Add -Djavax.net.ssl.trustStore=$JENKINS_HOME/keystore/cacerts to the
# Jenkins startup parameters. For Debian/Ubuntu, this is /etc/default/jenkins
echo 'JAVA_ARGS="$JAVA_ARGS -Djavax.net.ssl.trustStore=$JENKINS_HOME/keystore/cacerts"'\
>> /etc/default/jenkins

sudo service jenkins restart
Run Code Online (Sandbox Code Playgroud)

参考帮助:

  • 这是正确的解决方案。我不得不用 `updates.jenkins.io:443` 和 `jenkins.io:443` 替换 `https://your-target-server`(没有 `https://`)。不要在管道 `|` 之后使用命令的第二部分,因为一个 url 有两个证书(手动编辑)。对每个重复“keytool”部分。 (7认同)
  • ``cacert`` 的默认密码是“changeit” (6认同)
  • 不,对我来说没有什么好处,第一个命令抛出异常`1995423744:错误:20087002:BIO例程:BIO_lookup:系统lib:../crypto/bio/b_add rc:694:ai_socktype connect不支持Servname:errno = 0` (3认同)

Sai*_*ish 12

从这个问题来看,我的理解是这个Jenkins安装在一个开发人员盒子上.

如果安全性不是此框中的核心问题,您可以在Jenkins Web UI中转到Manage Jenkins > Manage Plugins >选项卡Available并搜索"skip-certificate-check"插件.

安装时,应该修复问题.请谨慎使用此插件,因为从安全角度不建议使用此插件.

  • 如果在安装插件时出现上述错误,则尝试安装它,这有点死胡同。 (6认同)
  • 谢谢!我尝试将更新站点更改为 http,如[此处所述](/sf/answers/3794660971/),但它至少在 Jenkins 2.235.5(2020 年 9 月)上不起作用。但是安装“skip-certificate-check”有效!当然,它没有使用 Jenkins 插件管理器安装,所以我将 https://updates.jenkins.io/download/plugins/skip-certificate-check/1.0/skip-certificate-check.hpi 获取到 `$JENKINS_HOME/插件并重新启动服务器,插件更新再次开始工作。 (3认同)
  • 安装跳过证书检查对我不起作用 (3认同)

小智 10

管理Jenkins->管理插件->插件管理器->高级

更改“更新站点”以使用http而不是https。这解决了我的问题。在此处输入图片说明

  • 截至 2020 年 8 月,这对我不再起作用。Jenkins 最初联系 HTTP 站点,但尝试通过 HTTPS 下载包。 (16认同)
  • 该解决方案有效,但它损害了 HTTPS Web 安全性的全部意义。 (7认同)
  • 这是一个非常聪明的解决方案。奇迹般有效 (2认同)
  • 这并不是真正的解决方案,更多的是一种黑客攻击。 (2认同)

Ste*_*lla 8

我刚刚使用 JDK cacerts 启动了 jenkins.war 作为解决方法

java -Djavax.net.ssl.trustStore="/scratch/install/jdk1.8.0_102/jre/lib/security/cacerts" -jar jenkins.war &
Run Code Online (Sandbox Code Playgroud)


Mat*_*ngs 6

Java 附带了受信任的根证书颁发机构的默认列表。如果它找不到返回到这些受信任的证书颁发机构之一的路径,它将不会信任该证书。

听起来您尝试连接的服务器使用由内部证书颁发机构签名的证书。这是内部服务器的典型情况。如果证书不是面向外部的,您就不会愿意支付费用。

您可以使用 keytool 命令将公司的根证书颁发机构添加到 java。然后您将能够与此根证书签名的任何证书建立 ssl 连接。


Ser*_*zar 5

正确的解决方案是不要像很多人建议的那样禁用证书检查,而是将网站证书添加到 Java 密钥库中。

我将在下面列出我自己的指南,该指南适用于 Linux。我怀疑相同的导入在 Windows 中也能工作,因为 keytool 与 Java 捆绑在一起,但当涉及到任何 openssl 命令时,你就得靠自己了。

下载链中所有必需的证书(这是我在 SO 上找到的命令,我找不到链接,但它不是我自己创建的):

openssl s_client -showcerts -verify 5 -connect updates.jenkins-ci.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
Run Code Online (Sandbox Code Playgroud)

您现在应该有 2 个文件:

Let's_Encrypt_Authority_X3.pem
pkg_jenkins_io.pem
Run Code Online (Sandbox Code Playgroud)

连接 2 个文件:

cat "Let's_Encrypt_Authority_X3.pem" pkg_jenkins_io.pem > full_chain.pem
Run Code Online (Sandbox Code Playgroud)

下一步很有用,因为 Java keytool 很挑剔,而 openssl 包将修复任何间距问题。我已经看到 keytool 导入失败,即使 openssl 声称它是有效的,所以不要跳过此步骤:

openssl x509 -in full_chain.pem -out full_chain_sanitized.pem
Run Code Online (Sandbox Code Playgroud)

有趣的来了。我假设您的 Jenkins 实例正在使用以下一些参数运行:

-Djavax.net.ssl.keyStore=/applications/configuration/pki/keystore.jks 
-Djavax.net.ssl.keyStorePassword=GOOD_PASSWORD 
-Djavax.net.ssl.trustStore=/applications/configuration/pki/truststore.jks 
-Djavax.net.ssl.trustStorePassword=GOOD_PASSWORD
Run Code Online (Sandbox Code Playgroud)

另请注意,您可能没有使用自定义密钥库。在这种情况下,您可以尝试将证书包含在默认的 cacerts 文件中。请查看下一节了解详细信息。如果您使用任何信任库,您将配置一个密码,因此在出现提示时输入该密码。

现在我们可以导入 Jenkins 插件站点证书。确保使用您自己的 keytool 路径,因为它与我的不同。

/applications/java/latest/bin/keytool -trustcacerts  -import -v -alias pkg_jenkins_io_full_chain -file correct.pem -keystore /applications/configuration/pki/keystore.jks

/applications/java/latest/bin/keytool -trustcacerts  -import -v -alias pkg_jenkins_io_full_chain -file correct.pem -keystore /applications/configuration/pki/truststore.jks
Run Code Online (Sandbox Code Playgroud)

重新启动 Jenkins 服务器,插件站点应该可以工作。如果没有(或者如果您一开始就没有使用自定义密钥库),您可以尝试将证书添加到 Java cacerts 文件中,但这通常会令人不悦,因为它会在任何更新期间被替换。更好的选择可能是创建备份,将证书包含在副本中,并使用该副本作为信任库来运行 Jenkins。

请记住,cacerts 存储的默认密码是“changeit”

cp /apps/java/latest/jre/lib/security/cacerts /apps/java/latest/jre/lib/security/cacerts_copy

# Add the certificate to the keystore
/applications/java/latest/bin/keytool -trustcacerts -import -v -alias pkg_jenkins_io_full_chain -file correct.pem -keystore /apps/java/latest/jre/lib/security/cacerts_copy

# Add -Djavax.net.ssl.trustStore= property to the Jenkins startup parameters, depending on your own OS.
# Just make sure to append it as such:
-Djavax.net.ssl.trustStore=/apps/java/latest/jre/lib/security/cacerts_copy
Run Code Online (Sandbox Code Playgroud)

/sf/answers/3312148661/答案很好,但它没有考虑我遇到的自定义密钥库文件场景。检查一下,它有很好的信息。