4

我刚刚在我的 Windows 机器上安装了一个新的 jenkins 2.77 实例,运行 Java 1.8.0 #60。

我原以为会有一些默认插件,但在创建实例时似乎没有安装任何插件。

当我去检查可用的插件选项卡时,它显示:

Update information obtained: N/A ago

当我单击“立即检查”按钮时,出现以下堆栈跟踪错误:

堆栈跟踪:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
Caused: javax.net.ssl.SSLHandshakeException
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at hudson.model.DownloadService.loadJSON(DownloadService.java:167)
    at hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:190)
    at hudson.PluginManager.doCheckUpdatesServer(PluginManager.java:1629)
    at java.lang.invoke.MethodHandle.invokeWithArguments(Unknown Source)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:52)
    at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
    at org.kohsuke.stapler.MetaClass$2.doDispatch(MetaClass.java:186)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:135)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:138)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:80)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
    at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:92)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
    at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:564)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

根据这篇文章,我收集到我需要进行某种密钥或 ssh 配置,但我不清楚要使用的所有变量,因为它们适用于此特定错误。

我该如何解决这个问题?

2017 年 9 月 11 日更新:

  • 我卸载了 Java,然后安装了最新的 Java,1.8.0 #44。
  • 我卸载了 Jenkins 并删除了 Program Files 中的文件夹。
  • 我安装了詹金斯 2.77

这次在设置向导中,我注意到一个页面通知我 Jenkins 离线。

我不确定这意味着什么,因为我可以连接到互联网。无论出于何种原因,我都认为詹金斯不能。

我现在非常确定,当我最初安装 Jenkins 时,我看到了这个页面并选择跳过插件安装。“Jenkins 离线”消息很可能与“无法找到请求目标的有效证书路径”有关。

这篇文章中似乎有类似的问题。

4

5 回答 5

11

Jenkins 2.77将更新中心 (UC) 的默认 URL更改为使用https://而不是http://.

Jenkins UC 使用 Let's Encrypt 的 SSL 证书但 Let's Encrypt 证书所依赖的根证书直到更新 101才添加到 Java 8中。

将您的 Java 安装从 8u60 升级到至少 8u101,它应该可以按预期工作。

于 2017-09-09T00:31:53.250 回答
8

我在 Jenkins 安装时间歇性地遇到这个问题。我发现了两种简单的方法,可以避免整天摆弄安全证书。

跳过安全检查插件

首先,您可以安装我认为与 Jenkins 一起打包的skip-security-check 插件,因此您无需伸手去下载它。

只需使用http

第二个也是最简单的方法是转到管理控制台中的 Jenkins 下载管理器页面并更新 URL,以便序言是 http 而不是 http s

只是回到http

我写了一篇关于这个主题的快速文章,但是你可以简单地将 url 改回 http://

修复 Jenkins 中的 SunCertPathBuilderException

于 2018-05-28T15:24:23.797 回答
1

正确的解决方案是不要像很多人建议的那样禁用证书检查,而是将网站证书添加到 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

您现在应该有 2 个文件:

Let's_Encrypt_Authority_X3.pem
pkg_origin_jenkins_io.pem

连接两个文件:

cat "Let's_Encrypt_Authority_X3.pem" pkg_origin_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 full_chain_sanitized.pem -keystore /applications/configuration/pki/keystore.jks

/applications/java/latest/bin/keytool -trustcacerts  -import -v -alias pkg_jenkins_io_full_chain -file full_chain_sanitized.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 full_chain_sanitized.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的答案很好,但它没有考虑到我面临的自定义密钥库文件场景。检查一下,它有很好的信息。

于 2020-07-03T13:02:38.500 回答
1

我最近遇到的这个问题,在 Windows 机器上运行 Jenkins 的解决方案是更改 jenkins.xml 配置文件中的 Java 路径 - 位于默认路径 C:\Program Files (x86)\Jenkins\

首先在Windows机器上找到Java的位置。在管理员命令提示符下运行这个

for %i in (java.exe) do @echo.   %~$PATH:i

在有问题的 Windows 2012 R2 服务器上,它返回:C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe

然后在 services.msc 中停止 jenkins 服务

然后通过注释默认 java 路径并输入新路径来编辑 jenkins.xml:

<!--executable>%BASE%\jre\bin\java</executable>-->
<executable>C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe</executable>

最后启动jenkins服务

于 2020-09-15T16:39:24.657 回答
0

就我而言,解决方案是简单地禁用我的 avast antivirus,但显然,这与防火墙阻止某些访问有关。

于 2021-12-09T04:09:51.263 回答