【问题标题】:jenkins pluginManager 'Check Now' 'unable to find valid certification' errorjenkins pluginManager 'Check Now' '无法找到有效的证书' 错误
【发布时间】:2018-02-14 14:42:48
【问题描述】:

我刚刚在我的 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)

根据this post,我认为我需要进行某种密钥或 ssh 配置,但我不清楚所有要使用的变量,因为它们适用于此特定错误。

我该如何解决这个问题?

2017-09-11 更新:

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

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

我不确定这意味着什么,因为我可以连接到互联网。无论出于何种原因,我都收集到了 Jenkins 无法收集的信息。

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

this post似乎也有类似的问题。

【问题讨论】:

    标签: jenkins ssh sslhandshakeexception pkix


    【解决方案1】:

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

    Jenkins UC 使用来自 Let's Encrypt 的 SSL 证书,但 Let's Encrypt 证书所依赖的根证书直到 update 101 才添加到 Java 8。

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

    【讨论】:

    • 我更新了 Java 但没有运气。更多详细信息在我的 OP 更新中。您如何看待设置中的离线消息,您认为它是否相关?
    • @kraftydevil 是的,如果您在设置向导中遇到同样的证书问题,它会告诉您 Jenkins 处于离线状态。如果您确定 Jenkins 运行的是最新版本的 Java 8,则需要查看 Jenkins 日志并提交问题:jenkins.io/redirect/report-an-issue
    【解决方案2】:

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

    跳过安全检查插件

    首先,您可以安装skip-security-check plugin,我相信它是与 Jenkins 一起打包的,因此您无需伸手去下载它。

    只需使用 http

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

    我写了一篇关于该主题的快速文章,但要注意的是,您可以简单地将 url 改回 http://

    Fix SunCertPathBuilderException in Jenkins

    【讨论】:

    • 这不是一个好的答案。很抱歉不得不投反对票,但不能将禁用安全性视为解决方案。
    • 保护资源时,必须有理由保护它。仅仅为了保护一切而保护一切是没有意义的。在更新 Jenkins 插件时,我想不出任何基于 http 的安全漏洞,我也不知道在更新期间通过网络发送的任何安全数据。因此,我断言没有合理的理由来保护没有理由保护的连接。
    • 好吧,如果这是真的,那么他们一开始就不会使用 HTTPS。我的意思是我很清楚很多网站可能在没有 HTTPS 的情况下工作,但现实是没有理由在 2020 年不使用 TLS,大部分工作都由 Let's encrypt 自动化。我并不是说禁用 HTTPS 不会解决 OP 的问题,但这不是解决方案,而是一种解决方法,应该这样对待。
    【解决方案3】:

    正确的解决方案是不要像很多人建议的那样禁用证书检查,而是将网站证书添加到 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 的答案很好,但它没有考虑到我面临的自定义密钥库文件场景。看看它,它有很好的信息。

    【讨论】:

      【解决方案4】:

      我最近遇到的这个问题,在 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 服务

      然后编辑jenkins.xml,注释掉默认的java路径,输入新的:

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

      最后启动jenkins服务

      【讨论】:

      • 查找 java 路径的命令对我不起作用,但指定 java 可执行文件的完整路径可以。谢谢
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2016-02-13
        • 2012-06-20
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多