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

时间:2014-07-03 21:39:38

标签: java ssl jenkins

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

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

我理解由于自签名证书导致此错误,但服务器属于我的公司并且由权限签名。

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

任何帮助将不胜感激

18 个答案:

答案 0 :(得分:27)

转到->管理Jenkins->配置全局安全性->插件管理器 并选中“使用浏览器进行元数据下载”框。

它将解决问题。

答案 1 :(得分:17)

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

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

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

$JAVA_HOME/jre/lib/security/cacerts

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

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

  • $ALIAS - 这可以是任何值。将此证书与其他证书区分开来是一种价值。例如“git-repo”或“artifact server”。

  • $JENKINS_HOME - 这是您Jenkins家的路径。经常/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

参考帮助:

答案 2 :(得分:9)

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

如果安全性不是此框中的核心问题,您可以在Jenkins Web UI中转到管理Jenkins &gt; 管理插件&gt;标签可用并搜索"skip-certificate-check"插件。

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

答案 3 :(得分:4)

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

将“更新站点”更改为使用http而不是https。这解决了我的问题。enter image description here

答案 4 :(得分:3)

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

听起来您尝试连接的服务器使用由内部证书颁发机构签名的证书。这对于内部服务器来说是典型的。如果证书不是面向外部的,你不会想要支付证书。

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

答案 5 :(得分:3)

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

我将在下面列出自己的指南,该指南适用于Linux。我怀疑与Windows绑定的keytool一样,在Windows中也可以使用相同的导入,但是在涉及任何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

您现在应该有2个文件:

Let's_Encrypt_Authority_X3.pem
pkg_jenkins_io.pem

串联2个文件:

cat "Let's_Encrypt_Authority_X3.pem" pkg_jenkins_io.pem > full_chain.pem

下一步非常有用,因为Java键盘工具很挑剔,并且openssl软件包将解决所有间距问题。我已经看到keytool导入失败,即使openssl声称它是有效的,也不要跳过此步骤:

openssl x509 -in full_chain.pem -out full_chain_sanitized.pem

现在是有趣的部分。我假设您的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

还请注意,您可能未使用自定义密钥库。在这种情况下,您可以尝试将证书包括在默认的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

重新启动您的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

https://stackoverflow.com/a/47316409/7569335的答案很好,但是不能解决我遇到的自定义密钥库文件问题。对其进行检查并获得良好的信息。

答案 6 :(得分:1)

这是Java版本-系统Java和Jenkins Java版本之间存在Jenkins认证问题。

更改Jenkins引用的Java路径。

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

  2. 您将找到标签%BASE%\jre\bin\java。将标记替换为系统安装的java路径,例如C:\Program Files (x86)\Java\jre1.8.0_144\bin\java

现在您不应该遇到问题。

Example

答案 7 :(得分:0)

对于Jenkins的较新版本 转到Jenkins->管理Jenkins->配置全局安全性,选中选项使用浏览器进行元数据下载 [默认情况下未选中],然后重新启动Jenkins

答案 8 :(得分:0)

开发机器:

  1. 更新到最新版本的 JAVA。
  2. 安装 Jenkins(确保您指向正确的 JAVA 版本)。
  3. 通过查看文件确保 Jenkins 使用最新版本:C:\Program Files\Jenkins\jenkins.xml:
    • 例如:C:\Program Files (x86)\Java\jre1.8.0_281\bin\java.exe
  4. 下载证书:
    • 转到 Jenkins -> 管理 Jenkins -> 管理插件 -> 高级:
      • 从“更新站点”复制 URL 并粘贴到浏览器上:
        • 单击 URL 左侧的图标,然后单击证书。
          • 转到详细信息并下载证书。
  5. 进口证书:
    • 打开 Java 控制面板:
      • 转到“安全”->“管理证书”并导入证书。
  6. 重启 Jenkins。
  7. 测试连接
    • 转到 Jenkins -> 管理 Jenkins -> 管理插件 -> 高级并单击“立即检查”以测试连接。

答案 9 :(得分:0)

wget updates.jenkins.io/download/plugins/skip-certificate-check/1.0/... 到 $JENKINS_HOME/plugins 并重新启动服务器,插件更新再次开始工作

答案 10 :(得分:0)

我开始收到以下错误消息:SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target完全没有实现,可追溯到2020年8月,我的两台Jenkins构建服务器运行在Windows服务器上。它阻止了Jenkins核心和所有插件的更新。

在这里从其他人那里获得一些线索后,我决定安装最新版本的JRE(在我的情况下为v1.8.0_261),希望可以更新cacert。安装最新的JRE在这里创建了一个新文件夹:C:\Program Files (x86)\Java\jre1.8.0_261

Jenkins指向一个文件夹:C:\Program Files (x86)\Jenkins\jre。首先,我停止了詹金斯服务。第二,我备份然后删除该C:\Program Files (x86)\Jenkins\jre文件夹,并将C:\Program Files (x86)\Java\jre1.8.0_261复制到C:\Program Files (x86)\Jenkins\jre

这可能不是最佳做法,但它解决了我的错误。

答案 11 :(得分:0)

我能够通过将JVM更新到较新版本来解决此问题。看来新版本的JVM信任了必要的CA证书,以允许下载新的詹金斯大战。

答案 12 :(得分:0)

转到C:\ Program Files \ Java \ jdk1.8.0_45 \ jre \ lib \ security

cmd C:\ Program Files \ Java \ jdk1.8.0_45 \ jre \ lib \ security

在给java -jar jenkins.war之后,它将解决证书问题

答案 13 :(得分:0)

将从浏览器下载的根CA(GlobalSign.cer)添加到JAVA_HOME / jre / lib / security / cacerts。

您可以使用&#34; Keystore explorer&#34;将根CA添加到Java cacerts的工具。检查此link以获取将根CA添加到Java cacerts的步骤序列:

将Root CA成功添加到Java证书后,重新启动Jenkins。

答案 14 :(得分:0)

我刚刚用jdk cacerts推出jenkins.war作为解决方法 java -Djavax.net.ssl.trustStore =&#34; /scratch/install/jdk1.8.0_102/jre/lib/security/cacerts" -jar jenkins.war&amp;

答案 15 :(得分:0)

Windows

上的Jeinkins

在我的电脑上安装独立的Java版本后,上述错误消失了。

确切地说,我已经从Java SE Development Kit 8 Downloads安装了JDK 8u162(Java SE Development Kit 8u162)

答案 16 :(得分:0)

虽然上述答案通常是正确的,但也可能是由于链中的证书过期(服务器证书,中间,根)。刚收到相同的错误,我的服务器证书已过期。

答案 17 :(得分:-1)

管理Jenkins>管理插件>单击“高级”选项卡>向下滚动到“更新站点”

enter image description here

将URL更新为:http://updates.jenkins-ci.org/update-center.json