jenkins pluginManager'立即检查''无法找到有效的认证'错误

时间:2017-09-06 07:49:08

标签: jenkins ssh sslhandshakeexception pkix

我刚刚在我的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离线”消息很可能与“无法找到要求目标的有效证书路径”有关。

this post似乎存在类似的问题。

4 个答案:

答案 0 :(得分:8)

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

Jenkins UC使用来自Let's Encrypt的SSL证书,但允许加密证书所依赖的根证书在update 101之前未添加到Java 8中。

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

答案 1 :(得分:7)

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

skip-security-check插件

首先,您可以安装我认为与Jenkins一起打包的skip-security-check plugin,因此您无需联系下载它。

只需使用http

第二个也是最简单的方法是转到管理控制台中的Jenkins下载管理器页面并更新URL,使前导码为http而不是http s

<强> Just go back to http

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

Fix SunCertPathBuilderException in Jenkins

答案 2 :(得分:1)

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

串联2个文件:

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的答案很好,但是不能解决我遇到的自定义密钥库文件问题。对其进行检查并获得良好的信息。

答案 3 :(得分:0)

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

最后启动詹金斯服务