我正在尝试使用我的笔记本电脑上的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 - >配置全局安全 - >插件管理器,然后选中使用浏览器进行元数据下载的复选框.
它将解决问题.
RUD*_*ULU 24
Jenkins 与它自己的 JRE 捆绑在一起,因此您可能使用的是非常旧的 JRE,因此是旧的信任证书。更新如下
转到您的 Jenkins 主文件夹并打开 jenkins.xml 文件: %Jenkins_Home%/jenkins.xml
你会发现<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>.
现在您应该没有问题,因为它会获取较新的信任证书
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)
参考帮助:
Sai*_*ish 12
从这个问题来看,我的理解是这个Jenkins安装在一个开发人员盒子上.
如果安全性不是此框中的核心问题,您可以在Jenkins Web UI中转到Manage Jenkins > Manage Plugins >选项卡Available并搜索"skip-certificate-check"插件.
安装时,应该修复问题.请谨慎使用此插件,因为从安全角度不建议使用此插件.
小智 10
管理Jenkins->管理插件->插件管理器->高级
更改“更新站点”以使用http而不是https。这解决了我的问题。
我刚刚使用 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)
Java 附带了受信任的根证书颁发机构的默认列表。如果它找不到返回到这些受信任的证书颁发机构之一的路径,它将不会信任该证书。
听起来您尝试连接的服务器使用由内部证书颁发机构签名的证书。这是内部服务器的典型情况。如果证书不是面向外部的,您就不会愿意支付费用。
您可以使用 keytool 命令将公司的根证书颁发机构添加到 java。然后您将能够与此根证书签名的任何证书建立 ssl 连接。
正确的解决方案是不要像很多人建议的那样禁用证书检查,而是将网站证书添加到 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/答案很好,但它没有考虑我遇到的自定义密钥库文件场景。检查一下,它有很好的信息。
| 归档时间: |
|
| 查看次数: |
53940 次 |
| 最近记录: |