Java 詹金斯;找不到请求目标的有效证书路径;导入Git存储库时出错

Java 詹金斯;找不到请求目标的有效证书路径;导入Git存储库时出错,java,ssl,jenkins,Java,Ssl,Jenkins,我正试着用我笔记本电脑上的软件从詹金斯那里建立一个数据库。Git repo驻留在具有自签名证书的公司受信任服务器上。在指定URL时,我总是遇到一个错误: Failed to connect to repository : sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to

我正试着用我笔记本电脑上的软件从詹金斯那里建立一个数据库。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
我理解由于自签名证书而出现此错误,但服务器属于我的公司,并且由授权机构签名

我还尝试使用自签名从另一台笔记本电脑导入相同的回购协议,并不断收到相同的错误


如果您有任何帮助,我们将不胜感激。

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

听起来您试图连接到的服务器使用了由内部证书颁发机构签名的证书。这是典型的内部服务器。如果证书不是面向外部的,您就不想为它付费


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

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

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

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

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

$JAVA_HOME/jre/lib/security/cacerts
但是,您不想将其添加到JRE cacert密钥库中,因为它将被JRE覆盖/重写,因此最好为Jenkins复制此文件

  • $JAVA_HOME
    -这应该是当前JAVA主页所在的位置。如果只安装了Java运行时环境(JRE),则可以将
    $Java\u HOME/JRE
    替换为
    $JRE\u HOME

  • $ALIAS
    -这可以是任何值。将此证书与其他证书区分开来是一个值。例如“gitrepo”或“工件服务器”

  • $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
#进口证书
openssl s_客户端-showcerts-连接https://your-target-server\
/dev/null | openssl x509-outform PEM>~/root_ca.PEM
#复制Java密钥库文件并移动到Jenkins。。。
mkdir$JENKINS_主页/密钥库/
cp$JAVA_HOME/jre/lib/security/cacerts$JENKINS_HOME/keystore/
#将证书添加到密钥库
keytool-import-alias$alias-keystore$JENKINS\u HOME/keystore/cacerts-file~/root\u ca.pem
#将-Djavax.net.ssl.trustStore=$JENKINS_HOME/keystore/cacerts添加到
#詹金斯启动参数。对于Debian/Ubuntu,这是/etc/default/jenkins
echo'JAVA_ARGS=“$JAVA_ARGS-Djavax.net.ssl.trustStore=$JENKINS_HOME/keystore/cacerts”'\
>>/etc/default/jenkins
sudo服务重新启动
参考帮助:


从这个问题上,我的理解是,Jenkins安装在一个开发者盒上

如果安全性不是此框中的核心问题,您可以在Jenkins web UI中转到管理Jenkins管理插件>选项卡可用并搜索插件

不要在公开的服务器上执行此操作。因为这个问题与本地的盒子实验有关,所以我建议使用这个解决方案来让事情顺利进行


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

对于Windows上的Jeinkins

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


确切地说,我已经从安装了JDK 8u162(Java SE开发工具包8u162),我刚刚用JDK cacerts启动了jenkins.war作为解决方案 java-Djavax.net.ssl.trustStore=“/scratch/install/jdk1.8.0_102/jre/lib/security/cacerts”-jar jenkins.war&

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

您可以使用“keystoreexplorer”工具将根CA添加到Java cacerts。检查此项,了解将根CA添加到Java cacerts的步骤顺序:


成功将根CA添加到Java证书后,重新启动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
并选中“使用浏览器下载元数据”框


它将解决问题。

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


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

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

Jenkins与自己的JRE捆绑在一起,因此您可能正在使用它的
Let's_Encrypt_Authority_X3.pem
pkg_jenkins_io.pem
cat "Let's_Encrypt_Authority_X3.pem" pkg_jenkins_io.pem > full_chain.pem
openssl x509 -in full_chain.pem -out full_chain_sanitized.pem
-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
/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
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